docs: 添加 SelfPowers 题解 README,详解 Carmichael 函数与 CRT 优化
This commit is contained in:
139
solutions/0048.SelfPowers/README.md
Normal file
139
solutions/0048.SelfPowers/README.md
Normal 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 >= 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**。
|
||||
|
||||
---
|
||||
|
||||
## 六、实现要点
|
||||
|
||||
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$ 位数的少量模运算,是密码学和大数计算中的标准优化技术。
|
||||
Reference in New Issue
Block a user