From d84c09635e4ed6ba1f3e6e858409e4b646d63ac8 Mon Sep 17 00:00:00 2001 From: Sidney Zhang Date: Thu, 19 Feb 2026 14:44:16 +0800 Subject: [PATCH] =?UTF-8?q?docs:=20=E6=B7=BB=E5=8A=A0=20SelfPowers=20?= =?UTF-8?q?=E9=A2=98=E8=A7=A3=20README=EF=BC=8C=E8=AF=A6=E8=A7=A3=20Carmic?= =?UTF-8?q?hael=20=E5=87=BD=E6=95=B0=E4=B8=8E=20CRT=20=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- solutions/0048.SelfPowers/README.md | 139 ++++++++++++++++++++++++++++ 1 file changed, 139 insertions(+) create mode 100644 solutions/0048.SelfPowers/README.md diff --git a/solutions/0048.SelfPowers/README.md b/solutions/0048.SelfPowers/README.md new file mode 100644 index 0000000..b305184 --- /dev/null +++ b/solutions/0048.SelfPowers/README.md @@ -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$ 位数的少量模运算,是密码学和大数计算中的标准优化技术。