扩展欧几里得

假设 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)的倍数,一定无解。
这里写图片描述
“`

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值