矩阵快速幂

矩阵快速幂是一种高效的算法,能在O(lognlogn)的时间复杂度内计算矩阵的nn次方。该算法首先需要理解矩阵乘法和单位矩阵的概念。找到单位矩阵后,通过递归或非递归的方式实现快速幂运算。矩阵快速幂的应用包括解决数列问题,如斐波那契数列,以及优化线性动态规划问题。
阅读本知识点的基本条件

知道什么是矩阵,以及知道如何进行矩阵的乘法。

什么是矩阵快速幂

和快速幂一样,矩阵快速幂是一种可以在O(lognlogn)的时间复杂度内求出矩阵的nn次方的算法。

如何写矩阵快速幂

前提1

封装好一个矩阵

struct Matrix{
    ...

    friend Matrix operator * (Matrix a, Matrix b) {
        ...
    }
};

或者

class Matrix{
    private :
        ...
    public :
        ...

        friend Matrix operator * (Matrix a, Matrix b) {
            ...
        }
};

前提2

找到一个单位1矩阵,也就是说对于任何一个相同大小的矩阵,它乘上单位1矩阵得到的新矩阵都是它自己。

怎么找一个单位1矩阵呢

你可以自己尝试矩阵构造,这里不多做说明,直接给出结果。

对于一个x×x的矩阵,设它的单位1矩阵为one,那么:

memset(one, 0, sizeof(one));
for (int i = 1; i <= x; i++) {
    one[i][i] = 1;
}
之后就和普通的快速幂没什么区别了

递归代码(求anan) :

Matrix Kasumi(int n) {
    if (n == 0) {
        return one;
    }
    Matrix res = Kasumi(n / 2);
    res = res * res;
    if (n % 2 == 1) {
        res *= a;
    }
    return res;
}

非递归代码:(求anan)

Matrix Kasumi(int n) {
    Matrix res = one, base = a;
    while (n) {
        if (b % 2 == 1) {
            ans = ans * base;
        }
        base = base * base;
        b /= 2;
    }
    return res;
}
至于取膜
friend Matrix operator % (Matrix a, int mod) {
    ...
}

之后像快速幂一样取膜即可

矩阵快速幂有什么用

矩阵快速幂可以用来求一些数列的第几项的值:比如求斐波那契数列第1000000000位的值。

或者,用矩阵快速幂优化线性DP。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值