快速幂算法详解:从暴力到优雅的数学优化

文章目录

  • 一、朴素幂运算的问题
  • 二、快速幂的数学原理
  • 三、快速幂的递归实现
  • 四、快速幂的迭代实现
  • 五、模运算下的快速幂
  • 六、快速幂的应用场景
  • 七、总结

快速幂是一种高效计算幂运算的算法,能够将时间复杂度从朴素的 O (n) 降低到 O (log n)。本文将深入探讨快速幂的原理、实现和应用场景。

一、朴素幂运算的问题

计算 a^n 最直接的方法是循环 n 次:

long long power(long long a, long long n) {long long result = 1;for (int i = 0; i < n; i++) {result *= a;}return result;
}

这种方法的时间复杂度为 O (n),当 n 非常大时(如 10^9),计算效率极低,甚至可能超时。

二、快速幂的数学原理

快速幂的核心思想是利用指数的二进制分解。例如,计算 3^13:

  1. 将指数 13 转换为二进制:13 = 1101 (2) = 8 + 4 + 1
  2. 3^13 = 3^(8+4+1) = 3^8 × 3^4 × 3^1

这样,我们只需要计算 3^1, 3^2, 3^4, 3^8 这几个值,然后将指数二进制表示中对应位为 1 的项相乘即可。

三、快速幂的递归实现

递归实现快速幂更加直观:

long long quickPower(long long a, long long n) {if (n == 0) return 1;if (n % 2 == 1) return a * quickPower(a, n - 1);else {long long temp = quickPower(a, n / 2);return temp * temp;}
}

递归的思路是:

  • 如果 n 为 0,返回 1
  • 如果 n 为奇数,分解为 a × a^(n-1)
  • 如果 n 为偶数,分解为 (a^(n/2))^2

四、快速幂的迭代实现

迭代实现更加高效,避免了递归带来的函数调用开销:

long long quickPower(long long a, long long n) {long long result = 1;while (n > 0) {if (n & 1) result *= a;  // 如果当前位为1,累乘到结果a *= a;  // 底数平方n >>= 1;  // 指数右移一位}return result;
}

迭代的核心逻辑是:

  1. 初始化结果为 1
  2. 循环处理指数的每一位
  3. 如果当前位为 1,将当前底数乘入结果
  4. 底数平方,指数右移

五、模运算下的快速幂

在实际应用中,幂运算的结果往往非常大,需要对结果取模:

long long quickPower(long long a, long long n, long long mod) {long long result = 1;a %= mod;  // 防止初始值过大while (n > 0) {if (n & 1) result = (result * a) % mod;a = (a * a) % mod;n >>= 1;}return result;
}

六、快速幂的应用场景

  1. 密码学:RSA 算法中大量使用模幂运算
  2. 数论问题:如计算大指数的余数
  3. 动态规划:状态转移方程中可能涉及幂运算
  4. 矩阵快速幂:计算递推数列的高效方法

七、总结

快速幂算法通过利用指数的二进制分解,将幂运算的时间复杂度从 O (n) 优化到 O (log n),是一种非常高效的算法。迭代实现避免了递归调用的开销,是实际应用中的首选。在处理大数问题时,模运算下的快速幂尤为重要。

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

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

相关文章

HTML+CSS 动态菜单和登录框

摘要 实现了一个现代化的登录/注册界面&#xff0c;包含导航栏和弹窗表单。 HTML结构采用了响应式设计&#xff0c;包含Logo、导航链接和登录按钮。 CSS样式实现了背景图片、导航栏悬浮效果和表单美化&#xff0c;使用伪元素实现链接下划线动画。 JavaScript实现了弹窗切换…

抖音AI数字人对口型软件LatentSync最新版整合包,音频驱动口型讲话

本次和大家分享一个字节跳动开发的强大的音频驱动口型数字人视频制作软件LatentSync&#xff0c;我以前也分享过不少类似软件了&#xff0c;比如&#xff1a;EchoMimic、VideoReTalking、hallo。字节的推出的这个效果稍微更好一点&#xff0c;我制作了最新版的一键启动整合包。…

深入理解 PyTorch:从基础到高级应用

在深度学习的浪潮中&#xff0c;PyTorch 凭借其简洁易用、动态计算图等特性&#xff0c;迅速成为众多开发者和研究人员的首选框架。本文将深入探讨 PyTorch 的核心概念、基础操作以及高级应用&#xff0c;带你全面了解这一强大的深度学习工具。​ 一、PyTorch 简介​ PyTorch…

Java 中的 synchronized 与 Lock:深度对比、使用场景及高级用法

&#x1f4a1; 前言 在多线程并发编程中&#xff0c;线程安全问题始终是开发者需要重点关注的核心内容之一。Java 提供了多种机制来实现同步控制&#xff0c;其中最常用的两种方式是&#xff1a; 使用 synchronized 关键字使用 java.util.concurrent.locks.Lock 接口&#xf…

Notepad++如何列选

在 Notepad 中&#xff0c;你可以通过 列模式&#xff08;Column Mode&#xff09; 进行垂直选择文本&#xff08;列选&#xff09;&#xff0c;以下是具体操作方法&#xff1a; 方法 1&#xff1a;键盘 鼠标列选 按住 Alt 键&#xff08;或 Alt Shift&#xff09;。 按住鼠…

华为OD机考-水仙花数Ⅰ-逻辑分析(JAVA 2025B卷)

import java.util.*; public static Integer get(int count,int c){if(count<3||count>7){return -1;}//存储每位数的最高位……最低位int[] arr new int[count];List<Integer> res new ArrayList<>();for(int i(int) Math.pow(10,count-1);i<(int) Math…

基于 STL+VMD 二次分解的 Informer-LSTM 并行预测模型详解与案例

一、背景与动机 在时间序列预测中,如电力负荷、风速、交通流量等复杂数据常表现为: 非线性:趋势+季节+突变+噪声 多尺度:高频扰动与低频变化共存 长时依赖:远期信息也影响当前预测 传统模型(如 ARIMA、LSTM)往往无法兼顾全局趋势建模与局部扰动感知,因此我们提出一种 …

【Linux Learning】SSH连线出现警告:WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!

问题&#xff1a;WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY! Someone could be eavesdropping on you right now (man-in-the-middle attack)! It is al…

轻量级密码算法PRESENT的C语言实现(无第三方库)

一、PRESENT算法介绍 PRESENT是一种超轻量级分组密码算法&#xff0c;由Bogdanov等人在2007年提出&#xff0c;专门为资源受限环境如RFID标签和传感器网络设计。该算法在硬件实现上仅需1570个门等效电路(GE)&#xff0c;在保持较高安全性的同时实现了极小的硬件占用空间。PRES…

if的简化书写,提高执行效率

很多时候可能有下面判断 if(a0) {b1;} else if(a1) {b0;} 就是ba的反向值&#xff1a; a0;b1&#xff1b; a1;b0; 这时&#xff0c;可以简化如下&#xff1a; ba^1 使用异或&#xff0c;程序更简洁&#xff0c;执行效率也更高 其他的也可以类似使用按位异或优化代码

Vim 调用外部命令学习笔记

Vim 外部命令集成完全指南 文章目录 Vim 外部命令集成完全指南核心概念理解命令语法解析语法对比 常用外部命令详解文本排序与去重文本筛选与搜索高级 grep 搜索技巧文本替换与编辑字符处理高级文本处理编程语言处理其他实用命令 范围操作示例指定行范围处理复合命令示例 实用技…

bash挖矿木马事件全景复盘与企业级防御实战20250612

&#x1f427; CentOS “-bash 挖矿木马” 事件全景复盘与企业级防御实战 ✍️ 作者&#xff1a;Narutolxy | &#x1f4c5; 日期&#xff1a;2025-06-12 | &#x1f3f7;️ 标签&#xff1a;Linux 安全、应急响应、运维加固、实战复盘 &#x1f4d8; 内容简介 本文是一场真实…

「Linux中Shell命令」Shell命令基础

知识点详细解析 Shell简介 Shell是Linux操作系统系统中用户与操作系统内核交互的接口。它既是命令解释器,负责接收用户输入的命令并将其转换为内核能够理解的指令,也是一种脚本编程语言。作为Linux操作系统的重要组成部分,Shell扮演着用户与系统内核之间的"中间人"…

202557读书笔记|《梦里花落知多少(轻经典)》——有你在的地方才最美

《梦里花落知多少&#xff08;轻经典&#xff09;》作者三毛&#xff0c;物极必反&#xff0c;阴晴圆缺&#xff0c;小满即万全么&#xff1f;因为幸福过于满溢。所以幸福被收走了。 没有看过太多三毛的作品&#xff0c;给我的感觉她是很敏感&#xff0c;多愁善感及没有安全感…

对象映射 C# 中 Mapster 和 AutoMapper 的比较

Mapster和AutoMapper是C#领域两大主流对象映射库&#xff0c;各具特色。Mapster以高性能著称&#xff0c;使用表达式树实现零反射映射&#xff0c;首次编译后执行效率极高&#xff0c;适合对性能敏感的场景&#xff1b;AutoMapper则提供更丰富的功能集&#xff0c;如条件映射和…

QEMU源码全解析 —— 块设备虚拟化(26)

接前一篇文章:QEMU源码全解析 —— 块设备虚拟化(25) 本文内容参考: 《趣谈Linux操作系统》 —— 刘超,极客时间 《QEMU/KVM源码解析与应用》 —— 李强,机械工业出版社 Virt

微软PowerBI考试 PL300-选择 Power BI 模型框架【附练习数据】

微软PowerBI考试 PL300-选择 Power BI 模型框架 20 多年来&#xff0c;Microsoft 持续对企业商业智能 (BI) 进行大量投资。 Azure Analysis Services (AAS) 和 SQL Server Analysis Services (SSAS) 基于无数企业使用的成熟的 BI 数据建模技术。 同样的技术也是 Power BI 数据…

RED DA认证-EN18031网络安全常见问题以及解答

Q&#xff1a;RED DA是否对所有无线模块和设备强制要求&#xff1f; A&#xff1a;是的&#xff0c;RED DA适用于欧盟境内销售的所有无线设备&#xff0c;包括WWAN、蓝牙或Wi-Fi模块。唯一例外是GNSS模块&#xff08;仅支持接收功能&#xff0c;无需认证&#xff09;。 Q&…

腾讯开源 ovCompose 跨平台框架:实现一次跨三端(Android/iOS/鸿蒙)

在移动应用开发领域&#xff0c;跨平台技术一直是开发者们追求的目标&#xff0c;它能够帮助企业降低开发成本、提高开发效率&#xff0c;同时保证应用在不同平台上的一致性体验。2025 年 6 月 3 日&#xff0c;腾讯视频团队迎来了一个重要的里程碑 —— 正式发布 ovCompose 跨…

对3D对象进行形变分析

1&#xff0c;目的 分析3D实例对象相对标准参照物的形变。 一般用于质地较软的材质&#xff08;例如橡胶&#xff0c;布料&#xff09;查找&#xff0c;检查等。 标准参考模型 需匹配的实例&#xff1a; 形变后的模型&#xff1a;* 形变后的模型&#xff1a; 实例形变后的…