快速幂运算详解

 快速幂运算

对于一个求很大幂运算的模来讲,对于取模来说  (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),
在数据量越大的时候,者中优化效果越明显

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值