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

快速幂算法——求解大指数幂

定义+适用范围

快速幂算法(Fast Exponentiation)是一种高效的计算幂的方法,特别适用于计算形如 a^b的表达式,其中 a 是底数,b 是指数,且 b 可能非常大。

核心思想

快速幂算法的核心思想是将指数 b 表示为二进制形式,并利用二进制数的性质来减少乘法操作的次数。

基本思想

  1. 将指数 b 转换为二进制表示:例如,如果 b=13,则其二进制表示为 1101(2)​。

  2. 从右到左遍历二进制数的每一位:对于 b=13(10)​=1101(2)​,我们从右到左遍历每一位(即 1,0,1,1)。

  3. 根据当前位是 0 还是 1 来决定是否将当前的底数的幂乘到结果中

    • 如果当前位是 1,则将当前的底数的幂乘到结果中。
    • 如果当前位是 0,则不乘。
  4. 底数的幂每次循环都平方:在每次循环中,我们都将底数的当前幂平方,以便在下一次循环中使用。

  5. 指数每次循环都右移一位:这相当于将指数除以 2(在二进制表示中)。

示例

假设我们要计算 2^13。

  1. 13(10)​=1101(2)​
  2. 初始化 result = 1base = 2(result为结果,base为底数)
  3. 遍历 1101(2)​ 的每一位:
    • 最低位是 1,result *= base^1(即 result *= 2),然后 base = base^2(即 base = 4),指数右移一位(现在考虑 110(2)​)
    • 下一位是 0,不乘,base = base^2(即 base = 16),指数右移一位(现在考虑 11(2)​)
    • 下一位是 1,result *= base^1(即 result *= 16),然后 base = base^2(即 base = 256),指数右移一位(现在考虑 1(2)​)
    • 最高位是 1,result *= base^1(即 result *= 256

最终,result = 2 * 4 * 16 * 256 = 8192,即 2^13=8192。

代码实现

public double myPow(double x, int n) {  long N = n; // 使用 long 防止溢出  if (N == 0) return 1.0;  boolean isNegative = N < 0;  N = Math.abs(N);  double result = 1.0;  double base = x;  while (N > 0) {  if ((N & 1) == 1) { // 如果 N 的当前最低位是 1  result *= base;  }  base *= base; // base 平方  N >>= 1; // N 右移一位(相当于除以 2)  }  if (isNegative) {  result = 1.0 / result;  }  return result;  
}

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 强化学习实操入门随笔
  • 【云原生之kubernetes实战】k8s环境中部署Nginx服务
  • 学习记录——day42 模板
  • 数字货币是怎么回事什么是数字货币
  • 由浅入深学习 C 语言:Hello World【提高篇】
  • 前端面试体——项目介绍以及SPA介绍
  • netty编程之整合es实现存储以及搜索功能
  • MySql练习(1)
  • Simple Fun #352: Reagent Formula——C语言提高题
  • 【JUnit单元测试框架】
  • 如何在VSCODE中查看西门子PLC的SCL程序?
  • 设置Virtualbox虚拟机共享文件夹
  • Midjourney提示词——黑神话悟空角色生成提示词!
  • C语言 strlen求字符串长度
  • Android架构组件:MVVM模式的实战应用于数据绑定技巧
  • $translatePartialLoader加载失败及解决方式
  • Docker: 容器互访的三种方式
  • Invalidate和postInvalidate的区别
  • JS+CSS实现数字滚动
  • Octave 入门
  • React Native移动开发实战-3-实现页面间的数据传递
  • React-flux杂记
  • SpriteKit 技巧之添加背景图片
  • SQLServer之创建显式事务
  • webpack入门学习手记(二)
  • 力扣(LeetCode)22
  • 说说动画卡顿的解决方案
  • 详解移动APP与web APP的区别
  • 一些关于Rust在2019年的思考
  • Java总结 - String - 这篇请使劲喷我
  • 函数计算新功能-----支持C#函数
  • ​Java基础复习笔记 第16章:网络编程
  • # 计算机视觉入门
  • #Z2294. 打印树的直径
  • $.ajax中的eval及dataType
  • (145)光线追踪距离场柔和阴影
  • (ISPRS,2023)深度语义-视觉对齐用于zero-shot遥感图像场景分类
  • (笔试题)合法字符串
  • (二)原生js案例之数码时钟计时
  • (利用IDEA+Maven)定制属于自己的jar包
  • (论文阅读22/100)Learning a Deep Compact Image Representation for Visual Tracking
  • (亲测有效)推荐2024最新的免费漫画软件app,无广告,聚合全网资源!
  • (一)pytest自动化测试框架之生成测试报告(mac系统)
  • **python多态
  • .NET WebClient 类下载部分文件会错误?可能是解压缩的锅
  • .net利用SQLBulkCopy进行数据库之间的大批量数据传递
  • @autowired注解作用_Spring Boot进阶教程——注解大全(建议收藏!)
  • [ 渗透工具篇 ] 一篇文章让你掌握神奇的shuize -- 信息收集自动化工具
  • [2013AAA]On a fractional nonlinear hyperbolic equation arising from relative theory
  • [AIGC] HashMap的扩容与缩容:动态调整容量以提高性能
  • [Android]创建TabBar
  • [BUG]Datax写入数据到psql报不能序列化特殊字符
  • [BUUCTF 2018]Online Tool(特详解)
  • [C#]winform部署官方yolov10目标检测的onnx模型
  • [CLIP-VIT-L + Qwen] 多模态大模型源码阅读 - 语言模型篇(4)