欧几里得算法,扩展欧几里德算法与裴属定理 (gcd,exgcd)

欧几里得算法,扩展欧几里德算法与裴属定理 (gcd,exgcd)

欧几里得算法

我们有$$gcd(a,b)=gcd(b,a \bmod b)$$

同时,我们有$$gcd(a,0)=a$$

所以,我们可以通过欧几里得算法求两个数的最大公约数.

ll gcd(ll a,ll b) {
    if(!b) return a;
    return gcd(b,a%b);
}

扩展欧几里得算法 (exgcd)

我们先对$$ax+by=gcd(a,b)$$求解

考虑归纳

  • 当\(b=0\)时, 显然,此时方程的解为\(x_1=1,x_2=0\)

  • 当\(b\neq0\)时

我们考虑求解$$ax+by=gcd(a,b)$$ $$=gcd(b,a \bmod b)$$$$=bx_o+(a \bmod b)y_0$$ $$=bx_0+(a-\lfloor \frac{a}{b} \rfloor b)y_0$$ $$=bx_0+ay_0-\lfloor \frac{a}{b} \rfloor b y_0$$ $$=b(x_0-\lfloor \frac{a}{b} \rfloor y_0)+ay_0$$

综上,$$x=y_0,y=(x_0-\lfloor \frac{a}{b} \rfloor y_0)$$

ll exgcd(ll a,ll b,ll &x,ll &y) {
    if(!b) {
        x=1,y=0;
        return a;
    }
    ll tmp=exgcd(b,a%b,x,y);
    ll tmpy=x-ll(a/b)*y,tmpx=y;
    x=tmpx,y=tmpy;
    return tmp;
}

裴属定理

我们要求解不定方程$$ax+by=c$$

根据裴属定理,当且仅当$$gcd(a,b)|c$$时,方程有解

即$$方程有解 \Leftrightarrow gcd(a,b)|c$$

求不定方程的解.

我们要求$$ax+by=c$$的解.

显然,你得先拿裴属定理判断一下是否有解.

诺有解,我们可以先求出$$ax+by=gcd(a,b)$$的解.\(x_0,y_0\).

然后显然,我们需要通过乘倍数将\(gcd(a,b)\)与\(c\)的差补上. 设$$k=\frac{c}{gcd(a,b)}$$, 那么我们得到了这个方程的一个特解$$x'=kx_0,y'=ky_0$$

然后显然不定方程的整数解是不止一个的.

然后我们考虑通过这个特解求出其他解.

由于我们现在已经有$$ax'+by'=c$$

那么如果我们要让\(x,y\)变化后这个式子任然等于\(c\),那么我们必须让\(ax,by\)的变换量相互抵消.,即

\[a\Delta x+b\Delta y=0 \]

即

\[a\Delta x=-b\Delta y \]

那么显然,两边的都是\(lcm(a,b)\)的倍数.

那么显然,\(\Delta x\)是\(\frac{lcm(a,b)}{a}\)的倍数,,\(\Delta y\)是\(\frac{lcm(a,b)}{b}\)的倍数

推式子:

\[\Delta x=t\frac{lcm(a,b)}{a} \]

\[\Delta x=t\frac{ab*gcd(a,b)^{-1}}{a} \]

\[\Delta x=t\frac{ab}{gcd(a,b)a} \]

\[\Delta x=t\frac{b}{gcd(a,b)} \]

\(\Delta y\)同理:

\[\Delta y=t\frac{lcm(a,b)}{b} \]

\[\Delta y=t\frac{ab*gcd(a,b)^{-1}}{b} \]

\[\Delta y=t\frac{ab}{gcd(a,b)b} \]

\[\Delta y=t\frac{a}{gcd(a,b)} \]

然后对于一对通过特解计算而来的解,\(t\)是相同的.这显然

posted @ 2026-10-27 21:22  txp2025  阅读(3)  评论(0)    收藏  举报