跳到内容

9.2 模逆、快速幂与中国剩余定理

瞭望塔的几只齿轮按不同周期转动,阿花要判断它们何时重新对齐,以及哪些模运算允许逆向求解。

模运算保留加法和乘法,却不能随意做除法。能否“除以 a”,取决于 a 在当前模数下是否有乘法逆元。

同余可做加减乘

若:

text
a≡b (mod m)
c≡d (mod m)

则:

text
a+c≡b+d (mod m)
a-c≡b-d (mod m)
ac≡bd (mod m)

所以可在计算中不断约减余数,避免中间值无限增长。但固定宽整数里先相乘仍可能溢出,超大模乘需要大整数或专门算法。

约去因子有条件

从:

text
ac≡bc (mod m)

不能总推出 a≡b

例:

text
2·1≡2·3 (mod 4)

两边都余 2,但 1≢3 (mod 4)

gcd(c,m)=1c 有逆元,才可以安全约去。

模逆

am 的逆元 a⁻¹ 满足:

text
aa⁻¹≡1 (mod m)

逆元存在,当且仅当:

text
gcd(a,m)=1

由 Bézout:若 ax+my=1,则:

text
ax≡1 (mod m)

所以 x mod m 是逆元。

例:求 3 模 11 的逆:

text
4·3-1·11=1

因此 3⁻¹≡4 (mod 11)

线性同余:

text
ax≡b (mod m)

有解当且仅当 gcd(a,m)|b。若 gcd 为 1,则解模 m 唯一;否则可能无解或有多个剩余类解。

模快速幂

计算 a^e mod m 不应先生成巨大 a^e。平方—乘法按指数二进制展开:

text
result=1
base=a mod m

while e>0:
  if e 为奇数:
    result=result·base mod m
  base=base·base mod m
  e=floor(e/2)

模乘次数 O(log e)。安全实现还要考虑:

  • 指数是否允许负数;
  • 模数是否为正;
  • 乘法是否溢出;
  • 密码学场景是否需要常数时间,避免分支和内存访问泄漏指数位。

教学代码不应直接用于密钥运算。

Fermat 与 Euler 定理

p 为质数且 p∤a

text
a^(p-1)≡1 (mod p)

Euler 定理推广为:若 gcd(a,n)=1

text
a^φ(n)≡1 (mod n)

φ(n) 是 1 到 n 中与 n 互质的剩余类数量。

p 质数:

text
φ(p)=p-1

p,q 为不同质数:

text
φ(pq)=(p-1)(q-1)

条件 gcd(a,n)=1 不能省略。Fermat 小定理给出质数的必要性质,却不是充分判据:合数也可能对某些或全部互质底数表现类似。

中国剩余定理

若模数 m₁,...,m_k 两两互质,则同余组:

text
x≡a₁ (mod m₁)
...
x≡a_k (mod m_k)

在模:

text
M=m₁...m_k

意义下有唯一解。

构造:

text
M_i=M/m_i
y_i=M_i⁻¹ mod m_i
x=Σ a_i M_i y_i mod M

因为 M_i y_i 在模 m_i 下为 1,在其他模数下为 0,它像选择对应分量的基向量。

例:

text
x≡2 (mod 3)
x≡3 (mod 5)
x≡2 (mod 7)

解为:

text
x≡23 (mod 105)

非互质模数

两个同余:

text
x≡a (mod m)
x≡b (mod n)

有共同解,当且仅当:

text
a≡b (mod gcd(m,n))

若有解,解在模 lcm(m,n) 意义下唯一。标准“两两互质”版本只是更简洁的特例。

工程应用与边界

  • 多周期调度的相位对齐;
  • 把大整数运算拆到多个互质模数再重建;
  • RSA 私钥运算中的 CRT 加速;
  • 剩余数系统与纠错编码。

CRT 分解不自动提供安全性。密码实现还需防故障注入、侧信道和错误校验,应使用审计过的库。

完成检查

  1. 17⁻¹ mod 43
  2. 14x≡8 (mod 30)
  3. 手工计算 7^181 mod 13
  4. 用 CRT 解三个两两互质同余;
  5. 构造一个非互质且无解的同余组;
  6. 说明模快速幂为何仍可能在固定宽整数乘法处溢出。

参考资料

Built with VitePress | Software Systems Atlas