数论之逆元
在数学和计算机科学中,逆元是一个非常重要的概念,尤其在数论和密码学中应用广泛。简单来说,逆元就像是乘法中的倒数,但它是在特定运算和模数下的“倒数”。
什么是逆元?
在一个给定的模数 \(m\) 下,如果存在一个数 \(x\),使得数 \(a\) 与 \(x\) 相乘后对 \(m\) 取模的结果为 1,那么 \(x\) 就被称为 \(a\) 的模乘法逆元(Modular Multiplicative Inverse)。
用数学公式表示就是:
如果 \(ax \equiv 1 \pmod{m}\),
那么 \(x\) 就是 \(a\) 在模 \(m\) 意义下的逆元。
这里:
- \(a\) 和 \(m\) 必须是互质的(即它们的最大公约数是 1),否则 \(a\) 的逆元不存在。
- \(x\) 的值通常在 \(1\) 到 \(m-1\) 的范围内。
为什么要用逆元?
在模运算中,加法、减法和乘法都有对应的规则,但除法却没有。当我们需要在模运算中进行除法时,就需要用到逆元。
比如,我们想计算 \((b / a) \pmod{m}\)。
由于模运算不直接支持除法,我们可以将除以 \(a\) 转化为乘以 \(a\) 的逆元 \(x\)。
所以,\((b / a) \pmod{m}\) 就可以转换为 \((b \cdot x) \pmod{m}\)。
如何求逆元?
求逆元主要有以下几种方法:
-
扩展欧几里得算法(Extended Euclidean Algorithm)
这是最通用也最常用的方法。它基于欧几里得算法(求最大公约数),可以用来解方程 \(ax + by = \text{gcd}(a, b)\)。当 \(a\) 和 \(m\) 互质时,\(\text{gcd}(a, m) = 1\),方程就变成了 \(ax + my = 1\)。对这个方程取模 \(m\),我们得到 \(ax \equiv 1 \pmod{m}\),从而求出 \(x\)。 -
费马小定理(Fermat's Little Theorem)
如果模数 \(m\) 是一个质数,我们可以用费马小定理来求逆元。
费马小定理指出,如果 \(p\) 是质数,且 \(a\) 不是 \(p\) 的倍数,那么 \(a^{p-1} \equiv 1 \pmod{p}\)。
这个公式可以写成 \(a \cdot a^{p-2} \equiv 1 \pmod{p}\)。
因此,当 \(m\) 是质数时,\(a\) 的逆元就是 \(a^{m-2} \pmod{m}\)。这种方法通常用快速幂算法来计算。 -
线性递推
如果需要求一组连续数字(例如 \(1, 2, \dots, n\))在模 \(p\) 意义下的逆元,并且 \(p\) 是一个质数,我们可以用线性时间复杂度递推出所有逆元。
简单例子
让我们用一个例子来理解逆元。
求 \(3\) 在模 \(7\) 意义下的逆元。
我们设逆元为 \(x\),根据定义,\(3x \equiv 1 \pmod{7}\)。
我们可以逐一测试 \(x\) 的值(从 \(1\) 到 \(6\)):
- \(3 \cdot 1 = 3 \not\equiv 1 \pmod{7}\)
- \(3 \cdot 2 = 6 \not\equiv 1 \pmod{7}\)
- \(3 \cdot 3 = 9 \equiv 2 \pmod{7}\)
- \(3 \cdot 4 = 12 \equiv 5 \pmod{7}\)
- \(3 \cdot 5 = 15 \equiv 1 \pmod{7}\)
当 \(x=5\) 时,我们找到了满足条件的数。因此,\(3\) 在模 \(7\) 意义下的逆元是 \(5\)。
有了这个逆元,我们就可以在模 \(7\) 意义下进行“除法”了。比如,计算 \((6/3) \pmod{7}\),我们可以写成 \((6 \cdot 5) \pmod{7}\),结果为 \(30 \pmod{7} \equiv 2 \pmod{7}\)。
而直接计算 \(6/3 = 2\),结果是吻合的。

浙公网安备 33010602011771号