蒙哥马利幂模算法(二分快速幂)
蒙哥马利幂模算法(二分快速幂)
用于加快幂次取模运算的速度。
形式为这种ab%c 可以等于 (ab1%c)*(ab2%c)%c,其中b=b1+b2;如果b1=b2就更简便一些,(ab/2%c)2%c,只要把数拆成平方的形式就可以使用幂次转二进制的简便运算了。即把x2的幂次转二进制为x10
比如求解某一个值xn%m:513%7
首先把n以二进制显示:13(10) = 1101(2) 。定义结果值 r,初始化为1。基值x:n值每次除以2则x就需要加倍。每轮判断n值最末尾位:如果为1,则就表示结果值 r 需要更新改变,也就是 r = r * x%m ;如果为0,则结果值不用更新。
即:51101=51000 * 5100 * 51 ,x就是计算每段的51、5100、51000,r就是计算所有x值乘起来的值。
//c和c++代码
long long my_pow(long long x,long long n,long long m){//x^n%mlong long r =1;//最终求余结果while(n>0){if(n&1) {//只要最低位为1就可以更新结果(n&1等价n%2==1)r = r*x % m;}n>>=1;//(等价n/=2)//不管幂次二进制最低位是否为0都让x加倍,不能else(关键)x=x*x%m;//只要n往右移都要翻倍}return r;
}
//java代码
private static BigInteger my_pow(BigInteger x,BigInteger n,BigInteger m){//x^n%m//BigInteger类是进行大整数运算使用的类BigInteger r = new BigInteger("1");//最终求余结果while(n.compareTo(new BigInteger("0"))==1){if(n.mod(new BigInteger("2")).compareTo(new BigInteger("1"))==0) {//只要幂次最低位为1就可以更新结果r = r.multiply(x).mod(m);}n = n.divide(new BigInteger("2"));x = x.multiply(x).mod(m);}return r;
}
蒙哥马利幂模算法(二分快速幂)相关推荐
- a^b%c(蒙格马利快速幂模算法)
蒙格马利快速幂模算法: 将p按二进制写出来,应该很容易理解.r依次是1,2,4,8,16,32,--次幂的结果.当所在二进制的位为1时,k乘上r.最后返回k. 由x*y%z=(x%z)*y%z ,运 ...
- hdu 4549 M斐波那契数列(费马小定理 + 二分快速幂 + 矩阵快速幂)
M斐波那契数列 Time Limit: 3000/1 ...
- 【算法分析与设计】快速幂算法与快速幂取模算法
文章目录 快速幂算法 算法分析 算法实现 位运算优化 BigInteger支持 快速幂取模算法 算法优点 算法推导 算法实现 BigInteger支持 本文完整代码实现(Java语言描述) 快速幂算法 ...
- 模幂运算问题,使用朴素算法和重复-平方算法(快速幂+C#计算程序运行时间)
1.什么是模幂运算问题 给出a, k, mod 计算ak(%mod)a^k (\%mod)ak(%mod)的值 k是一个非常大的正整数(超过1e7) 附,一个可以提交的地方: leetcode 372 ...
- python【数据结构与算法】快速幂and矩阵快速幂取模(看不懂你来打我)
文章目录 1 解释快速幂 2 代码(这里就不考虑指数为小于0的情况了) 3 下面是矩阵快速幂,区别只是底数换成了矩阵 1 解释快速幂 传统的幂运算,是对底数进行连乘,时间复杂度为o(n),例如:2^1 ...
- 大数取模运算,快速幂取模运算
1.快速幂取模 http://www.cnblogs.com/yinger/archive/2011/06/08/2075043.html 快速幂取模就是在O(logn)内求出a^n mod b的值. ...
- (组合数求模=乘法逆元+快速幂) Problem Makes Problem
题目: As I am fond of making easier problems, I discovered a problem. Actually, the problem is 'how ca ...
- RSA密码的手动算法+快速幂算法
公钥加密方案(非对称加密算法) 1.为什么要引入公钥加密方案? 密码学中的加密方案分成对称密钥和非对称密钥(也就是我们说的公钥加密,代表加密算法是RSA加密算法). 而对称加密方法有一个特点,任何通信 ...
- leetcode算法总结 —— 快速幂算法
文章目录 1. 引出快速幂算法 2. 简化语句 3. 使用位运算来提升性能 4. 对应leetcode题型 参考的是大神的文章,这篇文章相当好 https://blog.csdn.net/qq_197 ...
最新文章
- 利用OpenCV求取图像的重心
- java线程池的使用
- 汇编:转移目的地址在内存中
- COGS 930. [河南省队2012] 找第k小的数 主席树
- C/C++:Windows编程—Hook IE浏览器实现URL拦截及更改(上)
- 零基础科普:4种简单推荐算法背后的原理
- 红外倒车雷达原理图_斯坦福研究登Nature子刊:芯片实现激光雷达技术,价格低至数百美元...
- 各厂商服务器ESXI最高版本适配情况
- Android开发学习之路-LruCache使用和源码分析
- 思科CCNA考试命令集总结
- java报错: 类重复: newemission.calculate_java当中的继承(一)
- ubuntu下载BT种子安装qBittorrent
- Illegal instruction 问题处理
- Only fullscreen opaque activities can request orientation比较完美的解决方法,黑白屏问题解决
- web集群之通过tomcat部署jpress应用
- 插秧诗 - 退步原来是向前
- laravel 笔记
- lol服务器位置2017,2017LOL转区系统在哪儿 LOL12月转区系统地址入口
- Python爬虫-爬取快看漫画网图片并拼接成漫画长图
- Ajax页面缓存问题分析与解决办法