若d | a && d | b
则d | (a * x + b * y)
且可证d是a * x + b * y ,a,b的线形组合中最小正整数(a,b,d,x,y均整数)
d = gcd(a,b) = a * x + b * y 即d也是a,b的一个线形组合
即,可求,a * x + b * y = d = gcd( a , b )的整数解(x0,y0)。
扩展欧几里德求出的x,y只是一组解,x,y 的通解为 x = x0 * c + b * k, y = y0 * c - a *k a * x + b * y = p = c * d = c * gcd(a,b)通解如上
//已知x2,y2
//a2 = b1
//b2 = a1 % b1
//x1 = y2;
//y1 = x2 - a1 / b1 * y2
#include <iostream>
using namespacestd;
int ectgcd(int a,int b,int& x,int& y)
{
int d = a,t;
if (b ==0) {
x = 1;
y = 0;
}
else {
d = ectgcd(b, a % b,x,y);
t = x;
x = y;
y = t - a / b * y;
cout << x <<" " << y <<endl;
// cout << x <<" * " << a <<" + "<< y << " * " << b <<" = " << d<<endl;
}
return d;
}
int main()
{
int a,b,x,y;
a = 99,b =78;
cout <<ectgcd(a, b,x,y) <<endl;
return0;
}