矩阵的快速幂(含整数的快速幂)

整数的快速幂

  一个整数的幂 a^b,可以表示将b表示成二进制形式,然后,再把b的每一位数字单独拿出来,进行a的幂运算,然后再相乘。

  举个例子: 

  a^11,11可以表示成1011,

  进而a^11 = 

  

//x是底数 n是幂指数
int quickpow(int x,int n){
    int res = x;
    int ans = 1;
    while(n){
        if(n&1) //位运算
            ans = res * ans;
        res = res * res;
     n >>= 1; }
return ans; }

矩阵的快速幂

   整体思路与整数的快速幂相同,唯一不同是,我们需要自己写一个矩阵相乘的函数,mul。

Matrix QuickPow(Matrix x,int n){
    int res = x;
    int ans = 1;
    while(n){
        if(n & 1)
            ans = mul(ans, res);
        res = mul(res, res);
        n >>= 1;
    }
    return ans;
}

 

class Solution {
public:
    double myPow(double x, int n) {
        long long nn = n;
        if(nn < 0)   x = 1 / x, nn *= -1;
        double ans = 1.0;
        while(nn){
            if(1 & nn){
                ans *= x;
            }
            x *= x;
            nn >>= 1;
        }
        return ans;
    }
};

 

矩阵快速幂的简单应用

题目描述

已知F(n)=F(n-1)+F(n-2), 且F(0) = 0, F(1) = 1,求F(10^1000000)

解题思路

可构造矩阵A 使得 [F(n),F(n-1)] = A * [F(n-1),F(n-2)]

所以[F(n), F(n-1)] = A^(n-1) * [F(n-1),F(n-2)]

利用矩阵的快速幂求得 A^(n-1),就很容易再求F(n)了

posted @ 2019-01-21 10:41  阳离子  阅读(209)  评论(0编辑  收藏  举报