exgcd求逆元

扩展欧几里得算法(exgcd)学习笔记

1. 算法简介

扩展欧几里得算法(Extended Euclidean Algorithm)是欧几里得算法(辗转相除法)的扩展。它不仅能求出两个整数 \(a, b\) 的最大公约数,还能找到一组整数解 \((x, y)\),使得:

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

该等式被称为贝祖等式(Bézout's identity)。exgcd 是数论中许多算法的基础,如求模逆元、解线性同余方程等。


2. 算法原理

2.1 欧几里得算法回顾

普通欧几里得算法通过如下递推式求 \(\gcd(a, b)\)

\[\gcd(a, b) = \gcd(b, a \bmod b) \]

\(b = 0\) 时,\(\gcd(a, 0) = a\)

2.2 扩展欧几里得算法的推导

假设我们已经递归求出了 \(b\)\(a \bmod b\) 的一组贝祖等式解 \((x_1, y_1)\)

\[b \cdot x_1 + (a \bmod b) \cdot y_1 = \gcd(b, a \bmod b) = \gcd(a, b) \]

由于:

\[a \bmod b = a - \left\lfloor \frac{a}{b} \right\rfloor \cdot b \]

代入上式得:

\[b \cdot x_1 + \left(a - \left\lfloor \frac{a}{b} \right\rfloor \cdot b\right) \cdot y_1 = \gcd(a, b) \]

整理成 \(a \cdot ? + b \cdot ?\) 的形式:

\[a \cdot y_1 + b \cdot \left(x_1 - \left\lfloor \frac{a}{b} \right\rfloor \cdot y_1\right) = \gcd(a, b) \]

因此得到递推关系

\[\begin{cases} x = y_1 \\ y = x_1 - \left\lfloor \dfrac{a}{b} \right\rfloor \cdot y_1 \end{cases}\]

递归边界:当 \(b = 0\) 时,\(\gcd(a, 0) = a\),对应等式 \(a \cdot 1 + 0 \cdot 0 = a\),故 \(x = 1, y = 0\)


3. C++ 代码实现

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

3.1 代码说明

  • 递归边界:\(b = 0\) 时直接返回 \((1, 0)\)
  • 回溯时按照推导出的递推关系更新 \(x, y\)
  • 返回值是 \(\gcd(a, b)\)

3.2 时间复杂度

与欧几里得算法相同,时间复杂度为 \(\mathcal O(\log \min(a, b))\)


4. 应用:用 exgcd 求模逆元

4.1 什么是模逆元?

给定整数 \(a\) 和模数 \(m\),若存在整数 \(x\) 使得:

\[a \cdot x \equiv 1 \pmod{m} \]

则称 \(x\)\(a\) 在模 \(m\) 下的逆元,记作 \(a^{-1} \pmod{m}\)

存在条件\(\gcd(a, m) = 1\),即 \(a\)\(m\) 互质。

4.2 用 exgcd 求逆元的原理

同余式 \(a \cdot x \equiv 1 \pmod{m}\) 可展开为:

\[a \cdot x - m \cdot k = 1 \]

\(y = -k\),则变为:

\[a \cdot x + m \cdot y = 1 \]

因为 \(\gcd(a, m) = 1\),该等式即为贝祖等式。调用 exgcd(a, m, x, y) 得到的 \(x\) 就是 \(a\) 在模 \(m\) 下的逆元。

4.3 代码实现

int inv(int a, int m) {
    int x, y;
    int d = exgcd(a, m, x, y);
    if (d != 1) {
        return -1;  // 逆元不存在
    }
    return (x % m + m) % m;  // 保证结果为正
}
posted @ 2026-07-01 19:50  词印  阅读(34)  评论(0)    收藏  举报