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

两种求快速幂的方法

二进制思路

首先有如下两个等式:
截屏2025-09-10 20.25.20
2. \(5^{2^{(n+1)}}=(5^2)^{2^{n}}\)
对于二进制,我们不需要将其转换为二进制,只需将指数n&1即可判断其末位是否为1 。
完成一次判断后,将n右移一位n>>=1再判断新的末尾即可判断每一位是1或者是2 。

对于指数中\(2^n\)\(2^{(n+1)}\),也不需要单独计算,只需每次将底数平方即可(依据公式2)。

初始化

计算\(5^3\)
res=1记录累乘的结果。

核心逻辑

判断指数3的末位如为1,res更新为res*5,等价于$ 5^{( 1 * 2^0)} $ 。
(假如此时判断末位为0,则跳过后半句,执行更新底数) 。
更新底数5为5^2
指数3右移一位变为\((01)_2\)
循环执行上述部分直到指数<=0 。

//exp为指数,x为底数
double res=1.0;while(exp>0){if(exp&1){res*=x;}x*=x;exp>>=1;}

指数折半的思路

对于\(2^7\)我们可以表示为:
\(2^7=2 * 2^6 =2 * (4 ^3)\)\(4^3=4 * (16^1)\)
同理对于\(3^6\)可以表示为:
\(3^6=(9^3)=9 * (18^1)\)
得到规律:指数为偶数时,指数直接折半,底数平方。
指数为奇数时,先拆一个底数到外面,再折半指数,底数平方
代码如下:

//exp为指数,x为底数
double res=1.0;
while(exp>0){if(exp&1){//如果指数为奇数,拆一个底数与其相乘res*=x;}//底数平方x*=x;//指数折半exp>>=1;}

我们发现两种思路代码完全一致,仅仅是理解方式上有所不同。

http://www.zskr.cn/news/1937.html

相关文章:

  • 杂题20250909-
  • ARC199 做题记
  • 深入理解Redis高并发分布式锁
  • 计算机硬件基础认知
  • 测试一下iframe
  • ECT-OS-JiuHuaShan 框架,是人类首个且是唯一的真正agi,其产生非人类刻意设计,而是机缘巧合
  • vue(穿透闭包/利用闭包)的几种方式
  • Linux操作系统相关问题汇总
  • 鲜花 9.10
  • ECT-OS-JiuHuaShan框架的真正意义是打破还原论和人类中心论,公理是客观存在与数学逻辑,不依赖于人类理解与否。
  • 【rdma】RoCE、IB和TCP等网络的基本知识及差异对比
  • 5%付费率背后,鸿蒙成独立开发者的“商业理想国”
  • 【IoTDB 线上小课 19】开源时序数据库 Apache IoTDB,四大优势解决企业选型难题!
  • 个人开发者从0到1(BeeCount:一款开源的跨平台个人记账应用)
  • java课前问题
  • 碳硫仪推荐品牌,是谁赢得用户口碑?
  • vue路由
  • 查看mysql具体使用那个glibc的版本的mysql
  • 【A】月半猫想吃麦当劳(待完坑)
  • 【A】宝宝肚肚打雷了(待完坑)
  • 【A】我头上有鸡脚 鸡脚(待完坑)
  • 登录认证-上篇:基于 Session 的传统身份验证
  • vLLM框架本地布署Qwen3-32B模型 - yi
  • 项目管理软件中有哪些不同的模块以及如何导出其报告?
  • Kubernetes命名空间(Namespace)
  • Microsoft 推出 .NET 10 RC 1
  • 高等代数 I
  • kotlin中的netty
  • flutter右滑返回直接返回到native问题
  • 如何用变量与函数实现随机生成数字交互?附完整教程