在数论中,模逆元是一个基础且重要的概念。想象一下我们熟悉的乘法逆元(倒数):数字 5 的倒数是 1/5,因为 5 * (1/5) = 1。模逆元是在模运算(取余数运算)世界里的“倒数”。
定义:对于给定的整数 a
和正整数模数 n
(n > 1),如果存在一个整数 x
,使得它们的乘积满足下面的同余关系:
a ⋅ x ≡ 1 (mod n)
那么,我们称 x
是 a
关于模 n
的乘法逆元(简称模逆元)。通常记作 a-1 (mod n)
或 inv(a, n)
。
这个式子的意思是:a
乘以 x
所得的结果,除以 n
后得到的余数是 1。
在模 7 的运算下(想象一个只有 0, 1, 2, 3, 4, 5, 6 这七个数字的时钟):
我们想找 3 的逆元。试试看:
我们发现,当 x = 5
时,3 × 5
除以 7 的余数是 1。因此,5 是 3 在模 7 下的逆元。我们也可以说 3 是 5 在模 7 下的逆元,它们互为逆元。
模运算可以看作是在一个循环的结构上进行。下面通过圆环和数轴两种方式可视化模 n
下的运算,帮助你找到 a
的逆元。
是不是对于任何整数 a
和模数 n
,a
都存在模 n
的逆元呢?答案是否定的。比如在模 8 下,数字 2 就没有逆元(你可以试试 2 乘以 0 到 7 的任何数,结果模 8 都不会是 1)。
一个数 a
是否在模 n
下有逆元,取决于它们之间的一个重要性质:最大公约数 (Greatest Common Divisor, GCD)。
存在性定理: 整数 a
在模 n
下存在乘法逆元的 充要条件 是 a
与 n
互质,即它们的最大公约数等于 1。
gcd(a, n) = 1
在 mod 10 下:
要判断逆元是否存在,我们首先需要计算 gcd(a, n)
。最高效的经典算法是 欧几里得算法(也叫辗转相除法)。其原理是:两个整数的最大公约数等于其中较小的数和两数相除余数的最大公约数。
即:gcd(a, b) = gcd(b, a mod b)
(假设 a > b)。反复应用这个规则,直到余数为 0,此时最后一个非零余数(或者说,除数)就是最大公约数。
仅仅知道逆元存在还不够,我们还需要找到它!这时 扩展欧几里得算法 就派上用场了。这个算法不仅能计算出 gcd(a, n)
,还能同时找到一对整数 x
和 y
,使得它们满足 贝祖等式 (Bézout's identity):
a ⋅ x + n ⋅ y = gcd(a, n)
回顾一下,我们要找的逆元是满足 a ⋅ x ≡ 1 (mod n)
的 x
。如果 gcd(a, n) = 1
,那么贝祖等式就变成了:
a ⋅ x + n ⋅ y = 1
这个等式两边同时对 n
取模,得到:
(a ⋅ x + n ⋅ y) mod n = 1 mod n
因为 n ⋅ y
是 n
的倍数,所以 (n ⋅ y) mod n = 0
。于是上式简化为:
a ⋅ x ≡ 1 (mod n)
看!这正是模逆元的定义!所以,扩展欧几里得算法找到的那个 x
,就是 a
模 n
的逆元(或者说,是逆元的一个代表,我们可能需要调整它到 [0, n-1]
范围内)。
扩展欧几里得算法通常使用递归实现,基于普通欧几里得算法的步骤反向推导 x 和 y。
现在,让我们把所有步骤整合起来!输入 a
和 n
,系统将:
gcd(a, n)
并显示过程。gcd(a, n) = 1
,则使用扩展欧几里得算法计算逆元 x
,并展示关键步骤。[0, n-1]
范围内)或提示逆元不存在。你可以选择“手动逐步”模式,一步步查看计算过程;或者选择“自动播放”模式,让系统连续演示所有步骤。
gcd(a, n) = 1
的条件。只有当 a 和 n 互质时,a 模 n 的逆元才存在。a=3, n=7
,EEA 可能得到 x = -2
,因为 3*(-2) + 7*1 = 1
。我们需要将其调整到 [0, n-1]
范围内,即 (-2 mod 7 + 7) mod 7 = 5
。所有满足 x' ≡ x (mod n)
的 x'
都是逆元,但我们通常取最小非负整数解。n
(n > 1
) 的运算。10 mod 7 = 3
模 7 的逆元。可以先对 a 取模:inv(a, n) = inv(a mod n, n)
。模逆元在计算机科学和数学的许多领域都有广泛应用,尤其是在密码学和数论算法中:
d ⋅ e ≡ 1 (mod φ(n))
,其中 e 是公钥指数,φ(n) 是欧拉函数值。这里的 d 就是 e 模 φ(n) 的逆元。a ⋅ x ≡ b (mod n)
的方程。如果 gcd(a, n) = 1
,则方程有唯一解(模 n 意义下)。我们可以先求出 a 的逆元 inv(a, n)
,然后方程两边同时乘以逆元:inv(a, n) ⋅ a ⋅ x ≡ inv(a, n) ⋅ b (mod n)
,得到 x ≡ inv(a, n) ⋅ b (mod n)
。C(n, k) = n! / (k! * (n-k)!) ≡ n! * inv(k!, p) * inv((n-k)!, p) (mod p)
(需要 p 是素数,且 k! 和 (n-k)! 与 p 互质)。a^(p-1) ≡ 1 (mod p)
。这意味着 a * a^(p-2) ≡ 1 (mod p)
。所以,a^(p-2) mod p
就是 a 模 p 的逆元。这种方法需要计算快速幂,当 p 很大时比扩展欧几里得算法更方便(如果只需要结果而不需要过程)。但它只适用于模数是素数的情况。gcd(a, n) = 1
,则 a^φ(n) ≡ 1 (mod n)
,其中 φ(n) 是欧拉函数(小于 n 且与 n 互质的正整数个数)。因此,a^(φ(n)-1) mod n
是 a 模 n 的逆元。这需要计算欧拉函数 φ(n),对于合数 n,计算 φ(n) 需要对其进行质因数分解。