矩阵乘法
定义,设A是\(m\times n\)矩阵,B是\(n \times p\)矩阵,则\(C=A\times B\)是一个\(m\times p\)矩阵
性质:
\(A\times B\)不一定等于\(B\times A\),
\((A\times B) \times C=A\times (B\times C)\),
\((A+B) \times C=A\times C+B\times C\)
定义,设\(C=A\times B\),A是\(m\times n\)矩阵,B是\(n \times p\)矩阵,
\[C_{i,j}=\sum_{1\le k\le n}\left(A_{i,k}\times B_{k,j}\right)\text{,其中}(1\le i \le m,1\le j \le p) \]for(int i=1;i<=m;i++)
for(int j=1;j<=p;j++)
for(int k=1;k<=n;k++)
c[i][j]+=a[i][k]*b[k][j];
考虑一种特殊情形,矩阵\(F\times Q\),其中\(Q\)是\(n\times n\)矩阵,\(F\)是\(1\times n\)矩阵
若是设\(F'=F\times Q\),则\(F'[i]=\sum_{k=1}^nF[k]\times Q[k,i]\),这里可以将其看作\(F\)中的第\(k\)个值会对\(F'\)中的第\(i\)个值产生线性递推关系
列如\(\operatorname{Fib}数列\),因为\(\operatorname{Fib}_n=\operatorname{Fib}_{n-1}+\operatorname{Fib}_ {n-2}\),则我们可以构建矩阵
\(F_n=[\operatorname{Fib}_n,\operatorname{Fib}_{n+1}]\)
矩阵\(A=\begin{bmatrix}0 & 1 \\ 1 & 1\\ \end{bmatrix}\)
则\(F_n\times A=[\operatorname{Fib}_{n+1},\operatorname{Fib}_n+\operatorname{Fib}_{n+1}]=[\operatorname{Fib}_{n+1},\operatorname{Fib}_{n+2}]=F_{n+1}\)
由此可见\(F_i\times A=F_{i+1}\)。故\(F_0\times A^n=F_n\),此时可以由快速幂计算\(A^n\)以达到用矩阵乘法加速递推的效果
我们定义\(F\)为状态矩阵,\(A\)为转移矩阵,满足以下条件的就可以考虑矩阵乘法加速
- \(F\)的每次递推是一个线性的,简单的递推关系
- \(F\)是一个简单的一维向量,该向量在每个时间单位发生一次变化
- 关于\(F\)的递推式始终不变
- 递推轮数很长但其实\(F\)的长度(每次转移时的有效长度)不大
\(A\)的构造方法:如果递推式中含有\(F_{i+1}[y]+=F_i[x]\times b,b\in \mathbb{Z}\),则将\(A\)的第\(x\)行第\(y\)列赋值为\(b\)
当涉及到\(F_{i+1}[y]+=c\),\(c\)是一个固定常量,则我们可以考虑给\(A\)增加一个第\(0\)行,具体地把\(F[0]\)用起来设置\(F[0]=1\),然后\(A[0][y]\)赋值为\(c\)即可