Files
SolutionEuler/solutions/0048.SelfPowers/README.md

5.3 KiB
Raw Blame History

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 = 2k \geq 3 时:\lambda(2^k) = 2^{k-2}
  • p = 2k \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$(即 ip 整除): 需使用提升指数法或直接处理。设 $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 >= nresult_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

步骤 3CRT 合并

求解同余方程组:

x \equiv \text{result}_2 \pmod{2^n}, \quad x \equiv \text{result}_5 \pmod{5^n}

由于 2^n5^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


六、实现要点

  1. 预计算逆元5^{-n} \bmod 2^n2^{-n} \bmod 5^n 可预先算出,避免每次重复计算。

  2. 处理非互质情况:当 i10 不互质时,需先提取公因子 $2^a 5^b$,判断是否结果为 $0$,否则分离出单位部分再缩减指数。

  3. 指数缩减的边界:当使用 Carmichael 定理时,若缩减后的指数为 $0$,应视为 $\lambda(n)$(除非底数为 $1$)。

这种方法将原本可能需要处理数百万位中间结果的计算,转化为只需处理 n 位数的少量模运算,是密码学和大数计算中的标准优化技术。