浅谈扩展欧几里德

题外语:大后天就是复赛了,不负光阴,加油!


扩展欧几里德是一项较为基础的数论专项

定义:一个 \(ax+by=gcd(a,b)\) 的式子,\(a,b\)为给定的值,求\(x,y\)的解
首先,这个式子满足:解一定存在。

回忆我们知道的欧几里德算法,是把\(gcd(a,b)\)转化求解为\(gcd(b,a\mod b)\),类比一下,看看扩展欧几里德可不可以运用到这种方法呢?

当然可以。不然为什么叫扩展,数学同题不同问间都有关系


假设我们已经求解出了\(x_1,y_1\)的值,且\(bx_1+(a\mod b)y_1=gcd(a,b)\)

因为\(a\mod b==a-(a / b)*b\)

所以等量代换 \(bx_1+[a-(a / b)*b]y_1=gcd(a,b)\)

拆个括号,\(bx_1+ay_1-(a/b)*by_1=gcd(a,b)\)
转换: \(ay_1+b[x1-(a/b)y1]=gcd(a,b)\)

总觉得有点儿熟悉啊......

\(ax+by=gcd(a,b)\)

\(ay_1+b[x1-(a/b)y1]=gcd(a,b)\)

一模一样

所以\(x=y1,y=x1-(a/b)y1.\)

递推式就出来了——

1.\(x_n=y_n+1,y_n=x_{n+1}-(a/b)y_{n+1}\)

2.当 \(b\)\(0\) 时,\(return\) \(a\)因为此时的\(a\)就是\(gcd\)
也就是说,欧几里得算法中\(gcd\)部分结束时变量a中存放的是gcd,变量b中存放的是0,因此此时显然有\(a\times 1+b\times 0=gcd\)成立,此时有\(x=1,y=0\)成立。

update:2022/03/05:20:43

至于通解

\[x=x_0+ \frac{lcm(a,b)}{a}, \]

\[y=y_0- \frac{lcm(a,b)}{b} \]

\[x=[(x_0 \mod \frac{b}{gcd(a,b)})+\frac{b}{gcd(a,b)}] \mod \frac{b}{gcd(a,b)} \]

\[.............还是自己再推推吧............. \]


核心代码如下:

int exgcd(int a, int b, int &x, int &y) {
    if(b == 0) {
        x = 1;
        y = 0;
        return a;
    }
    int r = exgcd(b, a % b, x, y);
    int t = x;
    x = y;
    y = t - a / b * y;
    return r;
}

2021.11.07:Ps:PJ-301一等,TG-55二等

posted @ 2022-08-18 19:39  Tonvia  阅读(29)  评论(0)    收藏  举报
#Snow{ position: fixed; top: 0; left: 0; width: 100%; height: 100%; z-index: 99999; background: rgba(125,137,95,0.1); pointer-events: none; }