矩阵基础
又是一个乱堆一气的文章…
索引:矩阵的加减乘运算,矩阵快速幂,矩阵加速线性递推……
一 基础知识
1 概念
一个$n\times m$的数阵被称作矩阵(matrix)。举个栗子,就像下面这样:
$$ \begin{bmatrix} 1&2&3 \newline 4&5&6 \newline 7&8&9 \newline 10&11&12 \end{bmatrix} $$
矩阵可以用大写字母表示,像这样:
$$ A = \begin{bmatrix} 1&2&3 \newline 4&5&6 \newline 7&8&9 \newline 10&11&12 \end{bmatrix} $$
$A_{i,j}$表示矩阵第$i$行第$j$列的元素,如$A_{3,2} = 8$。
主对角线
形如$A_{i,i}$的元素所组成的一条矩阵的对角线被称为矩阵的主对角线。
矩阵的阶
$n$行$m$列的矩阵被称为$n\times m$阶矩阵。如上面的$A$矩阵是$4\times 3$阶矩阵,注意这里的$\times$符号不表示相乘,就是说$3\times 4$和$4\times 3$不是同一个阶数。
2 加减运算
两个阶数相同的矩阵可以进行加减法,就像这样:
若$ A = \begin{bmatrix} 1&2&3 \newline 4&5&6 \end{bmatrix} $,$ B = \begin{bmatrix} 7&8&9 \newline 10&11&12 \end{bmatrix} $
则$A+B = \begin{bmatrix} 1+7 & 2+8 & 3+9 \newline 4+10 & 5+11 & 6+12 \end{bmatrix} = \begin{bmatrix} 8 & 10 & 12 \newline 14 & 16 & 18 \end{bmatrix}$
$A-B = \begin{bmatrix} 1-7 & 2-8 & 3-9 \newline 4-10 & 5-11 & 6-12 \end{bmatrix} = \begin{bmatrix} -6 & -6 & -6 \newline -6 & -6 & -6 \end{bmatrix}$
由上也可知,矩阵的加法是满足交换律的。
3 矩阵相乘
仅有形如这样的两个矩阵可以进行乘法:$n\times k$阶矩阵$A$和$k\times m$阶矩阵$B$。它们的乘积会是一个$n\times m$阶矩阵。
满足相乘条件的矩阵的乘法原则是:若$C = A\times B$,则有$C_{i,j} = \sum\limits_{u = 1}^k A_{i,u}·B_{u,j}$。一个例子:
$$ \begin{bmatrix} 1&2&3 \newline 4&5&6 \end{bmatrix} \times \begin{bmatrix} 1&2 \newline 3&4 \newline 5&6 \end{bmatrix} = \begin{bmatrix} 22 &28 \newline 49&64 \end{bmatrix}$$
具体的运算细节如下图:
注意:矩阵乘法是不满足交换律的!
二 矩阵快速幂
1 理论
快速幂能在较短的时间内求出$a^b$的值,是因为巧妙的把$b$进行了二进制分解并划分了求$a^b$的子问题。
那么对于矩阵而言,可不可以用类似于快速幂的办法快速的求出$n\times n$阶矩阵$A$的幂次$A^b$的值呢?
注意:因为矩阵乘法的限制,只有阶数形如$n\times n$的矩阵有幂运算。
显然是可以的,这里有一份快速幂代码:
1 | LL QuickPow(LL a,LL b){ |
我们把里面的a
、base
、rec
假想成一个矩阵,那么rec *= base
、base *= base
我们都可以实现。唯一的问题是rec = 1
应该怎么定义?
抛开矩阵,”1”应该满足的条件是:对于任意非零实数$a$,有$a\times 1 = a$。
回到矩阵上来,”1”矩阵$base$应该满足的条件是:对于任意非零矩阵$A$,有$A\times base = A$。
假如$A$为$n\times m$阶,那么显然$base$应该是$m\times m$阶,否则得到的积矩阵不会是$n\times m$阶的。进一步研究发现:$base$应该是一个主对角线为$1$,其余元素都为$0$的矩阵,像这样:$\begin{bmatrix} 1&0&0 \newline 0&1&0 \newline 0&0&1 \end{bmatrix}$(当$m = 3$时)。
2 代码
于是我们得到矩阵快速幂的代码:
模板
1 |
|
时间复杂度大概是$O(k \log_2 b)$,其中$k$是一次矩阵乘法的复杂度,大概是$n^3$级别($n$是阶数)。
三 矩阵加速线性递推
矩阵快速幂可以被用来优化递推。实际上并不是只能优化线性递推,一个非线性递推的例子:请在本站搜索“摆花”。
1 斐波那契数列问题
众所周知的斐波那契数列(Fibonacci Sequence),它的递推式是这样的:$f_1 = f_2 = 1,f_i = f_{i-1} + f_{i-2}(i>2)$。
若求$f_i$项的值,朴素的想法是$O(i)$递推。有没有什么$\log$级别的算法呢?
我们不妨定义一些矩阵:设矩阵$F(i) = \begin{bmatrix} f_i&f_{i-1} \end{bmatrix}$,有没有可能从$F(i-1)$推出$F(i)$呢?
假设存在矩阵$base$,使$F(i-1)\times base = F(i)$。不难发现$F(i-1)\times base^2 = F(i+1)$,于是有一般规律$F(i)\times base^k= F(i+k)$,即可得$F(2)\times base^{i-2}= F(i)$。
我们知道$F(2) = \begin{bmatrix} 1&1 \end{bmatrix}$,而在式子$F(2)\times base^{i-2}= F(i)$中,后面的$base^{i-2}$是可以利用矩阵快速幂快速求得的。于是我们有了一种想法:假如知道$base$,我可以在$\log$级别的时间复杂度里推出$F(i)$,进而推出$f_i$。
$base$所满足的条件是$F(i-1)\times base = F(i)$,即$\begin{bmatrix} f_{i-1}&f_{i-2} \end{bmatrix} \times base=\begin{bmatrix} f_i&f_{i-1} \end{bmatrix}$。至少$base$应该是一个$2\times 2$阶的(请注意推广到一般形式,如果$F(i)$是$1\times n$阶的呢?),否则两矩阵相乘得不到一个$2\times 2$阶矩阵。
我们知道:$f_{i-1}\times 1+f_{i-2}\times 1 = f_i,f_{i-1}\times 1+f_{i-2}\times 0 =f_{i-1}$。即:
$$F(i-1)\times \begin{bmatrix} 1\newline 1 \end{bmatrix} = f_i $$ $$ F(i-1)\times \begin{bmatrix} 1\newline 0 \end{bmatrix} = f_{i-1} $$
故有:$F(i-1)\times \begin{bmatrix} 1&1\newline 1&0 \end{bmatrix} = F(i)$,即$base = \begin{bmatrix} 1&1\newline 1&0 \end{bmatrix}$。
于是利用式子$F(2)\times base^{i-2}= F(i)$,我们就求出$F(i) = \begin{bmatrix} f_i&f_{i-1} \end{bmatrix}$。再求$f_i$就简单不过了。
注意:当递推式不同时,$base$的值是会变的。
代码
模板
1 |
|
一个很有趣的结论:$ \text{gcd}(f_a,f_b) = f_{\text{gcd}(a,b)} $
例题:LG P1306
2 推广
假如现在不是斐波那契数列,而要求这么一个递推式在第$i$项的值:$f_1=f_2=f_3=1,f_x=f_{x-3}+f_{x-1} (x>3)$,该怎么用矩阵加速呢?
设矩阵$F(i) = \begin{bmatrix} f_{i}&f_{i-1}&f_{i-2} \end{bmatrix}$,则有$F(3) = \begin{bmatrix} f_1&f_2&f_3 \end{bmatrix}$。设$F(i)\times base^k = F(i+k)$,则有$F(i) = F(3)\times base^{i-3}$。通过上面的方法推导出$base = \begin{bmatrix} 1&1&0 \newline 0&0&1 \newline 1&0&0 \end{bmatrix}$(请自己手推一遍,按照上面的分别构造$f_i,f_{i-1},f_{i-2}$的方法!)。
然后求出第$i$项的值就是一个矩阵快速幂+矩阵乘法的事了。
代码
模板
1 |
|
3 再推广
广义斐波那契数列问题:
广义的斐波那契数列是指形如$f_n=p\times f_{n-1}+q\times f_{n-2}$的数列。今给定数列的两系数$p$和$q$,以及数列的最前两项$f_1$和$f_2$,另给出两个整数$n$和$m$,试求数列的第$n$项$f_n$除以$m$的余数。
这个问题其实依然可以矩阵加速。设矩阵$F(i) = \begin{bmatrix} f_i&f_{i-1} \end{bmatrix}$,有:
$$ F(i-1) \times \begin{bmatrix} p\newline q \end{bmatrix} = f_i$$ $$ F(i-1) \times \begin{bmatrix} 1\newline 0 \end{bmatrix} = f_{i-1}$$ 所以就是$ F(i-1) \times \begin{bmatrix} p&1\newline q&0 \end{bmatrix} = F(i)$。
再套矩阵加速就跟板子一样了。
代码
模板
1 |
|