博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
高次幂求模
阅读量:6074 次
发布时间:2019-06-20

本文共 998 字,大约阅读时间需要 3 分钟。

主要的思想是来自一个公式:a*b%c = (a%c) *(b%c) %c

基本概念及思想

 

对形如a^b mod m 的运算(b一般较大)
但a,b,m都在long型范围内
算法的主要思想是分治,分而治之。将大的问题分成若干个相似的较小的问题!
具体实现是用递归的方法!
 
举例
2^100mod 3
像这种运算如果先算出2^100 的值,然后再模上3,相信比较困难!
我们可以将100变小点
2^100=(2^50)^2 =((2^25)^2)^2=((((2^1)^2)^2)…)^2
若我们已经得出250 mod 3的值,我们便很简单地得出2^100mod 3的值。
按照上述的方法继续分下去…
最终肯定会得到2^1mod 3 这种情况!这样就好办了!这便是递归的边界,到此我们就可以返回2 mod 3的值了!
另一个问题,再分时有两种情况!
2^100=(2^50)2        , 100是偶数
2^99=(2^49)2 *2   , 99是奇数
第二种情况需要在第一种情况上乘上一次基数。

递归算法代码如下

 

1 long mod(long a,long b,long c) 2 { 3     long ans; 4     if(!b)return 1; 5     else if(b==1)return a%c; 6     else ans = mod(a,b/2,c); 7     ans = (ans*ans)%c; 8     if(b&1)ans = (ans*(a%c))%c; 9     return ans;10 }

 

 

另一种高效的算法是用循环代替递归算法

 

1 long mod_loop(long a,long b,long c) 2 { 3     long ret=1,tem=a; 4     while(b) 5     { 6         if(b&1) ret = ret*tem%c; 7         tem = tem*tem%c; 8         b>>=1; 9     }10     return ret;11 }

 

本文转自NewPanderKing51CTO博客,原文链接:http://www.cnblogs.com/newpanderking/archive/2012/04/24/2468656.html ,如需转载请自行联系原作者

你可能感兴趣的文章
高并发大容量NoSQL解决方案探索
查看>>
MySQL基础语句
查看>>
python操作sql server2008 pyodbc
查看>>
H3C AP胖转瘦方法大全
查看>>
基于tcp/ip以太网通信实现0-5v,4-20ma模拟量AI采集以及模拟量AO输出控制-综科智控...
查看>>
PHP执行系统命令的有几个常用的函数
查看>>
lnmp命令整理
查看>>
SparkStreaming基础理论
查看>>
程序员笔记|Sharding-JDBC 使用入门和基本配置
查看>>
关于安装H3c Cloud Lab的一些报错问题
查看>>
java中split()方法中以"* ^ : | , ."作为分隔符的处理方法
查看>>
我国大数据未来的发展方向
查看>>
C语言学生成绩管理系统
查看>>
powershell远程检查多个oracle数据库表空间使用率
查看>>
C链表
查看>>
Oracle教程之分析Oracle索引扫描四大类
查看>>
2016.8.23_每日IT单词
查看>>
Centos/ubuntu配置SVN服务
查看>>
lgwr,dbwr,chpk
查看>>
一个游戏程序员的学习资料
查看>>