docs: 添加 SelfPowers 题解 README,详解 Carmichael 函数与 CRT 优化

This commit is contained in:
2026-02-19 14:44:16 +08:00
parent 4dae9d2e78
commit d84c09635e

View File

@@ -0,0 +1,139 @@
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 >= 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^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**
---
## 六、实现要点
1. **预计算逆元**$5^{-n} \bmod 2^n$ $2^{-n} \bmod 5^n$ 可预先算出避免每次重复计算
2. **处理非互质情况** $i$ $10$ 不互质时需先提取公因子 $2^a 5^b$判断是否结果为 $0$否则分离出单位部分再缩减指数
3. **指数缩减的边界**当使用 Carmichael 定理时若缩减后的指数为 $0$应视为 $\lambda(n)$除非底数为 $1$)。
这种方法将原本可能需要处理数百万位中间结果的计算转化为只需处理 $n$ 位数的少量模运算是密码学和大数计算中的标准优化技术