博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【算法】快速幂运算
阅读量:4952 次
发布时间:2019-06-11

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

在计算 x时,我们会怎么算呢?如果只是x * x * x * ... * x 这样每个数乘起来计算 n 次的的话,虽然算法简单,但是复杂度为 O(n) ,往往不能满足要求。让我们来考虑加速幂运算的方法。

如果 n = 2k ,可以将其表示为  xn = ((x2)2)... ,只要做 k 次平方运算就可以轻松求得。由此我们想到,先将 n 表示为2的幂次的和 n = 2k1 + 2k2 + 2k3 + ... ,就有 xn = x2^k1 x2^k2 x2^k3 ... ,只要在依次求 x2^i 的同时计算就好了,最终得到了 O(logn) 计算幂运算的算法。比如计算x22,可以把 x22 表示为 x* x4 * x16 (22转成二进制是10110)。在进行幂运算时,往往因为结果数字过大,而让我们输出取余后的结果。下面是一段参考代码:

1 typedef long long ll; 2  3 ll mod_pow(ll x,ll n,ll mod){ 4     ll res = 1; 5     while(n>0){ 6         if(n&1) res = res * x % mod;  //如果二进制最低位为1,则乘上x^(2^i) 7         x = x * x % mod;  //将x平方 8         n >>= 1; 9     }10     return res;11 }

代码还是很容易理解的,先把n转化成二进制表示,然后每一位开始依次计算。如果二进制最低位为1,那么就将结果乘上x2^i ( i 的值取决于现在算到哪一位,如果是第0位则 i = 0)。每次将x平方,然后将n右移一位,继续下一位的计算。比如计算x22,就先把22转化成10110,最低位是0,res不变,x变成x2,右移变成1011;最低位是1,res乘上x2,x2再变为x4(也就是x2^2),右移变成101;最低位是1,res乘上x4,x4再变为x8,右移变成10……依次类推,最终结果也就是res = x* x4 * x16(此处没有考虑取余)。

 

---------------------------------------------下面是另一种思路。--------------------------------------------------------------

当n为偶数时有 xn = ((x2)(n/2)) ,递归转为n/2的情况;n为奇数时有 xn = ((x2)(n/2)) * x ,同样也递归转为 n/2 的情况。这样不断递归下去,每次n都减半,于是可以在O(logn)时间内完成幂运算。这个比第一种似乎更容易想到也更易理解,下面给出代码:

1 typedef long long ll; 2  3 ll mod_pow(ll x,ll n,ll mod){ 4     if(n == 0) return 1; 5     if(n == 1) return  x % mod; 6     ll res = mod_pow(x * x % mod, n / 2, mod); 7     if(n & 1) 8         res = res * x % mod; 9     return res;10 }

 

还有一种非常类似的,f(x,n) = xn,x为奇数那么f(x,n) = f(x,n/2) * f(x,n/2) *x,x为偶数那么f(x,n) = f(x,n/2) * f(x,n/2)。

1 ll f(int x,int n){2     if(n==0) return 1;3     if(n==1) return x;4     if(n&1) return f(x,n>>1)*f(x,n>>1)*x;  //如果n是奇数5     else return f(x,n>>1)*f(x,n>>1);   //如果n是偶数6 }

 

转载于:https://www.cnblogs.com/Aikoin/p/10176458.html

你可能感兴趣的文章
混沌分形之迭代函数系统(IFS)
查看>>
VS2013试用期结束后如何激活
查看>>
边框圆角Css
查看>>
SQL 能做什么?
查看>>
java IO操作:FileInputStream,FileOutputStream,FileReader,FileWriter实例
查看>>
使用Busybox制作根文件系统
查看>>
Ubuntu候选栏乱码
查看>>
基于SSH框架的在线考勤系统开发的质量属性
查看>>
jpg图片在IE6、IE7和IE8下不显示解决办法
查看>>
delphi之模糊找图
查看>>
transitionFromViewController方法的使用
查看>>
.NET终于也沦陷了
查看>>
这个我觉得是苹果的一个严重坏影响
查看>>
shell:crontab
查看>>
v$与v_$视图 关系
查看>>
ASP.NET执行存储过程
查看>>
element-ui学习
查看>>
SQL字段的相似度
查看>>
安卓 使用LruCache 加载图片 遇到的问题
查看>>
剑指Offer——二维数组中的查找
查看>>