您的位置:首页 > 其它

矩阵快速幂之整数快速幂

2017-08-16 10:48 295 查看
如果现在要算X^8:则 X*X*X*X*X*X*X*X 按照寻常思路,一个一个往上面乘,则乘法运算进行7次。

但如果我们这样算 (X*X)(X*X)(X*X)*(X*X)

这种求法,先进行乘法得X^2,然后对X^2再执行三次乘法,这样去计算,则乘法运算执行4次。已经比七次要少。所以为了快速算的整数幂,就会考虑这种结合的思想。

现在的问题是如何分配才能让乘法运算的次数最少。

例如:X^19次方。

19的二进制为:1 0 0 1 1 。

由(X^m)*(X^n) = X^(m+n)

则X^19 = (X^16)(X^2)(X^1)

那么怎么来求解快速幂呢。请看下列代码:

求解X^N的值。

int QuickPow(int x,int N)
{
int ans = 1,res = x;
while(N){
if(N&1)
ans *=res;
res *= res;
N>>=1;
}
return ans;
}


那么让我们来看看下面这段代码到底对不对:

对于X^19来说:

19的二进制为:1 0 0 1 1

初始:ans = 1; res = x;

则10011最后一位是1,所以是奇数。

ans = res*ans = x;

res = res*res = x^2;

然后右移一位,1 0 0 1

则1001最后一位是1,所以是奇数

ans = res*ans = x*(x^2) = x^3

res = res*res = x^2*x^2 = x^4

然后右移一位,1 0 0

则最后一位是0,所以当前的数为偶数。

res = res*res = x^4*x^4 = x^8

然后右移一位,1 0

最后一位是0,当前数是偶数。

res = res*res =x^8*x^8= x^16

然后右移一位,1

最后一位是1,当前数是奇数

ans = ans*res = (x^3)*(x^16) = x^19

res = res*res = x^32

可以看出res = X^m,m 始终是与二进制位置上的权值是相对应的。当二进制位为0时,我们只让res*res使幂指数*2.对应下一个二进制位的权值,当二进制位为1时,ans = ans*res 。则乘上了该乘的X幂次。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: