快速幂顾名思义,就是快速算某个数的多少次幂。其时间复杂度为 O(log?N), 与朴素的O(N)相比效率有了极大的提升。而快速幂取模就是对幂运算后结果进行取模运算。在编程过程当中可能会遇到要求一个很大的数的模,为了获得一个能计算更大范围,速度更快的算法,快速幂取模算法应运而生。算法
一.编程
计算幂,计算a^b有不少种方法函数
①有一个pow函数能够用于计算a^b学习
pow(a,b);
②利用for循环计算ui
int sum=1; for(int i=0;i<b;i++) { sum=sum*a; }
接下来就是快速幂的各类方法。spa
快速幂,仍是很好懂的一个算法。3d
快速幂就是把指数进行一次log(N)级别的变换
code
好比咱们要求3^11blog
咱们能够把指数用二进制数替换11,11的二进制数也就是1011。11 = 1011=2^3+2^1+2^0for循环
而3^11就能够写成(3^8)*(3^2)*(3^1)。
只须要算3^1和3^2还有3^8,这样,是否是复杂度就降了。这就是快速幂。
1,当b为偶数时,a^b能够转为a^2的b/2次方。
2.当b为奇数时,a^b能够转为a^2的b/2次方,再乘以a。
而a^2的b/2次方,以可使用上述方式转为a^4的b/4次方再乘以某个数。
咱们看看代码
int Quick(int a,int b) { int ans = 1,base = a; while(b!=0) { if(b%2) //若是b是奇数这两步就至关于((a^2)^(b/2))*a ans *= base; base *= base; //这两步至关于(a^2)^(b/2) b/=2; } return ans; }
在每一次进行循环时,若是b为奇数,则a^b能够转为a^2的b/2次方乘以a。因此每一次进行a^2计算时,须要根据b是否为奇数决定是否在最终的结果上乘以a。
base *= base; 此步计算完成后,则base是下一个进行平方运算的数。这样当全部的循环结束后,base就是a^k,其中k是离b最近的,且为2的整数次方的数。
这个也是利用了快速幂的算法,可是在写程序以前,你得知道一个知识
证实:
则咱们计算(a^b)%m时就能得出
int QuickMod(int a, int b, int m) { int ans = 1; int base = a; base = base % m; while(b>0) { if(b % 2 == 1) ans = (ans * base) % m;//怕溢出以下 b = b/2; base = (base * base) % m;//若是怕溢出,那能够写成base = (base % m * base % m) % m; } return ans; }
大同小异
水平限制,只能写成这样了。但愿能对大家学习有帮助,为你在编程之路献上绵薄之力。