5.3 KiB
Carmichael 函数(通常记作 $\lambda(n)$)是数论中用于指数缩减的核心工具,结合中国剩余定理(CRT)可以大幅优化大数模幂运算。以下是系统性的讲解:
一、Carmichael 函数的定义与性质
1. 定义
对于正整数 $n$,Carmichael 函数 \lambda(n) 是满足以下条件的最小正整数:
a^{\lambda(n)} \equiv 1 \pmod{n}, \quad \forall a \in \mathbb{Z}_n^*
其中 \mathbb{Z}_n^* 表示模 n 的乘法群(即与 n 互质的剩余类)。
2. 计算公式(基于质因数分解)
若 $n = p_1^{k_1} p_2^{k_2} \cdots p_r^{k_r}$,则:
\lambda(n) = \text{lcm}\left(\lambda(p_1^{k_1}), \lambda(p_2^{k_2}), \ldots, \lambda(p_r^{k_r})\right)
对于素数幂 $p^k$:
- 当
p = 2且k \geq 3时:\lambda(2^k) = 2^{k-2} - 当
p = 2且k \leq 2时:\lambda(2) = 1, \lambda(4) = 2 - 当
p为奇素数时:\lambda(p^k) = \varphi(p^k) = p^{k-1}(p-1)
3. 与欧拉函数的关系
- 整除性:$\lambda(n) \mid \varphi(n)$(Carmichael 函数值总是欧拉函数值的因子)
- 优化性:通常 $\lambda(n) < \varphi(n)$,因此在指数缩减时比欧拉定理更强力
Carmichael 定理:若 $\gcd(a,n) = 1$,则 $a^{\lambda(n)} \equiv 1 \pmod{n}$。
二、计算后 n 位数的策略
要计算 $i^m \pmod{10^n}$(即 i^m 的后 n 位),核心思路是:
1. 模数分解
10^n = 2^n \times 5^n
由于 $\gcd(2^n, 5^n) = 1$,可用 CRT 分别计算:
x_1 \equiv i^m \pmod{2^n}x_2 \equiv i^m \pmod{5^n}
然后合并得到 $x \pmod{10^n}$。
2. 指数缩减(关键优化)
对于每个素数幂模数 $p^k$(此处为 2^n 或 $5^n$),利用 Carmichael 函数缩减指数:
若 $\gcd(i, p) = 1$:
i^m \equiv i^{m \bmod \lambda(p^k)} \pmod{p^k}
若 $\gcd(i, p) \neq 1$(即 i 被 p 整除):
需使用提升指数法或直接处理。设 $i = p^t \cdot u$($p \nmid u$):
- 若 $m \cdot t \geq k$,则
i^m \equiv 0 \pmod{p^k} - 否则计算 $(p^t)^m \cdot u^m \pmod{p^k}$,其中
u^m可用 Carmichael 缩减
三、完整算法流程
计算 i^m \pmod{10^n} 的精确步骤:
步骤 1:处理 2^n 模数
若 i 为偶数:
设 v = ord_2(i)(i 中因子 2 的指数)
若 m*v >= n:result_2 = 0
否则:
i' = i / 2^v
exp = m mod λ(2^(n-m*v)) (若互质)
result_2 = (2^(m*v) * i'^exp) mod 2^n
否则(i 为奇数):
exp = m mod λ(2^n) = m mod 2^(n-1) (当 n>=3)
result_2 = i^exp mod 2^n
步骤 2:处理 5^n 模数
若 i 被 5 整除:
类似上述处理,检查 m*ord_5(i) >= n
否则:
exp = m mod λ(5^n) = m mod (4*5^(n-1))
result_5 = i^exp mod 5^n
步骤 3:CRT 合并
求解同余方程组:
x \equiv \text{result}_2 \pmod{2^n}, \quad x \equiv \text{result}_5 \pmod{5^n}
由于 2^n 与 5^n 互质,解为:
x \equiv \text{result}_2 \cdot 5^n \cdot (5^{-n} \bmod 2^n) + \text{result}_5 \cdot 2^n \cdot (2^{-n} \bmod 5^n) \pmod{10^n}
四、复杂度分析
| 步骤 | 复杂度 | 说明 |
|---|---|---|
| 质因数分解 | $O(\sqrt{i})$(预处理) | 只需一次,确定 i 的 2 和 5 的指数 |
| 指数缩减 | O(\log m) |
计算 m \bmod \lambda(p^n) |
| 模幂运算 | O(\log n \cdot \log m) |
使用快速幂,指数已缩减 |
| CRT 合并 | O(n) |
扩展欧几里得求逆元 |
优势:相比直接计算 $i^m$(需要 O(\log m) 次乘法,但每次处理 O(m \cdot \log i) 位的大数),此方法将中间结果严格限制在 n 位内,且指数从 m 缩减到最多 $\lambda(5^n) \approx 4 \cdot 5^{n-1}$(与 m 无关)。
五、示例演示
问题:求 $12^{100} \pmod{1000}$(后 3 位),即 $n=3$。
分解:1000 = 8 \times 125 = 2^3 \times 5^3
计算 $\pmod{8}$:
- $12 = 4 \times 3 = 2^2 \times 3$,故
v=2 - $m \cdot v = 200 \geq 3$,因此
12^{100} \equiv 0 \pmod{8}
计算 $\pmod{125}$:
- $\gcd(12, 5) = 1$,可用 Carmichael 缩减
\lambda(125) = \varphi(125) = 100- $100 \bmod 100 = 0$,故
12^{100} \equiv 12^0 \equiv 1 \pmod{125}
CRT 合并:
求 x \equiv 0 \pmod{8} 且 $x \equiv 1 \pmod{125}$。
令 $x = 125k + 1$,需 $125k + 1 \equiv 0 \pmod{8}$。 $125 \equiv 5 \pmod{8}$,故 $5k \equiv -1 \equiv 7 \pmod{8}$。 $5^{-1} \equiv 5 \pmod{8}$,得 $k \equiv 35 \equiv 3 \pmod{8}$。
取 $k=3$,则 $x = 125 \times 3 + 1 = 376$。
验证:12^{100} 的后三位确实是 376。
六、实现要点
-
预计算逆元:
5^{-n} \bmod 2^n和2^{-n} \bmod 5^n可预先算出,避免每次重复计算。 -
处理非互质情况:当
i与10不互质时,需先提取公因子 $2^a 5^b$,判断是否结果为 $0$,否则分离出单位部分再缩减指数。 -
指数缩减的边界:当使用 Carmichael 定理时,若缩减后的指数为 $0$,应视为 $\lambda(n)$(除非底数为 $1$)。
这种方法将原本可能需要处理数百万位中间结果的计算,转化为只需处理 n 位数的少量模运算,是密码学和大数计算中的标准优化技术。