模重复平方计算法
1. 问题背景:
-
计算 bⁿ mod m,其中 n 是非负整数,b 和 m 是给定的。
-
n 被表示为二进制形式:n = n₀ + n₁·2 + ⋯ + nₖ₋₁·2ᵏ⁻¹,其中 nᵢ ∈ {0, 1}。
2. 算法核心:
-
使用平方-乘法(Square-and-Multiply)算法,通过逐步计算幂的模值来优化。
-
公式:bⁿ = bⁿ⁰ · (b²)ⁿ¹ · ⋯ · (b²ᵏ⁻²)ⁿᵏ⁻² · (b²ᵏ⁻¹)ⁿᵏ⁻¹ mod m
-
逐步计算 b 的幂并取模,避免直接计算大指数。
3. 计算步骤:
-
初始化:a₀ = bⁿ⁰ mod m,b₁ = b² mod m
-
迭代:对于 i = 1 到 k - 1,计算 aᵢ = aᵢ₋₁ · bᵢⁿⁱ mod m,并更新 bᵢ₊₁ = bᵢ² mod m
-
最终结果:aₖ₋₁ 就是 bⁿ mod m
4. 时间复杂度:
-
算法时间复杂度为 O(log₂ n),因为它基于 n 的二进制表示的位数。
5. 具体算法如下:
-
设 a = 1,并将 n 的二进制位从低到高处理。
-
如果某位为 1,则乘以当前 b 的幂并取模。
-
每次循环,b 平方并取模。
-
最后,a 就是结果。
6.举例
设 b = 3, n = 11, m = 7
目标:计算 3¹¹ mod 7
步骤1: 将 n 转换为二进制
11 的二进制表示是 1011, 即:
n₀ = 1,n₁ = 1,n₂ = 0,n₃ = 1
所以 11 = 1·2⁰ + 1·2¹ + 0·2² + 1·2³
步骤2: 初始化
设 a = 1 (初始结果)
设 b_current = 3 (初始底数)
步骤3: 按位处理
从 n 的最低位到最高位,逐位计算:
-
位 0 (n₀ = 1):
• a = a · b_currentⁿ⁰ mod m = 1 · 3¹ mod 7 = 3
• b_current = b_current² mod m = 3² mod 7 = 9 mod 7 = 2 -
位 1 (n₁ = 1):
• a = a · b_currentⁿ¹ mod m = 3 · 2¹ mod 7 = 3 · 2 mod 7 = 6 mod 7 = 6
• b_current = b_current² mod m = 2² mod 7 = 4 mod 7 = 4 -
位 2 (n₂ = 0):
• a = a · b_currentⁿ² mod m = 6 · 4⁰ mod 7 = 6 · 1 mod 7 = 6 (因为 n₂ = 0 不需要乘)
• b_current = b_current² mod m = 4² mod 7 = 16 mod 7 = 2 -
位 3 (n₃ = 1):
• a = a · b_currentⁿ³ mod m = 6 · 2¹ mod 7 = 6 · 2 mod 7 = 12 mod 7 = 5
步骤4: 结果
最终 a = 5,所以 3¹¹ mod 7 = 5