扩展欧几里得定理
(开头日常唠叨)扩展欧几里得定理它好像只是被板子就行,但你要是自己推一遍的话肯定印象更深刻啊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}\rfloor \\ bx′+(a-\lfloor \frac {a}{b}\rfloor)y′ = gcd(a,b) \\ ay'+b(x'-\lfloor \frac{a}{b} \rfloor*y')=gcd(a,b) \]
又因为原方程
\[ ax+by=gcd(a,b) \]
所以$x=y' \(并且\)y=x'-\lfloor \frac{a}{b} \rfloor*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