【总结】扩展欧几里得算法

扩展欧几里得定理

(开头日常唠叨)扩展欧几里得定理它好像只是被板子就行,但你要是自己推一遍的话肯定印象更深刻啊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

猜你喜欢

转载自www.cnblogs.com/huixinxinw/p/12207417.html