题外语:大后天就是复赛了,不负光阴,加油!
扩展欧几里德是一项较为基础的数论专项
定义:一个ax+by=gcd(a,b)ax+by=gcd(a,b)ax+by=gcd(a,b)的式子,a,ba,ba,b为给定的值,求x,yx,yx,y的解
首先,这个式子满足:解一定存在。
回忆我们知道的欧几里德算法,是把gcd(a,b)gcd(a,b)gcd(a,b)转化求解为gcd(b,amod b)gcd(b,a\mod b)gcd(b,amodb),类比一下,看看扩展欧几里德可不可以运用到这种方法呢?
当然可以。不然为什么叫扩展,数学同题不同问间都有关系
假设我们已经求解出了x1,y1x_1,y_1x1,y1的值,且bx1+(amod b)y1=gcd(a,b)bx_1+(a\mod b)y_1=gcd(a,b)bx1+(amodb)y1=gcd(a,b)
因为amod b==a−(a/b)∗ba\mod b==a-(a / b)*bamodb==a−(a/b)∗b
所以等量代换 bx1+[a−(a/b)∗b]y1=gcd(a,b)bx_1+[a-(a / b)*b]y_1=gcd(a,b)bx1+[a−(a/b)∗b]y1=gcd(a,b)
拆个括号,bx1+ay1−(a/b)∗by1=gcd(a,b)bx_1+ay_1-(a/b)*by_1=gcd(a,b)bx1+ay1−(a/b)∗by1=gcd(a,b)
转换: ay1+b[x1−(a/b)y1]=gcd(a,b)ay_1+b[x1-(a/b)y1]=gcd(a,b)ay1+b[x1−(a/b)y1]=gcd(a,b)
总觉得有点儿熟悉啊…
ax+by=gcd(a,b)ax+by=gcd(a,b)ax+by=gcd(a,b)
ay1+b[x1−(a/b)y1]=gcd(a,b)ay_1+b[x1-(a/b)y1]=gcd(a,b)ay1+b[x1−(a/b)y1]=gcd(a,b)
一模一样
所以x=y1,y=x1−(a/b)y1.x=y1,y=x1-(a/b)y1.x=y1,y=x1−(a/b)y1.
递推式就出来了——
1.xn=yn+1,yn=xn+1−(a/b)yn+1x_n=y_n+1,y_n=x_{n+1}-(a/b)y_{n+1}xn=yn+1,yn=xn+1−(a/b)yn+1
2.当 bbb 为 000 时,returnreturnreturn aaa因为此时的aaa就是gcdgcdgcd
也就是说,欧几里得算法中gcdgcdgcd部分结束时变量a中存放的是gcd,变量b中存放的是0,因此此时显然有a×1+b×0=gcda\times 1+b\times 0=gcda×1+b×0=gcd成立,此时有x=1,y=0x=1,y=0x=1,y=0成立。
update:2022/03/05:20:43
至于通解:
x=x0+lcm(a,b)a,x=x_0+ \frac{lcm(a,b)}{a},x=x0+alcm(a,b),
y=y0−lcm(a,b)by=y_0- \frac{lcm(a,b)}{b}y=y0−blcm(a,b)
和
x=[(x0mod bgcd(a,b))+bgcd(a,b)]mod bgcd(a,b)x=[(x_0 \mod \frac{b}{gcd(a,b)})+\frac{b}{gcd(a,b)}] \mod \frac{b}{gcd(a,b)}x=[(x0modgcd(a,b)b)+gcd(a,b)b]modgcd(a,b)b
.............还是自己再推推吧..........................还是自己再推推吧..........................还是自己再推推吧.............
核心代码如下:
int exgcd(int a, int b, int &x, int &y) {
if(b == 0) {
x = 1;
y = 0;
return a;
}
int r = exgcd(b, a % b, x, y);
int t = x;
x = y;
y = t - a / b * y;
return r;
}
2021.11.07:Ps:PJ-301一等,TG-55二等

3963

被折叠的 条评论
为什么被折叠?



