【复习】快速幂算法详解
快速幂算法
就是求一个高精度幂次取余时的一个快速算法
比如我们要求aba^bab%m的时候
应用于快速幂算法 也就是将O(n)转化为O(logn)的算法
他的原理就是:
252^525 = 2∗2∗2∗2∗22*2*2*2*22∗2∗2∗2∗2 = 21012^{101}2101 = 21∗242^1 * 2^421∗24
相当于我们只需要遍历幂次的二进制位的长度就可以了
我们知道任意数x的二进制位长度是log2(x)
这样大大提升了求幂的效率
可是这样运算容易导致数据溢出
如何保证运算不超出数据范围还能正确求余呢?
我们需要借助同余定理 解决在这个求幂的运算过程中所产生的高精度问题
如 252^525%m
同余定理 就是给你定一个正整数m(m>1) 如果两个整数 a 和b 满足 a-b能够被m整除 则(a-b)/m
得到一个整数 则称a,b对模m同余
同余定理两个应用是
(a+b)%m = (a%m+b%m)%m
(a∗ba * ba∗b)%m = (a%m ∗*∗ b%m)%m
以上两条等式可以分别证明
这两条性质 可以应用在高精度运算中
实际上高精度就是说参与运算的数据和运算结果的范围, 超出标准数据类型能表示的数据大小范围的运算。
这个时候,如果要得到正确的计算结果,显然不能依靠普通方法实现了。 而要在普通运算原理的基础上,加以辅助算法来实现超大数据的计算。
例如:求两个100位的数据的和,或者计算两个100位的数字乘积。这时就要用到高精度算法了。
下面我们来看下代码
typedef long long ll;
ll quickpow(ll a,ll b,ll m){ll ans = 1;while(b){if(b%2)ans*=a;a*=a,a%=m;//套括号取模ans%=m;//套括号取模b>>=1;}return ans%m;//套括号取模
}
以上代码如果用表达式表达出来的话 就是
((ans∗aans*aans∗a) % m ∗(a∗a)* ( a * a )∗(a∗a) % m ∗(a∗a)* ( a * a )∗(a∗a) % m ) % m = 1∗251 *2^51∗25 %m
这个完全就是我们上面写的那个同余定理的应用中对高精度取余的处理方式
那么也就是 ((1∗2)∗(2∗2)∗(2∗2))((1*2)*(2*2)*(2*2))((1∗2)∗(2∗2)∗(2∗2))%m = [(1∗2)[(1*2)[(1∗2)%m ∗((2∗2)* (( 2*2)∗((2∗2)%m∗(2∗2)*(2*2)∗(2∗2)%m)))%m]]]%m
所以在这个过程中既不会低效 也不会导致数据溢出
这就是快速幂算法
【复习】快速幂算法详解相关推荐
- 快速幂算法详解(全)
目录 前言 1. 暴力算法(fail) 2. 优化取模运算(accept) 3. 优化时间复杂度(accept) 4. 优化 位运算(accept) 前言 此算法偶尔会出现在笔试以及面试中,特意花时间 ...
- 蓝桥杯 算法提高 递推求值(矩阵快速幂)详解
传送门 问题描述 已知递推公式: F(n, 1)=F(n-1, 2) + 2F(n-3, 1) + 5, F(n, 2)=F(n-1, 1) + 3F(n-3, 1) + 2F(n-3, 2) + 3 ...
- 【面试相关】python实现快速幂取余算法详解
假设我们要计算 2102^{10}210 对1000取模的结果,可以很简单的得到24.但是如果要求 210002^{1000}21000 对1000取模的结果,常规方法就行不通了,因为常规的变量无法容 ...
- 分治算法详解(超详细)
原 分治算法详解 分类专栏: 算法详解 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明. 原文链接: https://blog.csdn.net/effective_coder/a ...
- 大数因数分解Pollard_rho 算法详解
大数因数分解Pollard_rho 算法详解 适用范围:给你一个大数n,将它分解它的质因子的乘积的形式. P.S. 在下面的论述中会使用到Miller_rabin和快速乘法和快速幂,如果有兴趣请看另一 ...
- 字符串匹配之KMP算法详解
kmp算法又称"看毛片"算法,是一个效率非常高的字符串匹配算法.不过由于其难以理解,所以在很长的一段时间内一直没有搞懂.虽然网上有很多资料,但是鲜见好的博客能简单明了地将其讲清楚. ...
- KMP算法详解P3375 【模板】KMP字符串匹配题解
KMP算法详解: KMP算法是一种改进的字符串匹配算法,由D.E.Knuth,J.H.Morris和V.R.Pratt(雾)提出的. 对于字符串匹配问题(such as 问你在abababb中有多少个 ...
- 计算机图形学算法详解,计算机图形学裁剪算法详解
<计算机图形学裁剪算法详解>由会员分享,可在线阅读,更多相关<计算机图形学裁剪算法详解(10页珍藏版)>请在人人文库网上搜索. 1.裁剪算法详解在使用计算机处理图形信息时,计算 ...
- SMAA算法详解 - SearchTex
SearchTex SearchTex.png (x10) 边界样式 # This dict returns which edges are active for a certain bilinear ...
最新文章
- python3正则表达式符号和用法
- 使用GruntJS构建Web程序 (1)
- 张清:你hold住微博实名制吗?
- 3DSlicer12:风格准则
- ubuntu下查看进程端口
- String和STL的一些基础知识
- 10无法更新系统_华为EMUI系统或停留安卓11,无法更新
- CentOS(RedHat)命令行永久修改IP地址、网关、DNS
- python 微信跳一跳辅助 复现
- 传智播客 朴素贝叶斯 算法评估 交叉验证与网格搜索 学习
- dockerfile安装jenkins 并配置构建工具(node、npm、maven、git)
- unity3d技术摄像头跟随_天尚元无人驾驶技术应用丨环卫清扫车
- CB推荐的AP统计学课程在线学习资源网站汇总
- 地表反射率影响因素_【专题突破】影响气候形成的因素及主要气候判别(高中地理),务必掌握!...
- Openerp权限设置总结
- 1小时,不会代码的我如何完成 网易云音乐 大作业网页制作?(IVX 第2篇)
- jerry推荐好玩的做图网站
- svn update 出现skipped '.' 或skipped '目录名称'
- 2022年RocketMQ面试题及答案
- 进程间各种通信方式的C++实现
热门文章
- ZOJ 2562	 More Divisors
- 易驾佳智能机器人教练_机器人教练创始人马宏先生受邀到中国人民大学进行经验分享...
- 5、Flutter 实现 ViewPager、bottomNavigationBar 界面切换
- git前端工程实现ci_大前端项目代码重用,也许lerna是最好的选择
- Mysql 休眠连接过多,有可能导致“Too many connections”的错误
- word2007鼠标不好用
- 物理与计算机信息工程学院,泉州师范学院物理与信息工程学院
- 1011. World Cup Betting (20)
- ORM是什么?如何理解ORM
- 2019 徐州icpc网络赛 E. XKC's basketball team