快速幂算法【算法 08】

打印 上一主题 下一主题

主题 533|帖子 533|积分 1599

快速幂算法详解


在计算机编程中,快速幂算法是一种高效计算大整数幂次的算法。相较于直接的暴力计算,快速幂能够在对数级别的时间复杂度下完成运算,因此它在许多算法和问题中(如数论、组合数学、暗码学等)都有广泛的应用。
1. 什么是快速幂?

快速幂算法的核心头脑是将指数分解为二进制形式,使用“幂的二次方”特性,将时间复杂度从O(n)(通例幂运算必要乘法 n 次)降低到O(log n)
举个例子

假设我们要计算 (a^{13}):


  • 直接计算的话必要 (a) 乘以自己 13 次。
  • 但是通过快速幂,我们可以先将 13 表现为二进制数:(13 = 1101_2)。
于是,可以使用以下公式快速计算:
                                                    a                               13                                      =                                       a                                           110                                               1                                     2                                                             =                                       a                               8                                      ×                                       a                               4                                      ×                            a                                  a^{13} = a^{1101_2} = a^8 \times a^4 \times a                     a13=a11012​=a8×a4×a
每次将幂指数减半,同时将基数平方,从而淘汰计算量。
2. 算法的核心头脑

快速幂的核心是通过分治法的头脑,将一个大问题分解为若干个小问题。假设我们要计算 (a^b),可以分为两种情况:

  • b 为偶数时
                                                                    a                                     b                                              =                                  (                                               a                                                   b                                        /                                        2                                                                        )                                     2                                                      a^b = (a^{b/2})^2                           ab=(ab/2)2
    比方:
                                                       (                                               a                                     4                                              =                                  (                                               a                                     2                                                           )                                     2                                              )                                          (a^4 = (a^2)^2)                           (a4=(a2)2)
  • b 为奇数时
                                                                    a                                     b                                              =                                  a                                  ×                                               a                                                   b                                        −                                        1                                                                   a^b = a \times a^{b-1}                           ab=a×ab−1
    比方:
                                                       (                                               a                                     5                                              =                                  a                                  ×                                               a                                     4                                              )                                          (a^5 = a \times a^4)                           (a5=a×a4)
使用这种递归分解的方式,可以在对数级别的时间内完成大幂次计算。
3. 代码实现

递归实现

  1. def fast_pow(a, b):
  2.     if b == 0:
  3.         return 1
  4.     temp = fast_pow(a, b // 2)
  5.     if b % 2 == 0:
  6.         return temp * temp
  7.     else:
  8.         return temp * temp * a
复制代码
非递归实现

非递归实现的版本使用循环,可以避免递归深度过深的问题。
  1. def fast_pow_iterative(a, b):
  2.     result = 1
  3.     base = a
  4.     while b > 0:
  5.         if b % 2 == 1:
  6.             result *= base
  7.         base *= base
  8.         b //= 2
  9.     return result
复制代码
4. 时间复杂度分析

在上面的算法中,指数 (b) 每次都被淘汰一半,因此总的递归或循环次数为 (O(\log b))。相较于平凡幂运算的时间复杂度 (O(b)),快速幂大大提高了计算服从,尤其在处理大整数时,上风更加明显。
5. 快速幂的应用

快速幂算法在多个范畴都有应用,包罗但不限于:

  • 模幂运算:快速幂常用于计算大数取模。比方,在RSA算法中,必要计算巨大的幂次模运算。
  • 矩阵快速幂:快速幂同样适用于矩阵的幂次计算,特别是在求解递归数列(如斐波那契数列)时能大大加速计算。
  • 数论问题:如欧拉定理、费马小定理等都可以通过快速幂来实现高效运算。
示例:模幂运算

  1. def mod_exp(a, b, m):
  2.     result = 1
  3.     base = a % m
  4.     while b > 0:
  5.         if b % 2 == 1:
  6.             result = (result * base) % m
  7.         base = (base * base) % m
  8.         b //= 2
  9.     return result
复制代码
在上述代码中,模幂运算的复杂度同样是 (O(\log b)),这是由于幂指数每次都淘汰一半,同时确保结果在每一步都举行模运算以防止数值溢出。
6. 总结

快速幂算法通过淘汰幂运算的次数,从而将时间复杂度降到了对数级别。它在各种现实场景中的应用显现了其高效性和实用性。假如你必要处理大整数幂次运算,快速幂无疑是一个理想的选择。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

温锦文欧普厨电及净水器总代理

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表