【笔记】扩展欧几里得(exgcd)

最大公约数

记作 \(\gcd(a, b)\)。

重要性质:

  1. \(\gcd(a, b) = \gcd(b, a \operatorname{mod} b)\). 用来辗转相除法求最大公约数的方法。

递归写法:

inline ll gcd(ll a, ll b){
    return b == 0 ? a : gcd(b, a % b);
}

也可以用迭代:

inline ll gcd_(ll a, ll b){
    while(b){
        ll tmp = b;
        b = a % b, a = tmp;
    }
    return a;
}
  1. \(\operatorname{lcm}(a, b) = \frac{a\times b}{\gcd(a, b)}\)

用来求最小公倍数的方法,不常用。

裴蜀定理

若 \(a, b\) 为不全为 \(0\) 的整数,那么对于任意整数 \(x, y\) 都有 \(\gcd(x, y) | ax + by\) 成立,且不定方程 \(ax + by = \gcd(a, b)\) 必有解。

证明:设 \(d = \gcd(a, b)\),则可以将 \(a, b\) 表示为 \(pd, qd\)。那么 \(ax + by = adp + adq = d(ap + dq)\),所以 \(d | (ax + by)\)。

拓展欧几里得算法 (Exgcd)

用于求不定方程 \(ax + by = c\) 的解的算法。

由裴蜀定理,\(ax + by = \gcd(a, b)\) 必有整数解,求出一组特解。由辗转相除法,

\[\begin{aligned} & \; ax + by = \gcd(a, b) = \gcd(b, a\operatorname{mod} b) \\ = & \; bx' + (a \operatorname{mod} b)y' \end{aligned} \]

为了一一对应,我们需要对这个式子进行处理使得两项系数分别为 \(a, b\),才可以用 \(x', y'\) 表示 \(x, y\)。

\[\begin{aligned} & \; bx' + (a \operatorname{mod} b)y' \\ = & \; (a - \lfloor \frac{a}{b} \rfloor \times b)y' + bx' \\ = & \; ay' + b(x' - \lfloor \frac{a}{b} \rfloor y') \end{aligned} \]

所以我们得到了 \(x, y\) 的递推式:

\[\begin{cases} x = y'\\ y = x' - \lfloor\frac{a}{b}\rfloor y' \end{cases} \]

向下递归,直到 \(b = 0\),此时方程即 \(ax = a\),就得到了一组特解:

\[\begin{cases} x = 1 \\ y = 0 \end{cases} \]

不断回溯的过程中按照上述方式计算每一层 \(x, y\) 的值,最后得到的结果就是 \(ax + by = \gcd(a, b)\) 的解\(x_0, y_0\)。
那么 \(ax + by = c\) 的一组解如下。

\[\begin{cases} x_1 = \frac{c}{\gcd(a, b)}x_0 \\ y_1 = \frac{c}{\gcd(a, b)}y_0 \end{cases} \]

采取在原解的基础上变化的方式求通解。若 \(x\) 增加, 因为 \(c\) 不变,\(y\) 应当减小。设第一项增加了 \(p\),

\[\begin{cases} x' = x_1 + \frac{p}{a}\\ y' = y_1 + \frac{p}{b}\\ \end{cases} \]

因为要保证整数解,有 \(a\mid p, b\mid p\),所以 \(\operatorname{lcm}(a, b) \mid p\),一定可以将 \(p\) 表示为 \(k\operatorname{lcm}(a, b)\)。

所以:

\[\begin{aligned} x' & \; = x_1 + \frac{k\operatorname{lcm}(a, b)}{a} \\ & \; = x_1 + \frac{kab}{a\gcd(a, b)} \\ & \; = x_1 + k\frac{b}{\gcd(a, b)} \end{aligned} \]

对于 \(y\) 也是一样,

\[\begin{aligned} y' & \; = y_1 - \frac{k\operatorname{lcm}(a, b)}{b} \\ & \; = y_1 - \frac{kab}{b\gcd(a, b)} \\ & \; = y_1 - k\frac{a}{\gcd(a, b)} \end{aligned} \]

总结一下:

  1. 判断 \(\gcd(a, b)\) 是否能整除 \(c\),若不能,则原方程无解。
    2.先求 \(ax + by = \gcd(a, b)\) 的特解 \(x_0, y_0\),采用递归,递推式为:

\[\begin{cases} x = y'\\ y = x' - \lfloor \frac{a}{b} \rfloor y' \end{cases} \]

  1. 放大,得到 \(ax + by = c\) 的一组原解。

\[\begin{cases} x_1 = \frac{c}{\gcd(a, b)}x_0 \\ y_1 = \frac{c}{\gcd(a, b)}y_0 \end{cases} \]

  1. 在原解基础上改变求出想要的任意一组解。

\[\begin{cases} x = x_1 + k\frac{b}{\gcd(a, b)}\\ y = y_1 - k\frac{a}{\gcd(a, b)} \end{cases} \]

posted @ 2026-10-20 08:32  Hyazinth  阅读(3)  评论(0)    收藏  举报