快速幂算法(模重复平方法)
字数 879 2025-11-11 01:19:03

快速幂算法(模重复平方法)

快速幂算法是一种用于高效计算大整数幂的算法,特别适用于模幂运算(如计算a^b mod m)。其时间复杂度从朴素算法的O(b)优化到O(log b)。

问题描述
给定底数a、指数b和模数m(可选),计算a^b或a^b mod m。其中a、b、m可能都是很大的整数(如b可达10^9),要求高效计算。

算法原理
快速幂基于幂的二进制表示和分治思想。核心观察是指数b可以表示为二进制数,从而将a^b分解为多个a的2的幂次方的乘积。

解题步骤

  1. 初始化结果:将结果变量res初始化为1(因为任何数的0次幂为1)。
  2. 循环处理指数的每一位:当指数b大于0时循环:
    • 检查最低位:如果b的二进制表示的最低位为1(即b为奇数),则将当前底数a乘到结果res中。
    • 底数平方:将底数a平方(即计算a^2),为处理下一位做准备。
    • 指数右移:将指数b右移一位(相当于b除以2并向下取整),处理下一个二进制位。
  3. 返回结果:循环结束后,res即为a^b的结果。

带模运算的扩展
当需要计算a^b mod m时,只需在每一步乘法后立即取模,防止数值溢出:

  • res = (res * a) % m
  • a = (a * a) % m

示例演示
计算3^13(a=3, b=13):

  1. b=13(二进制1101)为奇数 → res=1*3=3, a=3^2=9, b=6
  2. b=6(二进制110)为偶数 → res不变, a=9^2=81, b=3
  3. b=3(二进制11)为奇数 → res=3*81=243, a=81^2=6561, b=1
  4. b=1(二进制1)为奇数 → res=243*6561=1594323, a=6561^2, b=0
    结果:3^13=1594323

复杂度分析

  • 时间复杂度:O(log b),因为指数b每次减半
  • 空间复杂度:O(1),仅需常数额外空间

应用场景

  1. 密码学中的模幂运算(如RSA加密)
  2. 大数计算中的幂运算
  3. 算法竞赛中的高效计算需求

该算法通过二进制分解将线性计算优化为对数级,是处理大数幂运算的标准方法。

快速幂算法(模重复平方法) 快速幂算法是一种用于高效计算大整数幂的算法,特别适用于模幂运算(如计算a^b mod m)。其时间复杂度从朴素算法的O(b)优化到O(log b)。 问题描述 给定底数a、指数b和模数m(可选),计算a^b或a^b mod m。其中a、b、m可能都是很大的整数(如b可达10^9),要求高效计算。 算法原理 快速幂基于幂的二进制表示和分治思想。核心观察是指数b可以表示为二进制数,从而将a^b分解为多个a的2的幂次方的乘积。 解题步骤 初始化结果 :将结果变量res初始化为1(因为任何数的0次幂为1)。 循环处理指数的每一位 :当指数b大于0时循环: 检查最低位 :如果b的二进制表示的最低位为1(即b为奇数),则将当前底数a乘到结果res中。 底数平方 :将底数a平方(即计算a^2),为处理下一位做准备。 指数右移 :将指数b右移一位(相当于b除以2并向下取整),处理下一个二进制位。 返回结果 :循环结束后,res即为a^b的结果。 带模运算的扩展 当需要计算a^b mod m时,只需在每一步乘法后立即取模,防止数值溢出: res = (res * a) % m a = (a * a) % m 示例演示 计算3^13(a=3, b=13): b=13(二进制1101)为奇数 → res=1* 3=3, a=3^2=9, b=6 b=6(二进制110)为偶数 → res不变, a=9^2=81, b=3 b=3(二进制11)为奇数 → res=3* 81=243, a=81^2=6561, b=1 b=1(二进制1)为奇数 → res=243* 6561=1594323, a=6561^2, b=0 结果:3^13=1594323 复杂度分析 时间复杂度:O(log b),因为指数b每次减半 空间复杂度:O(1),仅需常数额外空间 应用场景 密码学中的模幂运算(如RSA加密) 大数计算中的幂运算 算法竞赛中的高效计算需求 该算法通过二进制分解将线性计算优化为对数级,是处理大数幂运算的标准方法。