算法笔记——拓展欧几里得定理

ax1+by1=gcd(a,b)ax_1+by_1=gcd(a,b)

bx2+(amodb)y2=gcd(b,amodb)bx_2+(amod b)y_2=gcd(b,a mod b)

gcd(a,b)=gcd(b,amodb) herefore gcd(a,b)=gcd(b,a mod b)

ax1+by1=bx2+(amodb)y2ecause ax_1+by_1=bx_2+(amod b)y_2

amodb=aab×b herefore a mod b=a-lfloorfrac{a}{b} floor imes b

ax1+by1=bx2+(aab×b)y2ecause ax_1+by_1=bx_2+(a-lfloorfrac{a}{b} floor imes b)y_2

我们利用乘法分配律,把这个式子展开

bx2+(aab×b)y2=bx2+ay2ab×by2bx_2+(a-lfloorfrac{a}{b} floor imes b)y_2=bx_2+ay_2-lfloorfrac{a}{b} floor imes by_2

然后,我们把 bb 提出来

bx2+ay2ab×by2=ay2b(x2ab×y2)bx_2+ay_2-lfloorfrac{a}{b} floor imes by_2=ay_2-b(x_2-lfloorfrac{a}{b} floor imes y_2)

然后,我们发现 x1=y2,y1=x2ab×y2x_1=y_2,y_1=x_2-lfloorfrac{a}{b} floor imes y_2

这样,代码就好写了。

int exgcd(int a,int b,int &x,int &y){
    if(!b){
        x=1;
        y=0;
        return a;
    }
    int d=exgcd(b,a%b,x,y);
    int t=x;
    x=y;
    y=t-a/b*y;
    return d;
}
原文地址:https://www.cnblogs.com/zhaohaikun/p/12817029.html