算法基础 -- 快速幂算法详解

快速幂算法详解

快速幂(Fast Power或Exponentiation by Squaring)是一种能够在 O ( log ⁡ n ) O(\log n) O(logn) 时间复杂度内高效计算幂次(如 a n a^n an)的算法。相比于朴素的逐次相乘(需要 O ( n ) O(n) O(n) 次乘法),快速幂极大地减少了运算次数,尤其当指数 n n n 较大时更显优势。以下从原理、实现思路及具体示例三个方面详细讲解。


一、快速幂的基本原理

计算 a n a^n an 时,可以利用以下两个数学性质:

  1. 幂的拆分

    • a n = a × a n − 1 a^n = a \times a^{n-1} an=a×an1,如果 n n n 是奇数;
    • a n = ( a n / 2 ) 2 a^n = (a^{n/2})^2 an=(an/2)2,如果 n n n 是偶数。
  2. 平方快速翻倍

    如果已经知道 a k a^k ak,那么:
    a 2 k = ( a k ) 2 a^{2k} = (a^k)^2 a2k=(ak)2

通过上述性质,我们可以每次将指数 n n n 的规模减半,从而实现对数级别的处理。

  • n n n 为偶数:
    a n = ( a n / 2 ) 2 a^n = (a^{n/2})^2 an=(an/2)2
  • n n n 为奇数:
    a n = a × a n − 1 a^n = a \times a^{n-1} an=a×an1

通过不断折半,我们最终可以将计算复杂度降低到 O ( log ⁡ n ) O(\log n) O(logn)


二、快速幂的实现思路

实现快速幂的方法包括 递归迭代,常用的是基于“二进制指数拆分”的迭代实现。

1. 递归实现

递归的基本思路是不断将 n n n 按奇偶拆分,直到基准情况(如 n = 0 n=0 n=0 n = 1 n=1 n=1)。伪代码如下:

function fastPower(a, n):if n == 0:return 1if n == 1:return aif n is even:half = fastPower(a, n // 2)return half * halfelse:return a * fastPower(a, n - 1)

2. 迭代实现

迭代实现通过“处理指数的二进制位”来实现。思路如下:

  1. 准备结果变量 res = 1,初始幂底 base = a
  2. n > 0 n > 0 n>0 时,依次处理 n n n 的二进制最低位:
    • 如果最低位是 1(即 n n n 为奇数),则更新结果 res = res * base
    • 无论奇偶,都将 base = base * base
    • n n n 右移一位(n >>= 1,即 n ÷ 2 n \div 2 n÷2)。
  3. 循环结束时,res 即为最终结果。

伪代码如下:

function fastPowerIterative(a, n):res = 1base = awhile n > 0:if (n & 1) == 1:res = res * basebase = base * basen >>= 1return res

3. 快速幂取模

在许多实际问题中,需要计算 a n m o d m a^n \bmod m anmodm。此时可在每次乘法后加入取模操作,避免中间结果过大:

function fastPowerMod(a, n, m):res = 1base = a % mwhile n > 0:if (n & 1) == 1:res = (res * base) % mbase = (base * base) % mn >>= 1return res

通过每次取模操作,可以确保数值始终在合理范围内,不会溢出。


三、示例演算

示例 1:递归实现

计算 3 13 3^{13} 313

  1. n = 13 n = 13 n=13 是奇数,结果为 3 × 3 12 3 \times 3^{12} 3×312
  2. 3 12 = ( 3 6 ) 2 3^{12} = (3^6)^2 312=(36)2
  3. 3 6 = ( 3 3 ) 2 3^6 = (3^3)^2 36=(33)2
  4. 3 3 = 3 × 3 2 3^3 = 3 \times 3^2 33=3×32
  5. 3 2 = ( 3 1 ) 2 3^2 = (3^1)^2 32=(31)2
  6. 3 1 = 3 3^1 = 3 31=3

最终结果为 3 13 = 1594323 3^{13} = 1594323 313=1594323

示例 2:迭代实现

计算 3 13 3^{13} 313,其二进制表示为 13 = 110 1 2 13 = 1101_2 13=11012

  1. res = 1, base = 3, n = 13(1101)
  2. 低位是 1:更新 res = 1 * 3 = 3;更新 base = 3^2 = 9,右移 n = 110 n = 110 n=110
  3. 低位是 0:跳过 res 更新;更新 base = 9^2 = 81,右移 n = 11 n = 11 n=11
  4. 低位是 1:更新 res = 3 * 81 = 243;更新 base = 81^2 = 6561,右移 n = 1 n = 1 n=1
  5. 低位是 1:更新 res = 243 * 6561 = 1594323;更新 base = 6561^2 = 43046721,右移 n = 0 n = 0 n=0
  6. n = 0 n = 0 n=0,循环结束,结果为 1594323 1594323 1594323

四、时间复杂度分析

每次将 n n n 减半,因此时间复杂度为 O ( log ⁡ n ) O(\log n) O(logn),这是快速幂最显著的优势。

  • 递归的空间复杂度: O ( log ⁡ n ) O(\log n) O(logn)(递归深度)。
  • 迭代的空间复杂度: O ( 1 ) O(1) O(1)(仅需常量存储)。

五、总结

  1. 核心思想:利用幂次的奇偶性和二进制表示,逐步将规模缩小到对数级别。
  2. 常见应用
    • 大数运算:计算 a n a^n an 的值;
    • 模运算:如 a n m o d m a^n \bmod m anmodm
    • 矩阵快速幂:用于斐波那契数列等问题。
  3. 实现要点
    • 按指数奇偶分类,折半处理;
    • 取模时加上每次乘法后的模操作,防止溢出。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/6691.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

保健食品注册数据库<一键查询保健食品信息>

在保健品市场竞争激烈的情况下,企业要如何保障产品合规、信息公开,并且能够迅速应对市场变化呢?查询保健食品注册信息是关键环节。 当下,查询保健食品注册信息主要有两种途径:一是利用国家保健食品注册数据库进行查询…

无所不搜,吾爱制造

吾爱论坛作为众多软件资源爱好者的宝藏之地,汇聚了许多优秀的软件作品,堪称软件界的“福地”。许多技术大佬在这里分享自己的创作。 而今天要介绍的,正是吾爱作者“buyaobushuo”自制的多功能娱乐软件——太极。这款软件基于flet开发&#x…

【C++】详细讲解继承(下)

本篇来继续说说继承。上篇可移步至【C】详细讲解继承(上) 1.继承与友元 友元关系不能继承 ,也就是说基类友元不能访问派⽣类私有和保护成员。 class Student;//前置声明class Same //基类 { public:friend void Fun(const Same& p, con…

【二叉树】4. 判断一颗二叉树是否是平衡二叉树。5. 对称二叉树。6. 二叉树的构建及遍历 7. 二叉树的分层遍历 。

判断一颗二叉树是否是平衡二叉树。OJ链接 可以在求树高度的过程中判断树是否平衡 对称二叉树。OJ链接 二叉树的构建及遍历。OJ链接 注意:public static int i最好把static去掉 否则当有多个测试用例时 i无法重新为0二叉树的分层遍历 。OJ链接 但此题要求返回List…

代码随想录刷题day14(2)|(链表篇)02.07. 链表相交(疑点)

目录 一、链表理论基础 二、链表相交求解思路 三、相关算法题目 四、疑点 一、链表理论基础 代码随想录 二、链表相交求解思路 链表相交时,是结点的位置,也就是指针相同,不是结点的数值相同; 思路:定义两个指针…

IDE提示:因为在此系统上禁止运行脚本。有关详细信息,请参阅 https:/go.microsoft.com/fwlink/?LinkID=135170

问题情况 不知道为什么我的IDE终端运行命令的时候总提示以下内容: Import-Module : 无法加载文件 D:\Anaconda3\shell\condabin\Conda.psm1,因为在此系统上禁止运行脚本。有关详细信息,请参阅 https:/go.microsoft.com/fwlink/?LinkID1351…

Android中Service在新进程中的启动流程3

目录 1、AMS调用客户端onCreate前的准备工作 2、AMS调用客户端onCreate方法 3、AMS调用客户端的onBind方法 4、AMS调用客户端onStart前的准备 5、AMS调用客户端onStart方法 还是先放上Service启动流程概览图,如下: 上一篇文章, 我们分析…

MVCC底层原理实现

MVCC的实现原理 了解实现原理之前,先理解下面几个组件的内容 1、 当前读和快照读 先普及一下什么是当前读和快照读。 当前读:读取数据的最新版本,并对数据进行加锁。 例如:insert、update、delete、select for update、 sele…

基于Springboot + vue实现的在线装修管理系统

“前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站:人工智能学习网站” 💖学习知识需费心, 📕整理归纳更费神。 🎉源码免费人人喜…

【多视图学习】显式视图-标签问题:多视图聚类的多方面互补性研究

Explicit View-labels Matter:A Multifacet Complementarity Study of Multi-view Clustering TPAMI 2024 论文链接 代码链接 0.论文摘要 摘要-一致性和互补性是促进多视图聚类(MVC)的两个关键因素。最近,随着流行的对比学习的引入&#…

Docker Hub 全面解析及应对策略

在现代 DevOps 和容器化应用开发中,Docker Hub 是一个不可或缺的工具。然而,一些地区或企业对 Docker Hub 的访问受到限制,甚至全面禁止。这种现象引发了开发者和运维人员的广泛关注。那么,为什么 Docker Hub 会被禁用&#xff1f…

掌握Spring事务隔离级别,提升并发处理能力

Spring框架支持的事务隔离级别与标准的JDBC隔离级别保持一致,共包括五大隔离级别,它们分别是:DEFAULT(默认隔离级别)、READ_UNCOMMITTED(读未提交)、READ_COMMITTED(读已提交&#x…

Rabbitmq高级特性之消费方确认

背景: 发送方发送消息之后,到达消费端之后,可能会有以下情况:消息处理成功,消息处理异常。RabbitMQ在向消费者发送消息之后,就会把这条消息给删除掉,那么第二种情况,就会造成消息丢…

[C]基础8.详解操作符

博客主页:算法歌者本篇专栏:[C]您的支持,是我的创作动力。 文章目录 0、总结1、操作符的分类2、二进制和进制转换2.1、2进制转10进制2.2、10进制转2进制2.3、2进制转8进制和16进制 3、原码、反码、补码4、移位操作符4.1 左移操作符4.2 右移操…

【豆包MarsCode蛇年编程大作战】花样贪吃蛇

目录 引言 展示效果 prompt提示信息 第一次提示(实现基本功能) 初次实现效果 第二次提示(美化UI) 第一次美化后的效果 第二次美化后的效果 代码展示 实现在线体验链接 码上掘金使用教程 体验地址: 花样贪吃蛇…

【Maui】注销用户,采用“手势”点击label弹窗选择

文章目录 前言一、问题描述二、解决方案三、软件开发(源码)3.1 方法一:前端绑定3.2 方法二:后端绑定3.3 注销用户的方法 四、项目展示 前言 .NET 多平台应用 UI (.NET MAUI) 是一个跨平台框架,用于使用 C# 和 XAML 创…

RoCE网络及其协议栈详解(没有中间商赚差价的网络)

引言 随着数据中心对高性能、低延迟通信需求的不断增长,传统的TCP/IP以太网连接已经难以满足现代应用的要求。为了解决这些问题,RDMA(Remote Direct Memory Access)技术应运而生。RDMA是一种允许网络中的不同计算机直接访问对方内…

数据结构:二叉树—面试题(一)

目录 1、相同的树 2、另一棵树的子树 3、翻转二叉树 4、平衡二叉树 5、对称二叉树 6、二叉树遍历 7、二叉树的分层遍历 1、相同的树 习题链接https://leetcode.cn/problems/same-tree/description/https://leetcode.cn/problems/same-tree/description/ 描述&#xff1a…

2025年新开局!谁在引领汽车AI风潮?

汽车AI革命已来。 在2025年伊始开幕的CES展上,AI汽车、AI座舱无疑成为了今年汽车行业的最大热点。其中不少车企在2025年CES上展示了其新一代AI座舱,为下一代智能汽车的人机交互、场景创新率先打样。 其中,东软集团也携带AI驱动、大数据支撑…

HarmonyOS Next 应用UI生成工具介绍

背景 HarmonyOS Next适配开发过程中难买难要参考之前逻辑,但是可能时间较长文档不全,只能参考Android或iOS代码,有些逻辑较重的场景还可以通过AI工具将Android 的Java代码逻辑转成TS完成部分复用。对于一些UI场景只能手动去写,虽…