大数幂模运算
来源:互联网 发布:管家婆软件好用吗 编辑:程序博客网 时间:2024/05/28 23:21
大数幂的模运算
题目
我们知道对于像
7%2,3%5 这样的题,计算机很容易算出它们的结果,但是如果我们需要计算7123456789%65536 这样的值呢,这时普通的计算方式可能就要花费很久的时间了,有没有简单的方法可以算出来这类大数的模呢?
分析
假设我们有整数a, b与除数m ,那么假设
a % m = j , b % m = t , 有整数 i , s , 使
a=im+jb=sm+t
所以有
a⋅b=(im+j)⋅(sm+t)=ism2+jsm+itm+jt
推出
(a⋅b)modm=(ism2+jsm+itm+jt)modm=jtmodm=((amodm)(bmodm))modm
所以
对于像7123456789%65536 这样的大数幂模运算,我们可以把大数幂m拆分成形如m=m1+m2+...+mn 这样的形式,那么nm=nm1+m2+...+mn=nm1nm2⋅...nmn ,这样通过上面的公式我们就可以很容易算出大数幂了.
因为
abcmodm=((ab)⋅c)modm=(((ab)modm)(cmodm))modm=(((amodm)(bmodm)modm)(cmodm))modm
依次类推既可.我们再考虑大数幂m要如何分解成形如
m=m1+m2+...+mn 的形式.
观察211=21+2+8=21×20+1×21+0×22+1×23 .
所以
可以把大数幂m写成二进制,然后只取值为1的位,和这一位在二进制中从右到左的位数(从0开始计算),就可以得到这个大数幂的分解式了.
代码
// m为底数,pow为指数,n为除数int getMod(int m, int pow, int n){ int x = 1; int power = m % n; int mask = 1; for(int i = 0; i < 32; i++) { if((pow & mask) != 0) { x = (x * power) % n; } power = (power * power) % n; mask = mask << 1; } return x;}
ps
如果计算
阅读全文
0 0
- 大数幂模运算
- 大数幂模运算
- 大数运算--幂次方运算
- 大数取模运算
- 大数取模运算
- 大数幂运算
- 大数求幂运算
- 大数幂运算
- 大数运算(8)——大数幂运算
- 大数运算(加减乘除模)
- 大数运算
- 大数运算
- 大数运算
- 大数运算
- 大数运算
- 大数运算
- 大数运算
- 大数运算
- yum下载的rpm包离线安装
- CentOS下搭建LAMP环境及遇到的问题
- 《--你要做的事--》
- Oracle索引(Index)创建使用
- Android中AIDL的基本用法
- 大数幂模运算
- kindeditor的使用
- 水平RecyclerView中Item中含有EditText问题
- BackgroundWroker使用方法备忘
- 欢迎使用CSDN-markdown编辑器
- 增强学习(Reinforcement Learning and Control)
- Servlet与Jsp对比区别
- PeerConnection, WebRtcSession, VideoTrack的关系
- activiti数据库表结构剖析