快速幂算法
字数 1904 2025-11-04 08:34:40

快速幂算法

快速幂算法是一种高效计算大整数幂的方法,特别适用于模幂运算(如计算 \(a^b \mod m\))。其核心思想是通过二分降幂,将时间复杂度从朴素的 \(O(b)\) 优化到 \(O(\log b)\)

问题描述

计算 \(a^b\),其中 \(a\)\(b\) 均为非负整数(通常 \(b\) 很大,例如 \(b \geq 10^9\))。若直接进行 \(b\) 次乘法,时间成本过高。快速幂利用幂的二进制分解,将计算次数降至对数级。

解题过程

步骤1:理解幂的二进制分解

任意正整数 \(b\) 可以表示为二进制形式,例如 \(b = 13\) 的二进制是 \(1101_2\),即:

\[13 = 1 \cdot 2^3 + 1 \cdot 2^2 + 0 \cdot 2^1 + 1 \cdot 2^0 \]

因此:

\[a^{13} = a^{8} \cdot a^{4} \cdot a^{1} \]

注意:二进制位为0的项(如 \(a^{2}\))被跳过。

步骤2:迭代计算思路

  1. 初始化:设结果 \(res = 1\),底数 \(base = a\),指数 \(n = b\)
  2. 循环(当 \(n > 0\) 时)
    • \(n\) 的当前最低位为1(即 \(n \mod 2 = 1\)),则将 \(res\) 乘以当前的 \(base\)
    • 更新 \(base = base \times base\)(相当于计算 \(a^{2^k}\))。
    • \(n\) 右移一位(即 \(n = n // 2\)),相当于处理下一个二进制位。
  3. 终止:当 \(n = 0\) 时,\(res\) 即为 \(a^b\)

步骤3:示例演示(计算 \(3^{13}\)

  • 初始:\(res = 1, base = 3, n = 13\)(二进制 1101
  • 第1轮\(n = 13\)):
    • \(n\) 最低位为1:\(res = 1 \times 3 = 3\)
    • 更新 \(base = 3 \times 3 = 9\)
    • 右移 \(n = 13 // 2 = 6\)(二进制 110
  • 第2轮\(n = 6\)):
    • 最低位为0:\(res\) 不变(仍为3)
    • 更新 \(base = 9 \times 9 = 81\)
    • 右移 \(n = 6 // 2 = 3\)(二进制 11
  • 第3轮\(n = 3\)):
    • 最低位为1:\(res = 3 \times 81 = 243\)
    • 更新 \(base = 81 \times 81 = 6561\)
    • 右移 \(n = 3 // 2 = 1\)(二进制 1
  • 第4轮\(n = 1\)):
    • 最低位为1:\(res = 243 \times 6561 = 1594323\)
    • 更新 \(base = 6561^2\)
    • 右移 \(n = 0\),结束。
  • 结果:\(3^{13} = 1594323\)

步骤4:加入模运算(计算 \(a^b \mod m\)

在加密算法中常需计算模幂(如 RSA 算法)。只需在每一步乘法后取模即可:

  • 修改更新规则:
    • \(res = (res \times base) \mod m\)
    • \(base = (base \times base) \mod m\)

示例:计算 \(3^{13} \mod 1000\)

  • 第1轮:\(res = 3, base = 9\)
  • 第2轮:\(res = 3, base = 81\)
  • 第3轮:\(res = (3 \times 81) \mod 1000 = 243, base = 6561 \mod 1000 = 561\)
  • 第4轮:\(res = (243 \times 561) \mod 1000 = 136323 \mod 1000 = 323\)
    结果:\(3^{13} \mod 1000 = 323\)

关键点总结

  • 时间复杂度\(O(\log b)\),因每次循环指数 \(n\) 减半。
  • 适用场景:大数幂运算、模幂计算(数论、密码学)。
  • 扩展:可递归实现(分治思想:\(a^b = a^{b/2} \times a^{b/2}\)),但迭代版本更节省栈空间。
快速幂算法 快速幂算法是一种高效计算大整数幂的方法,特别适用于模幂运算(如计算 \( a^b \mod m \))。其核心思想是通过二分降幂,将时间复杂度从朴素的 \( O(b) \) 优化到 \( O(\log b) \)。 问题描述 计算 \( a^b \),其中 \( a \) 和 \( b \) 均为非负整数(通常 \( b \) 很大,例如 \( b \geq 10^9 \))。若直接进行 \( b \) 次乘法,时间成本过高。快速幂利用幂的二进制分解,将计算次数降至对数级。 解题过程 步骤1:理解幂的二进制分解 任意正整数 \( b \) 可以表示为二进制形式,例如 \( b = 13 \) 的二进制是 \( 1101_ 2 \),即: \[ 13 = 1 \cdot 2^3 + 1 \cdot 2^2 + 0 \cdot 2^1 + 1 \cdot 2^0 \] 因此: \[ a^{13} = a^{8} \cdot a^{4} \cdot a^{1} \] 注意:二进制位为0的项(如 \( a^{2} \))被跳过。 步骤2:迭代计算思路 初始化 :设结果 \( res = 1 \),底数 \( base = a \),指数 \( n = b \)。 循环(当 \( n > 0 \) 时) : 若 \( n \) 的当前最低位为1(即 \( n \mod 2 = 1 \)),则将 \( res \) 乘以当前的 \( base \)。 更新 \( base = base \times base \)(相当于计算 \( a^{2^k} \))。 将 \( n \) 右移一位(即 \( n = n // 2 \)),相当于处理下一个二进制位。 终止 :当 \( n = 0 \) 时,\( res \) 即为 \( a^b \)。 步骤3:示例演示(计算 \( 3^{13} \)) 初始:\( res = 1, base = 3, n = 13 \)(二进制 1101 ) 第1轮 (\( n = 13 \)): \( n \) 最低位为1:\( res = 1 \times 3 = 3 \) 更新 \( base = 3 \times 3 = 9 \) 右移 \( n = 13 // 2 = 6 \)(二进制 110 ) 第2轮 (\( n = 6 \)): 最低位为0:\( res \) 不变(仍为3) 更新 \( base = 9 \times 9 = 81 \) 右移 \( n = 6 // 2 = 3 \)(二进制 11 ) 第3轮 (\( n = 3 \)): 最低位为1:\( res = 3 \times 81 = 243 \) 更新 \( base = 81 \times 81 = 6561 \) 右移 \( n = 3 // 2 = 1 \)(二进制 1 ) 第4轮 (\( n = 1 \)): 最低位为1:\( res = 243 \times 6561 = 1594323 \) 更新 \( base = 6561^2 \) 右移 \( n = 0 \),结束。 结果:\( 3^{13} = 1594323 \)。 步骤4:加入模运算(计算 \( a^b \mod m \)) 在加密算法中常需计算模幂(如 RSA 算法)。只需在每一步乘法后取模即可: 修改更新规则: \( res = (res \times base) \mod m \) \( base = (base \times base) \mod m \) 示例:计算 \( 3^{13} \mod 1000 \) 第1轮:\( res = 3, base = 9 \) 第2轮:\( res = 3, base = 81 \) 第3轮:\( res = (3 \times 81) \mod 1000 = 243, base = 6561 \mod 1000 = 561 \) 第4轮:\( res = (243 \times 561) \mod 1000 = 136323 \mod 1000 = 323 \) 结果:\( 3^{13} \mod 1000 = 323 \)。 关键点总结 时间复杂度 :\( O(\log b) \),因每次循环指数 \( n \) 减半。 适用场景 :大数幂运算、模幂计算(数论、密码学)。 扩展 :可递归实现(分治思想:\( a^b = a^{b/2} \times a^{b/2} \)),但迭代版本更节省栈空间。