矩阵快速幂模板

Posted hesorchen

tags:

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

前置知识

矩阵

矩阵是一个 n × m n \\times m n×m的阵列,下面是一个 3 × 3 3\\times 3 3×3的矩阵:

[ 1 0 0 0 1 0 0 0 1 ] \\begin{bmatrix} 1&0&0\\\\\\\\ 0&1&0\\\\\\\\ 0&0&1\\\\ \\end{bmatrix} 100010001

矩阵乘法

若矩阵A的大小为 n × m n\\times m n×m ,另一矩阵B的大小为 m × p m\\times p m×p,则两个矩阵可以做乘法,得到的矩阵C大小为 n ∗ p n*p np。具体的乘法规则如下:

矩阵A:
[ a 11 a 12 a 13 a 21 a 22 a 23 ] \\begin{bmatrix} a_{11}&a_{12}&a_{13}\\\\\\\\ a_{21}&a_{22}&a_{23}\\\\ \\end{bmatrix} a11a21a12a22a13a23

矩阵B:
[ b 11 b 12 b 21 b 22 b 31 b 32 ] \\begin{bmatrix} b_{11}&b_{12}\\\\\\\\ b_{21}&b_{22}\\\\\\\\ b_{31}&b_{32}\\\\ \\end{bmatrix} b11b21b31b12b22b32

相乘得到矩阵C:
[ a 11 × b 11 + a 12 × b 21 + a 13 × b 31 a 11 × b 12 + a 12 × b 22 + a 13 × b 32 a 21 × b 11 + a 22 × b 21 + a 23 × b 31 a 21 × b 12 + a 22 × b 22 + a 23 × b 32 ] \\begin{bmatrix} a_{11}\\times b_{11}+a_{12}\\times b_{21}+a_{13}\\times b_{31} &a_{11}\\times b_{12}+a_{12}\\times b_{22}+a_{13}\\times b_{32}\\\\\\\\ a_{21}\\times b_{11}+a_{22}\\times b_{21}+a_{23}\\times b_{31}&a_{21}\\times b_{12}+a_{22}\\times b_{22}+a_{23}\\times b_{32} \\end{bmatrix} a11×b11+a12×b21+a13×b31a21×b11+a22×b21+a23×b31a11×b12+a12×b22+a13×b32a21×b12+a22×b22+a23×b32

C++代码实现矩阵乘法:

for (int i = 1; i <= n; i++)
    for (int j = 1; j <= n; j++)
        for (int k = 1; k <= n; k++)
            C[i][j] += A[i][k] * B[k][j];

性质

  1. 矩阵乘法不满足交换律,但是满足结合律。即 ( A B ) C = A ( B C ) (AB)C=A(BC) (AB)C=A(BC)

  2. 单位矩阵:单位矩阵起着特殊的作用,如同数的乘法中的1,这种矩阵被称为单位矩阵。它是个方阵,从左上角到右下角的对角线(称为主对角线)上的元素均为1。除此以外全都为0。根据单位矩阵的特点,任何矩阵与单位矩阵相乘都等于本身。

  3. 零矩阵:零矩阵即所有元素皆为0的矩阵。

矩阵快速幂

类似于快速幂用于加速乘法,矩阵快速幂用于加速矩阵乘法。我们可以将 O ( n ) O(n) O(n)的乘法优化到 O ( l o g n ) O(logn) O(logn)

可以对比一下快速幂与矩阵快速幂:

long long quick_pow(long long a, long long b)//快速幂
{
    long long res = 1; //1
    while (b)
    {
        if (b & 1)
            res = res * a;
        b /= 2;
        a = a * a;
    }
    return res;
}

Matrix quick_multi(Matrix a, int t) //矩阵快速幂
{
    Matrix res; //单位矩阵
    for (int i = 1; i <= N; i++)
        for (int j = 1; j <= N; j++)
            res.M[i][j] = (i == j);
    while (t)
    {
        if (t & 1)
            res = multi(res, a);
        t /= 2;
        a = multipoj 3070 Fibonacci (矩阵快速幂乘/模板)

从矩阵快速幂的泛型模板设计——教你如何优雅的面向对象

模板矩阵快速幂

蒟阵P3390 模板矩阵快速幂

求幂大法,矩阵快速幂,快速幂模板题--hdu4549

矩阵快速幂 模板