假设 ax1 + by1= gcd(a,b);
假设 bx2 + (a % b)y2= gcd(b,a % b);
根据朴素的欧几里德原理有gcd(a,b) = gcd(b,a % b);
则:ax1 + by1 = bx2+ (a % b)y2;
即:ax1 + by1 = bx2 + (a - [a / b] * b)y2 = ay2 + bx2 - [a / b] * by2;
也就是ax1 + by1 == ay2+ b(x2 - [a / b] *y2);
根据恒等定理得:x1 = y2; y1 = x2 - [a / b] * y2;
这样我们就得到了求解 x1,y1 的方法:x1,y1 的值基于 x2,y2。我们可以通过不断递归调用求解。
void exgcd(int a, int b, int &d, int &x, int &y)
{
if (!b) { d = a; x = 1; y = 0; }
else { exgcd(b, a % b, d, y, x); y -= (a / b) * x; }
}
我们这样只能得出一组解,其他解呢?
如果我们现在有解(x1,y1),任取另外一组解(x2,y2),则有
ax1 + by1 = ax2 + by2 = gcd(a, b)
变形可以得到a(x1 – x2) = b(y2 – y1)
两边同时除以gcd(a, b)
得到a’(x1 – x2) = b’(y2 – y1)
因为(a’,b’)=1,所以(x1-x2)一定是b’的倍数
取x1-x2=kb’,得y2-y1=ka’
所以我们有以下结论:
对方程ax+by+c=0,一组整数解为(x0,y0),则它的任意整数解可以写成(x0+kb’,y0-ka’),其中a’=a/gcd(a, b),b’=b/gcd(a, b)
关于ax+by=c有没有解,我们有这么一个结论:
对于方程ax+by=c(a,b,c均为整数),如果c为gcd(a,b)的倍数,则方程有整数解,反之无整数解。
证明:因为a和b都是gcd(a,b)的倍数,所以ax+by一定也是gcd(a,b)的倍数,如果c不是gcd(a,b)的倍数,一定无解。
“`