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

快速幂fast_pow

快速幂算法讲解

快速幂算法是一种高效计算幂运算的算法,其核心思想是利用指数的二进制分解,把幂运算的时间复杂度从 O(p) 降低到 O(logp)。

原理

假设要计算 an,将 n 表示成二进制形式:n=2k1​+2k2​+⋯+2km​,那么 an=a2k1​+2k2​+⋯+2km​=a2k1​×a2k2​×⋯×a2km​。

例如,计算 {3^{13}},13 的二进制是 1101,即 13=2^{3}+2^{2}+2^{0},那么 3^{13}=2^{3}×2^{2}×2^{0}

代码

#include <iostream>
using namespace std;

long long fast_pow(long long a, long long b, long long k) {
    long long result = 1;
    while (b > 0) {
        if (b % 2 == 1) {
            result = (result * a) % k;
        }
        a = (a * a) % k;
        b /= 2;
    }
    return result;
}

int main() {
    long long b, p, k;
    cin >> b >> p >> k;
    cout << fast_pow(b, p, k) << endl;
    return 0;
}

我们以计算 (3 ^ 13) % 10 为例,对修正后的 C++ 代码进行一步一步的分析。

分析过程

初始化

在 fast_pow 函数开始时,有如下初始化操作:

  • a = 3(底数)
  • b = 13(指数)
  • k = 10(模数)
  • result = 1
第一次循环
  • 判断 b 是否为奇数b = 1313 % 2 == 1,满足条件。所以执行 result = (result * a) % k,即 result = (1 * 3) % 10 = 3
  • 更新 aa = (a * a) % k,也就是 a = (3 * 3) % 10 = 9
  • 更新 bb /= 2b 变为 6

此时各变量的值为:

  • a = 9
  • b = 6
  • k = 10
  • result = 3
第二次循环
  • 判断 b 是否为奇数b = 66 % 2 == 0,不满足条件,不更新 result
  • 更新 aa = (a * a) % k,即 a = (9 * 9) % 10 = 81 % 10 = 1
  • 更新 bb /= 2b 变为 3

此时各变量的值为:

  • a = 1
  • b = 3
  • k = 10
  • result = 3
第三次循环
  • 判断 b 是否为奇数b = 33 % 2 == 1,满足条件。执行 result = (result * a) % k,即 result = (3 * 1) % 10 = 3
  • 更新 aa = (a * a) % k,也就是 a = (1 * 1) % 10 = 1
  • 更新 bb /= 2b 变为 1

此时各变量的值为:

  • a = 1
  • b = 1
  • k = 10
  • result = 3
第四次循环
  • 判断 b 是否为奇数b = 11 % 2 == 1,满足条件。执行 result = (result * a) % k,即 result = (3 * 1) % 10 = 3
  • 更新 aa = (a * a) % k,也就是 a = (1 * 1) % 10 = 1
  • 更新 bb /= 2b 变为 0

此时各变量的值为:

  • a = 1
  • b = 0
  • k = 10
  • result = 3
循环结束

由于 b = 0,不满足 while (b > 0) 的条件,循环结束,函数返回 result 的值 3

所以,(3 ^ 13) % 10 的结果是 3。这种快速幂算法通过不断将指数 b 减半,减少了乘法运算的次数,时间复杂度为 O(logb)。

http://www.dtcms.com/a/121255.html

相关文章:

  • [Redis]redis-windows下载安装与使用
  • AI模型多阶段调用进度追踪系统设计文档
  • spark运行架构
  • 神舟平板电脑怎么样?平板电脑能当电脑用吗?
  • DB2数据库专用python库--ibm_db
  • 计算机控制系统:HX1838红外遥控器解码
  • # 深度学习中的优化算法详解
  • 利用高阶函数实现AOP
  • 蓝桥杯第十五届C++B组省赛真题解析
  • Appium工作原理及环境的搭建(1)
  • 系统性能核心指标:QPS、TPS、RT、并发量详解
  • NVIDIA PhysX 和 Flow 现已完全开源
  • 《Sqoop 快速上手:安装 + 测试实战》
  • 绿电直供零碳园区:如何用清洁能源重塑企业竞争力?
  • 力扣刷题day1(java自用)
  • Cursor编程-从入门到精通__0409
  • Java常用工具算法-6--秘钥托管云服务AWS KMS
  • 西门子S7-1200PLC 工艺指令PID_Temp进行控温
  • spring mvc中不同服务调用类型(声明式(Feign)、基于模板(RestTemplate)、基于 SDK、消息队列、gRPC)对比详解
  • 【Proteus仿真】【32单片机-A008】MPX4115压力检测系统设计
  • Linux环境防火墙常用配置说明
  • UGUI源代码之Text—实现自定义的字间距属性
  • AutoModelForCausalLM 解析,因果模型
  • MyBatis中特殊符号处理总结
  • 安卓性能调优之-检测应用启动速度
  • 在Flutter中使用BottomNavigationBar和IndexedStack可以实现一个功能完整的底部导航栏
  • 适用于恶劣工业环境的高功率PoE+网管交换机
  • 状态管理组件Pinia 简介与底层原理 、Pinia 与其他状态管理库对比、Vue3 + Element Plus + Pinia 安装配置详解
  • DAPP实战篇:使用ethers.js连接以太坊智能合约
  • 数字图像相关(DIC)技术在土木行业的部分应用