快速幂算法及其应用

快速幂是一种利用二进制拆分思想,将指数运算时间复杂度降低到O(log₂N)的算法。通过不断计算底数的平方并根据二进制位进行乘法,可以高效地处理大数的次方运算,常用于欧拉定理等数学问题中。给出的代码示例展示了如何实现快速幂算法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.引入

我们首先来思考一个问题,求一个数a的b次方。这个问题看起来是不是很简单,下面的代码就可以轻松解决。

#include <bits/stdc++.h>
using namespace std;

int a,b;

int main(){
	cin>>a>>b;
	cout<<pow(a,b)<<endl;
	return 0;
}

这个代码的时间复杂度是O(N)这样写的话,等于小的数据还可以做,但是数据如果很大的话,就算开unsigned long long也不行,所以我们需要一种更快,并且能算的数更大的算法,而这就是快速幂算法。

2.快速幂的介绍

快速幂,顾名思义,就是快速算底数的n次幂。其时间复杂度为 O(log₂N), 与朴素的O(N)相比效率有了极大的提高。而怎么达到O(log₂N)的呢,那就是用二进制的思想。
我们可以举一个例子:
3^10=3 * 3 * 3 * 3 * 3 * 3 * 3 * 3 * 3 * 3
= (3 * 3) * (3 * 3) * (3 * 3) * (3 * 3) * (3 * 3)
=(3 * 3) ^ 5
=9 ^ 5
=(9 ^ 4) * (9 ^ 1)
=(6561 ^ 1) * (9 ^ 1)

那对于a的b次方,,我们也可以转换成二进制的方式。
我们可以将b转换成二进制数,例如b=11,那么b就等于2 ^ 0 + 2 ^ 1 + 2 ^ 3,那么ab =a^(2 ^ 0 + 2 ^ 1 + 2 ^ 3),那么就可以变成a ^ (2 ^ 0)*a ^ (2 ^ 1)*a ^ (2 ^ 3)

3.代码实现

既然我们知道了是用二进制来实现,那就可以将这个数不断拆分,不断的算底数的平方就可以了。

long long qkpow(long long a,long long b){
	long long sum=1;
	while(b){
		if(b&1) sum*=a;
		a*=a;
		b>>=1;
	}
	return sum;
}

4.总结

快速幂一般是用于在边幂运算边取模的,例如在写欧拉定理时就要用到快速幂,快速幂在一般情况下是完全够用的,但也无法避免还要大的数,所以快速幂也还可以再优化,想了解的可以自行查阅资料。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值