快速幂运算
对于一个求很大幂运算的模来讲,对于取模来说 (a*b)%c=(a%c)*(b%c)%c
直接用下列
# include<stdio.h>
# include<time.h>
int main(){
int a=2,sum=1;
double end;
for(int i=0;i<100000000;i++)
sum=sum*a%10086;
printf("%d\n",sum);
end=(double) clock();
printf("%lf ms\n",end); //计算运行的时间
return 0;
}
如果不知道clock()函数,请点击这里
结果如下:
5782
67101.000000 ms
67101 ms也就是 67s 一分多钟(我等了好长时间才有的结果)
我们尝试一下快速幂运算
# include<stdio.h>
# include<time.h>
int Quick(int a,long long b)
{ int ans=1;
a=a%10086;
while(b)
{
if(b&1) ans=(ans*a)%10086; //如果b的二进制位不是0即b是奇数,那么我们的结果是要参与运算的
a=(a*a)%10086; //不断的加倍
b>>=1; //二进制的移位操作,相当于每次除以2,用二进制看,就是我们不断的遍历b的二进制位
}
return ans;
}
int main(){
int a=2,sum=1;
double end;
sum=Quick(a,10000000000);
printf("%d\n",sum);
end=(double) clock();
printf("%lf ms\n",end);
return 0;
}
结果如下:
5782
0.000000 ms
看看时间是快了很多;
普通的幂的运算 就是 a*a*a*a......
快速幂运算就是 a*a^2*a^4*a^8...
现在,我们的快速幂运算已经讲完了
我们来大致的推演一下快速幂取模算法的时间复杂度
首先,我们会观察到,我们每次都是将b的规模缩小了2倍
那么很显然,
原本的普通的时间复杂度是O(n)
快速幂的时间复杂度就是O(logn),
在数据量越大的时候,者中优化效果越明显