矩阵快速幂之整数快速幂

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值