扩展欧几里得定理
(开头日常唠叨)扩展欧几里得定理它好像只是被板子就行,但你要是自己推一遍的话肯定印象更深刻啊qwq
我们已知(ax + by = gcd(a, b)) 求x, y的值
考虑当b =0的时候(gcd(a,b))= a,此时y = 0,x = 1;
我们在朴素的欧几里得定理中
int gcd(int a,int b){
return b==0?a:gcd(b,a%b);
}
最终的状态中b同样也等于0,我们猜想可以借助欧几里得定理求解上述的二元一次方程
假设(bx′ +(a mod b)y′ = gcd(a, b))有解,求原方程的解
我们可以对式子进行化解
[a mod b=a-lfloor frac {a}{b}
floor
\
bx′+(a-lfloor frac {a}{b}
floor)y′ = gcd(a,b)
\
ay'+b(x'-lfloor frac{a}{b}
floor*y')=gcd(a,b)
]
又因为原方程
[ax+by=gcd(a,b)
]
所以$x=y' (并且)y=x'-lfloor frac{a}{b} floor*y'$
所以我们可以在每次递归过程求解gcd中求解出满足方程的x,y
算是一些小推论?
1.在a和b互质的情况下
ax+by=1一定存在一组解,并且x是a的逆元
2.对于c是gcd(a,b)的倍数,ax+by=c也一定有解
Code
特别提醒一点啊qwq
如果x和y并不是全局变量需要写成gcd(ll a,ll b,&x,&y);
因为每一次x和y的值都要记录返回到上一状态里
void gcd(ll a,ll b){
if(b==0){x=1;y=0;return;}
gcd(b,a%b);
ll temp=x;
x=y;y=temp-a/b*y;
}
嗯,没了没了没了别看了qwq