exgcd求逆元
扩展欧几里得算法(exgcd)学习笔记
1. 算法简介
扩展欧几里得算法(Extended Euclidean Algorithm)是欧几里得算法(辗转相除法)的扩展。它不仅能求出两个整数 \(a, b\) 的最大公约数,还能找到一组整数解 \((x, y)\),使得:
该等式被称为贝祖等式(Bézout's identity)。exgcd 是数论中许多算法的基础,如求模逆元、解线性同余方程等。
2. 算法原理
2.1 欧几里得算法回顾
普通欧几里得算法通过如下递推式求 \(\gcd(a, b)\):
当 \(b = 0\) 时,\(\gcd(a, 0) = a\)。
2.2 扩展欧几里得算法的推导
假设我们已经递归求出了 \(b\) 和 \(a \bmod b\) 的一组贝祖等式解 \((x_1, y_1)\):
由于:
代入上式得:
整理成 \(a \cdot ? + b \cdot ?\) 的形式:
因此得到递推关系:
递归边界:当 \(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\) 使得:
则称 \(x\) 是 \(a\) 在模 \(m\) 下的逆元,记作 \(a^{-1} \pmod{m}\)。
存在条件:\(\gcd(a, m) = 1\),即 \(a\) 与 \(m\) 互质。
4.2 用 exgcd 求逆元的原理
同余式 \(a \cdot x \equiv 1 \pmod{m}\) 可展开为:
令 \(y = -k\),则变为:
因为 \(\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; // 保证结果为正
}

浙公网安备 33010602011771号