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

\(ax_1+by_1=\gcd(a,b)\)

\(bx_2+(a\bmod b)y_2=\gcd(b,a \bmod b)\)

\(\therefore \gcd(a,b)=\gcd(b,a \bmod b)\)

\(\because ax_1+by_1=bx_2+(a\bmod b)y_2\)

\(\therefore a \bmod b=a-\lfloor\frac{a}{b}\rfloor\times b\)

\(\because ax_1+by_1=bx_2+(a-\lfloor\frac{a}{b}\rfloor\times b)y_2\)

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

\(bx_2+(a-\lfloor\frac{a}{b}\rfloor\times b)y_2=bx_2+ay_2-\lfloor\frac{a}{b}\rfloor\times by_2\)

然后,我们把 \(b\) 提出来

\(bx_2+ay_2-\lfloor\frac{a}{b}\rfloor\times by_2=ay_2-b(x_2-\lfloor\frac{a}{b}\rfloor \times y_2)\)

然后,我们发现 \(x_1=y_2,y_1=x_2-\lfloor\frac{a}{b}\rfloor \times 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;
}
posted @ 2020-03-12 23:16  zhaohaikun  阅读(216)  评论(4编辑  收藏  举报