【算法篇-数论】快速幂
创始人
2024-04-10 06:14:13
0

快速幂

  • 1. 利用快速幂优化的时间复杂度
  • 2. 快速幂方法及代码
  • 3.总结

文章参考自 B站董晓算法

1. 利用快速幂优化的时间复杂度

所谓的快速幂就是快速计算底数的n次幂

暴力求幂的话时间复杂度为O(n)

利用快速幂可以做到

时间复杂度为 O(log2n)

2. 快速幂方法及代码

我们要求 ana^{n}an (0 <= a,n < 2312^{31}231)

快速幂需要用到的思想是 二进制 和 倍增思想

比如 3133^{13}313 = 3(1101)3^{(1101)}3(1101) = 383^{8}38 * 343^{4}34 * 313^{1}31 ,这是二进制思想,把指数先换成二进制,然后找到1的位置,1的位置决定了是指数的多少次方,然后连乘即可。

还有就是倍增思想
对 a 做平方倍增,比如,313^{1}31,323^{2}32,343^{4}34,383^{8}38,3163^{16}316…
为什么要做这样的倍增?
因为二进制里面,从右往左,就是平方倍增。
我们按照二进制的方法拆分,得到的一定是1,2,4,8…这样的值
我们一步一步往下算,3(1101)3^{(1101)}3(1101) 只要二进制指数的位置是 1 就可以直接乘。
不理解没关系,直接看代码分析或许就明白了。

long long quickpow(long long a,int n)
{long long  res = 1; // 这是我们要的结果,因为是乘积,记住开始不要写成0while(n)//当指数n不为0时,就循环,因为我们每一次都让n >>= 1,相当于 n / 2{if(n & 1) res = res * a;//如果对应的二进制是1,就乘底数,否则不用计算a = a * a; //底数倍增n >>= 1;//n往右进一位,方便上面的 n & 1}return res; // 返回结果就是 a^n
}

我们来模拟一下
在这里插入图片描述

3.总结

以上就是快速幂的方法以及代码
时间复杂度从O(n),优化到O(log2n),是一种非常优秀的算法。
大家可以感受一下算法的美

相关内容

热门资讯

监控摄像头接入GB28181平... 流程简介将监控摄像头的视频在网站和APP中直播,要解决的几个问题是:1&...
Windows10添加群晖磁盘... 在使用群晖NAS时,我们需要通过本地映射的方式把NAS映射成本地的一块磁盘使用。 通过...
protocol buffer... 目录 目录 什么是protocol buffer 1.protobuf 1.1安装  1.2使用...
在Word、WPS中插入AxM... 引言 我最近需要写一些文章,在排版时发现AxMath插入的公式竟然会导致行间距异常&#...
Fluent中创建监测点 1 概述某些仿真问题,需要创建监测点,用于获取空间定点的数据࿰...
educoder数据结构与算法...                                                   ...
MySQL下载和安装(Wind... 前言:刚换了一台电脑,里面所有东西都需要重新配置,习惯了所...
MFC文件操作  MFC提供了一个文件操作的基类CFile,这个类提供了一个没有缓存的二进制格式的磁盘...
有效的括号 一、题目 给定一个只包括 '(',')','{','}'...
【PdgCntEditor】解... 一、问题背景 大部分的图书对应的PDF,目录中的页码并非PDF中直接索引的页码...