旅游网站建设需求分析,如何向雅虎提交网站,免费电视剧在线观看,手机网站模板演示快速幂算法 文章目录快速幂算法一、简单介绍二、计算7107^{10}710三、一般化1、计算ana^nan的快速方法#xff1a;2、时间复杂度分析#xff1a;四、代码五、参考资料一、简单介绍
快速幂#xff08;Exponentiation by squaring#xff0c;平方求幂#xff09;是一种简…快速幂算法 文章目录快速幂算法一、简单介绍二、计算7107^{10}710三、一般化1、计算ana^nan的快速方法2、时间复杂度分析四、代码五、参考资料一、简单介绍
快速幂Exponentiation by squaring平方求幂是一种简单而有效的小算法它可以以O(logn)O(log_n)O(logn)的时间复杂度计算乘方。快速幂不仅本身非常常见而且后续很多算法也都会用到快速幂。
二、计算7107^{10}710
让我们先来思考一个问题7的10次方怎样算比较快
最朴素的想法7749497343… 一步一步算共进行了9次乘法。这样算无疑太慢了尤其对计算机的CPU而言每次运算只乘上一个个位数无疑太屈才了。这时我们想到也许可以拆分问题。
我们换一个角度来引入快速幂。还是7的10次方但这次我们把10写成二进制的形式也就是 1010。于是这个问题就变成了求7的二进制1010次幂。这样就只需要计算4次相比于9次大大提升了效率。
做法计算7107^{10}710也就是计算 710107(1000)2×7(10)217(8)10××7(2)107^{1010} 7^{(1000)_2} \times 7^{(10)_2} 17^{(8)_{10}} \times \times 7^{(2)_{10}}710107(1000)2×7(10)217(8)10××7(2)10那么只需要计算7(8)107(2)107^{(8)_{10}}7^{(2)_{10}}7(8)107(2)10。更一般化只需要计算720,721,722,...,72n7^{2^{0}},7^{2^{1}},7^{2^{2}},...,7^{2^{n}}720,721,722,...,72n。
三、一般化
1、计算ana^nan的快速方法
1将nnn 转化成二进制形式例如1011010
2转化后的形式为a(xkxk−1...x2x1x0)2axk0...00×a0xk−1...00×a00...10×a00...01a^{(x_kx_{k-1}...x_2x_1x_0)_2} a^{x_k0...00} \times a^{0x_{k-1}...00} \times a^{00...10} \times a^{00...01}a(xkxk−1...x2x1x0)2axk0...00×a0xk−1...00×a00...10×a00...01.
3 需要计算的数值为a1,a2,a4,a8,....,a2na^{1},a^{2},a^{4},a^{8},....,a^{2^{n}}a1,a2,a4,a8,....,a2n.
2、时间复杂度分析
一般求解 ana^nan 时需要计算n次。但是使用快速幂算法之后将nnn 表示成二进制只需要O(logn)O(log_n)O(logn) 位数字只需要计算O(logn)O(log_n)O(logn)次。
四、代码
public static Long quickPow(Long a,Long n,Long p){//结果Long res 1L;while (n ! 0) {//判断 n 的二进制的最后一位是否为0if((n1)!0){//当n的二进制最后一位为1时乘以当前的权重res (res*a)%p;}//更新n每次n向右移一位n n 1;//更新每一位的权重a (a*a)%p;}return res;
}五、参考资料
[1] 基础算法—快速幂详解
[2] 快速幂算法
幂算法](https://blog.csdn.net/HouGOD/article/details/123847315)