当前位置: 首页 > news >正文

快速幂算法详解

快速幂(Fast Exponentiation 或 Exponentiation by Squaring)是一种高效计算大数幂运算的算法,时间复杂度为 O(log n),比普通的 O(n) 逐次乘法快得多。

一、快速幂基于以下数学原理:

快速幂算法的核心思想是通过分治策略平方操作来减少计算次数。下面我将详细解释这两种情况的数学原理:

1. 当指数为偶数时:aⁿ = (aⁿᐟ²)²

数学推导:​

  • 当 n 是偶数时,可以表示为 n = 2k(其中 k 是整数)
  • 因此:
    aⁿ = a²ᵏ = (aᵏ)²
    即:​aⁿ = (aⁿᐟ²)²

实际意义:​

  • 计算 aⁿ 时,先计算 aⁿᐟ²(即 aᵏ),然后将其结果平方
  • 这样将问题规模减半,减少了乘法次数

示例:计算 2¹⁰

  • 10 是偶数 → 2¹⁰ = (2⁵)²
  • 先计算 2⁵ = 32
  • 再平方:32² = 1024
  • 原本需要 9 次乘法(2×2×...×2),现在只需 5 次(2⁵算4次 + 1次平方)

2. 当指数为奇数时:aⁿ = a × aⁿ⁻¹ = a × (a⁽ⁿ⁻¹⁾ᐟ²)²

数学推导:​

  • 当 n 是奇数时,可以表示为 n = 2k + 1
  • 因此:
    aⁿ = a²ᵏ⁺¹ = a × a²ᵏ = a × (aᵏ)²
    即:​aⁿ = a × (a⁽ⁿ⁻¹⁾ᐟ²)²

实际意义:​

  • 先减 1 变成偶数(n-1),然后对半拆分
  • 最后多乘一个 a 来补回减去的 1

示例:计算 3⁷

  • 7 是奇数 → 3⁷ = 3 × 3⁶
  • 6 是偶数 → 3⁶ = (3³)²
  • 计算 3³ = 27
  • 平方:27² = 729
  • 最终:3 × 729 = 2187
  • 原本需要 6 次乘法,现在只需 4 次(3³算2次 + 1次平方 + 1次乘3)

3.递归实现

def fast_pow(a, n):if n == 0:return 1elif n % 2 == 0:  # 偶数half = fast_pow(a, n // 2)return half * halfelse:  # 奇数return a * fast_pow(a, n - 1)

4.迭代实现

def fast_pow(a, n):result = 1          # 初始化结果为1(因为任何数的0次方都是1)while n > 0:        # 当指数n大于0时继续循环if n % 2 == 1:  # 如果当前n是奇数(二进制最后一位为1)result *= a  # 将当前的a乘入结果a *= a          # a平方(为下一轮做准备)n = n // 2      # n右移一位(相当于n//2)return result       # 返回最终结果

5.带模运算的快速幂

在计算大数幂时通常需要取模:

def fast_pow_mod(a, n, mod):result = 1a = a % mod  # 先取模防止溢出while n > 0:if n % 2 == 1:result = (result * a) % moda = (a * a) % modn = n // 2return result

应用场景

  1. 密码学(RSA等加密算法)
  2. 大数计算
  3. 矩阵快速幂(用于动态规划优化)
  4. 计算组合数取模

快速幂算法将幂运算的时间复杂度从O(n)降低到O(log n),对于大指数计算非常高效。

http://www.xdnf.cn/news/430687.html

相关文章:

  • 【前端】【JavaScript】【总复习】四万字详解JavaScript知识体系
  • 【C++进阶篇】二叉搜索树的实现(赋源码)
  • 国产大模型「五强争霸」,决战AGI!
  • upload-labs通关笔记-第3关 文件上传之黑名单绕过
  • 数据结构(2)线性表-顺序表
  • 二次封装 el-dialog 组件:打造更灵活的对话框解决方案
  • VUE_UI组件的二次封装
  • Redis Cluster 集群搭建和集成使用的详细步骤示例
  • 微信小程序分包策略:优化加载性能与用户体验
  • 使用Kubernetes实现零停机部署
  • android抓包踩坑记录
  • linux系统如何将采集的串口数据存储到txt
  • TCP首部格式及三次握手四次挥手
  • 操作系统导论——第29章 基于锁的并发数据结构
  • 【25软考网工】第六章(5)应用层安全协议
  • 讯联云库项目开发日志(一)
  • 记录算法笔记(2025.5.13)二叉树的最大深度
  • 基于STM32、HAL库的ADAU1701JSTZ-RL音频接口芯片驱动程序设计
  • flink的TaskManager 内存模型
  • 奇怪的公式
  • 代码随想录三十七天 完全背包二维 完全背包一维 518. 零钱兑换 II 377. 组合总和 Ⅳ
  • 视频编解码学习十一之视频原始数据
  • 思维链实现 方式解析
  • Python----神经网络(《Inverted Residuals and Linear Bottlenecks》论文概括和MobileNetV2网络)
  • 简单介绍Qt的属性子系统
  • Python爬虫(26)Python爬虫高阶:Scrapy+Selenium分布式动态爬虫架构实践
  • MLA (Multi-head Attention Layer) 详细说明
  • 报告研读:125页2024年大模型轻量化技术研究报告——技术详细讲解【附全文阅读】
  • 9、Activiti-任务(Task)的相关操作
  • 深入浅出MySQL 8.0:新特性与最佳实践