码迷,mamicode.com
首页 > 其他好文 > 详细

快速求幂

时间:2016-04-26 00:29:03      阅读:168      评论:0      收藏:0      [点我收藏+]

标签:

快速幂在算指数时是很高效的,他的基本原理是二进制。

如果要算

2^5,可以直接2*2*2*2*2

但是如果要算

3^999,指数N太大,计算太慢,所以有一种快速的解法。

 

@@@@@@@@@@@@@@@@@@@@@@@@

以3^21为例。

2^21=(2^16)×(2^4)×(2^1)

21的二进制可以写成(10101)----------------而10101可以写成1*2^4+0*2^3+1*2^2+0*2^1+1*2^0

可以明显看出, 每一个香对应着上边的指数。   2^4=16 2^2=4; 2^0=1   其他项为0;

(具体推理有空再写)

@@@@@@@@@@@@@@@@@@@@@@@@

再找一个例子

2^13

13=(1101),-----------------1*2^3+1*2^2+1*2^0, 指数分别是8,4,1;

 2^13=2^(8+4+1)

///////A^(一个二进制数如101010)=A^(100000)*A^(00000)*A(1000)*A^(000)*A^(10)*A^(0)=A^(2^5)*A^(2^3)*A^(2^1)

@@@@@@@@@@@@@@@@@@@@@@@@

所以要计算X^N,现将N变成二进制,然后依次计算二进制的每位的值(如果为二进制位为0不计算)

@@@@@@@@@@二进制的计算@@@@@@@@@@@@@@

计算13的二进制,对其除2取余,记录余数。技术分享

 

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

代码如下:

 1 int pow_n(int x, int n)
 2 {
 3     int pw = 1;
 4     
 5     while (n > 0) {
 6         if ((n % 2) == 1)
 7             pw *= x;
 8         x *= x;
 9         n /= 2;
10 
11     }
12     return pw;
13 }

计算2^13的步骤就是:

13=(1101)
n%2, 最低位是1, 所以把这部分累乘到pw中,(pw=2^1)x自乘后变成x^2,n=n/2;
n 的这一位是0,所以if不成立,不执行累2乘,    x自乘后变成x^4,n=n/2;
n 的这一位是1,(pw=2^1*2^4),所以累乘到pw中。x自乘后变成x^8,n=n/2;
n 的这一位是1,(pw=2^1*2^4*2^8)所以累乘到pw中。


这是快速求幂的思想,把指数n 分解为2的幂次的和,利用自乘计算x 的(2的幂次)次方, 然后根据需要决定是否累乘相应的幂次。

这样可以把O(n)次乘法缩短到O(logn)次乘法,实现快速计算。

n=n/2和 (n%2==1)是检查指数n 的某个二进制位是否是1的手段。

 

快速求幂

标签:

原文地址:http://www.cnblogs.com/hutonm/p/5433149.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!