目录
一.什么是快速幂算法
快速幂算法是一种快速计算a的b次方的算法,它通过利用指数的二进制表示来减少乘法和幂运算的次数(在这里,我们默认指数为正整数)
二.快速幂算法的优势
1.时间复杂度低,相比传统幂运算算法(时间复杂度为O(n))快速幂算法的时间复杂度是O(log n)
2.结合快速幂算法的快速幂取模能够解决数据溢出问题,防止因为a的b次方的数据过大导致无法正确计算出取模后的结果
三.快速幂算法的实现
我们先利用举例来说明,假设我们要计算7的12次方,先来看一张图
、
指数12用二进制表达就是 1100
7的12次方可以表示成 7^12=7^4 * 7^8=7^(2^2) * 7^(2^3)=7 ^(0*2^0 + 0*2^1+ 1*2^2 +1*2^3)
有了这样的思路,我们可以检查指数的最后一位二进制位是不是1
1.如举例的图片所示,我们先创建一个整形变量n=7再创建一个整形变量ret=1
2.12的二进制是1100,最后一位是0,无需操作,我们检索下一位,但是在此之前,我们需要把n=n*n,因为如果第二位是1的话,它代表的是7^2也就是7*7
2.第二位也是0,我们再次使n=n*n,现在n的值是7^4,然后检查下一位
3.第三位是1,代表7^4,我们进行ret=ret*7^4的操作,然后使n=n*n,现在n的值是7^8,再检查下一位
4.第四位也是1,代表7^8,我们使ret=ret*7^8,现在ret的值为1*7^4*7^8=7^12等于我们想要求的值
这就是快速幂算法的底层实现逻辑,这样看也许不太容易理解,我们现在把快速幂算法以代码的方式呈现(c语言)
(这里,我没有把此算法写成函数的形式)如果没有理解,可以自己画图看几遍,或者调试查看。
四.快速幂取模
1.快速幂取模就是计算(a^b)%m的算法,其时间复杂度低,且能够防止因为a的b次方的数据过大导致无法正确计算出取模后的结果。
2.在了解快速幂取模之前,我们需要先了解一个公式
(a*b)%m==[(a%m)*(b%m)]%m
3.快速幂取模就是在快速幂算法的基础上给a和ret多次取模
4.代码,例子是求(7^12)%10^4
五.例题
求a的b次方的最后n位数,1≤a,b≤10^4,0<n<=4.
这道题如果使用常规的幂算法,那么数据必定会溢出,我们可以使用快速幂取模,比如说最后四位数就是a的b次方模上10^4