快速幂/快速幂矩阵

Posted songlinxuan

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了快速幂/快速幂矩阵相关的知识,希望对你有一定的参考价值。

快速幂可以通过算式化简来有效的减少计算量;

 

例如8^5,如果不采用任何化简方式,则是8*8*8*8*8;

快速幂思想就是将指数进行分解,从而减少计算次数,参照的是二级制下的指数分离思想;

 

对于5,可以化为101二级制串,所以5=2^0+2^2;

 

所以8^5=8^1*8^4,从而有效地从五次计算化为了两次计算;

int quickpow(int a, int b) {
    int res = 1;//用于保存结果;
    int ans = a;//用来保存b的二进制次方;
    while (b != 0) {
        if (b % 2 == 1)
            res *= ans;
        ans *=ans;
        b /= 2;
    }
    return res;
}

 

其中值得注意的是ans*=ans一项,由于每一次循环都是原来a^2的平方,所以就相当于a^2*a^2;

 

矩阵幂和快速幂的思想相同,也是利用分解思想,将矩阵进行乘积进行分解,无非是乘法被矩阵乘法进行替代;

 

vector<vector<int>> multi(vector<vector<int>>m1, vector<vector<int>>m2) {
    vector<vector<int>> m3;
    m3.resize(n);
    for (int i = 0; i < n; i++) {
        m3[i].resize(n);
    }
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
            for (int k = 0; k < n; k++) {
                m3[i][j] += m1[i][k] * m2[k][j];
            }
        }
    }
    return m3;
}
 
vector<vector<int>> quckmatrix(vector<vector<int>> m) {
    vector<vector<int>> ans=m;
    vector<vector<int>> res;
    res.resize(n);
    for (int i = 0; i < n; i++) {
        res[i].resize(n);
    }
    for (int i = 0; i < n; i++) {
        //单位矩阵
        res[i][i] = 1;
    }
    while (k > 0) {
        //对k二进制进行操作;
        if (k % 2 == 1) {
            res = multi(res, ans);
        }
        k /= 2;
        ans = multi(ans, ans);
    }
    return res;
}

  

 

以上是关于快速幂/快速幂矩阵的主要内容,如果未能解决你的问题,请参考以下文章

poj 3233(矩阵快速幂)

矩阵快速幂

模板之矩阵快速幂(luogu P3390模板矩阵快速幂)

快速乘快速幂(矩阵快速幂)

浅谈矩阵快速幂

初步 - 矩阵快速幂