快速幂算法
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了快速幂算法相关的知识,希望对你有一定的参考价值。
2016.1.25 我的第一篇随笔
在计算形如ab的运算时,如果用朴素的算法需要O(b)的时间复杂度,当b很大时显然是不可取的,于是我们希望找到一种快速的算法来计算,尤其是题目中要求答案取模时。
对于朴素的算法我们有
ans=1;
for(int i=1;i<=b;i++) (ans*=a)%=mod;
我们可以简单优化一下,在循环之前加入a%=mod;
当b为偶数时我们可以这样
ans=1;
for(int i=1;i<=b/2;i++) (ans*=a)%=mod;
(ans*=ans)%=mod;
当b为奇数时需要特判
ans=1;
for(int i=1;i<=b/2;i++) (ans*=a)%=mod;
(ans*=ans)%=mod;
if(b&1) (ans*=a)%=mod;
这样做可以将时间减半。
我们甚至可以这样
ans=1;
for(int i=1;i<=b/4;i++)
{
(ans*=a)%=mod;
}
(ans*=ans)%=mod;
(ans*=ans)%=mod;
if(b&1) (ans*=a)%=mod;
if( (b/2) &1) (ans*=a*a)%=mod;
那么我们自然会想到,如果时间可以减半,减半,再减半,那么时间复杂度可以降到O(log n).
实现方法也很简单,就是把上述步骤迭代多次。
代码如下:
int ans=1; a%=mod; while(b) { if(b&1) (ans*=a)%=mod; b/=2;//可以知道任何一个大于1的数经历多次这步均可以达到b=1,所以不用担心ans最后得不到a的值 (a*=a)%=mod; }
以上是关于快速幂算法的主要内容,如果未能解决你的问题,请参考以下文章
整数快速乘法/快速幂+矩阵快速幂+Strassen算法 (转)