exgcd详解

本文写于 2020.2.4,并于 2021.12.16 重构推导部分。

1.exgcd是什么?

exgcd大名扩展欧几里得算法,用来求形如 \(ax + by =\gcd(a,b)\)\(a,b\) 为常数)的方程的一组整数解。


2.推导

\(b=0\) 时,\(\gcd(a,b)=a\),此时 \(x=1\)\(y=0\)

\(b\not=0\) 时,考虑到 \(\gcd(a,b)=\gcd(b,a\bmod b)\),所以我们可以先递归去求 \(bx+(a\bmod b)y=\gcd(b,a\bmod b)\) 的解 \(\begin{cases}x=x_0\\y =y_0\end{cases}\),然后再往回带:

\[\begin{align*}ax+by&= \gcd(a,b)\\ &= \gcd(b,a\bmod b)\\ &=bx_0+(a\bmod b)y_0\end{align*} \]

因为 \(a\bmod b=a-\lfloor \dfrac{a}{b}\rfloor b\),所以:

\[\begin{align*}ax+by&=bx_0+(a-\lfloor \dfrac{a}{b}\rfloor b)y_0\\&=bx_0+ay_0-\lfloor \dfrac{a}{b} \rfloor by_0\\ &=ay_0+b(x_0-\lfloor \dfrac{a}{b} \rfloor y_0)\end{align*}\]

即方程 \(\gcd(a,b) = ax + by\) 的一个解为 \(x=y_0,\;y=x_0-\lfloor \dfrac{a}{b} \rfloor y_0\)

//公式是我一个字一个字手敲的,要敲断了……


3.代码实现

void exgcd(int &x,int &y,int a,int b)
{
    if(!b)
    {
        x=1;
        y=0;
        return;
    }
    exgcd(x,y,b,a%b);
    int t=x;
    x=y;
    y=t-a/b*y;
}
posted @ 2020-02-04 23:22  zzt1208  阅读(6676)  评论(9编辑  收藏  举报