用一个线性组合来表示最大公约数, 即d=gcd(a, b)=ax+by, 要求计算出满足等式的整数x, y;要解决这个问题,就要用到扩展欧几里得算法了。
(1)若b=0的话, d= gcd(a, b) =a, 此时x=1, y=0;
(2)若b!=0的话, 可令d1=gcd(b, a%b) , 则存在x' 和 y',使得d1=bx'+( a%b )y'。
由欧几里得公式可得到:d=d1;
所以 d1=bx'+( a%b )y'=bx'+( a - a/b*b)y'=ay'+b(x' - a/b*y')=ax+by
所以 x=y', y=x' - a/b y' ;
代码:
void extended_euclid(int a, int b, int &x, int &y) { int temp; if( b==0 ) { x=1;y=0; return; } else { extended_euclid(b, a%b, x, y); //!x=y', y=x' - a/b y' temp=x; x=y; y=temp-a/b*y; } }