您的位置:首页 > 其它

扩展欧几里得

2016-09-06 20:40 127 查看
假设 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)的倍数,一定无解。



“`
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: