矩阵快速幂基础讲解

摘自https://www.cnblogs.com/cmmdc/p/6936196.html

1.整数快速幂:

为了引出矩阵的快速幂,以及说明快速幂算法的好处,我们可以先求整数的幂。
如果现在要算X^8:则 XXXXXXXX 按照寻常思路,一个一个往上面乘,则乘法运算进行7次。
(XX)(XX)(XX)(XX)

这种求法,先进行乘法得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 的值。
///整数快速幂,计算 x^N 

int QuickPow(int x,int N)
{
    int res = x;
    int ans = 1;
    while(N)
    {
        if(N&1)
        {
            ans = ans * res;
        }
        res = res*res;
        N = 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时,我们只让resres使幂指数2.对应下一个二进制位的权值,当二进制位为1时, ans = ans*res  。则乘上了该乘的X幂次。

2.矩阵快速幂算法篇

看了一个整数数的快速幂,现在我们就正式介绍矩阵快速幂算法。假如现在有一个n*n的方阵A。所谓方阵就是行数和列数相等的矩阵,先给出一个数M,让算矩阵A的M次幂,A^M.在此只要求计算并不需要去深究这个矩阵到底是什么含义。则上面代码可以化为。

 

posted @ 2018-03-26 09:37  TobicYAL  阅读(430)  评论(0编辑  收藏  举报