矩阵快速幂模板
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 n∗p。具体的乘法规则如下:
矩阵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];
性质:
-
矩阵乘法不满足交换律,但是满足结合律。即 ( A B ) C = A ( B C ) (AB)C=A(BC) (AB)C=A(BC)。
-
单位矩阵:单位矩阵起着特殊的作用,如同数的乘法中的1,这种矩阵被称为单位矩阵。它是个方阵,从左上角到右下角的对角线(称为主对角线)上的元素均为1。除此以外全都为0。根据单位矩阵的特点,任何矩阵与单位矩阵相乘都等于本身。
-
零矩阵:零矩阵即所有元素皆为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 (矩阵快速幂乘/模板)