矩阵快速幂之整数快速幂

来源:互联网 发布:硬笔字帖软件 编辑:程序博客网 时间:2024/05/29 05:05

如果现在要算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幂次。

原创粉丝点击