基础线性代数
\([n]=\{1,\cdots,n\}\),\({[n]\choose m}\)为在\([n]\)中选出\(m\)个不同元素的所有方案
\(\text{Some Definitions}\)
子矩阵
有矩阵\(\mathbf A_{n*m}\),\(S\subseteq[n],T\subseteq[m]\),则\(\mathbf A_{S,T}\)为仅保留\(\mathbf A\)的\(r\in S\)行、\(c\in T\)列得到的矩阵。
子式
\(\mathbf A_{n*n}\)的\(k\)阶子式\(A_{S,T}=\det(\mathbf A_{S,T})\),其中\(S,T\subseteq{[n]\choose k}\)。
主子式
若\(S=T\)则\(A_{S,T}\)被称为主子式。
顺序主子式
若\(S=T=[k]\)则\(A_{S,T}\)被称为顺序主子式。
余子式
\(\mathbf A_{n*n}\)的\(k\)阶余子式\(M_{S,T}=A_{[n]\setminus S,[n]\setminus T}\)。
特殊的,当\(S=\{i\},T=\{j\}\)时,\(M_{S,T}\)又记作\(M_{i,j}\)。
代数余子式
\(C_{i,j}=(-1)^{i+j}M_{i,j}\)。
余子矩阵
\(\mathbf A_{n*n}\)的余子矩阵\(\mathbf C\)满足\(\mathbf C_{i,j}=C_{i,j}\)。
伴随矩阵
\(\operatorname{adj}(\mathbf A)=\mathbf A^*=\mathbf C^T\)
我们有\(\mathbf A^{-1}=\frac{\mathbf A^*}{\det(\mathbf A)}\)。
特征值和特征向量
对于\(\mathbf A_{n*n}\),若数\(\lambda\)和\(n\)维非零向量\(\mathbf x\)使得\((\mathbf A-\lambda\mathbf E)\mathbf x=\mathbf0\)成立,则称\(\lambda\)为\(\mathbf A\)的特征值,\(\mathbf x\)为\(\mathbf A\)的特征向量。
这个方程有解的充要条件是\(\det(\mathbf A-\lambda\mathbf E)=0\)。
同时我们有\(\prod\limits_{i=1}^n\lambda_i=\det(\mathbf A),\sum\limits_{i=1}^n\lambda_i=\sum\limits_{i=1}^n\mathbf A_{i,i}\)。
特征多项式
设\(f(\lambda)=\det(\mathbf A-\lambda\mathbf E)\),不难发现这是个关于\(\lambda\)的\(n\)次多项式,我们称之为\(\mathbf A\)的特征多项式,而它的\(k\)个解就是\(\mathbf A\)的\(n\)个特征值。
\(\text{Some Theorems And Examples}\)
Cayley-Hamilton定理
一个矩阵的特征多项式是化零多项式。
Laplace定理
\(\det(\mathbf A_{n*n})=\sum\limits_{i=1}^na_{i,k}M_{i,k}=\sum\limits_{i=1}^na_{k,i}M_{k,i}\qquad k\in[n]\)
Cauchy-Binet公式
给定矩阵\(\mathbf A_{m*n},\mathbf B_{n*m}\),则\(\det(\mathbf{AB})=\sum\limits_{S\in{[n]\choose m}}\det(\mathbf A_{[m],S})\det(\mathbf B_{[S],m})\)。
Kirchhoff定理
Vandermonde矩阵
\(\mathbf V(x_0,\cdots,x_n)=\begin{pmatrix}x_0^0&\cdots&x_n^0\\\vdots&\ddots&\vdots\\x_0^n&\cdots&x_n^n\end{pmatrix}\)
我们有\(\det(\mathbf V(x_0,\cdots,x_n))=\prod\limits_{0\le i<j\le n}(x_i-x_j)\)
Hadamard矩阵
\(\mathbf H_n\)满足\(\mathbf {HH^T}=n\mathbf I_n\),一般\(n\)满足\(n=2^k\)。
\(\det(\mathbf H_n)=\pm n^{\frac n2}\)
构造就是\(\mathbf H_1=(1),\mathbf H_{2^k}=\begin{pmatrix}\mathbf H_{2^{k-1}}&\mathbf H_{2^{k-1}}\\\mathbf H_{2^{k-1}}&-\mathbf H_{2^{k-1}}\end{pmatrix}\)
即\(\mathbf H_{i,j}=(-1)^{\operatorname{bit}(i\operatorname{ans}j)}\quad(i,j\in[0,n))\)
\(\text{Some Algorithms}\)
常系数齐次线性递推
给定\(a_0,\cdots,a_{k-1},f_0,\cdots,f_{k-1}\),且\(\forall i\in[k,+\infty),a_i=\sum\limits_{j=1}^kf_ja_{i-j}\),求\(a_n\)。
\(\text{Part.1}\)
设转移矩阵为\(\mathbf A\)。
矩阵快速幂的浪费之处在于我们求出了连续\(k\)项,但是我们实际只关心一项。
假如说我们现在构造出了一组\(c_0,\cdots,c_{k-1}\),使得\(\mathbf A^n=\sum\limits_{i=0}^{k-1}c_i\mathbf A^i\)。
那么答案\((\mathbf f\mathbf A^n)_0=\sum\limits_{i=0}^{k-1}c_i(\mathbf f\mathbf A^i)_0=\sum\limits_{i=0}^{k-1}c_if_i\)。
也就是说如果我们能够构造出一组\(c\),那么我们就能够在\(O(n)\)的时间内求出答案。
\(\text{Part.2}\)
接下来考虑如何求出\(c\)。
先把\(\mathbf A^n\)写成这样的形式:\(\mathbf A^n=Q(\mathbf A)G(\mathbf A)+R(\mathbf A)\)。
其中\(R(\mathbf A)=\sum\limits_{i=0}^{k-1}c_i\mathbf A^i\)。
那么可以设\(G(\mathbf A)=\sum\limits_{i=0}^kg_i\mathbf A^i\)。
如果\(G(\mathbf A)=0\)那么就有\(\mathbf A^n\equiv R(\mathbf A)\pmod{G(\mathbf A)}\)了。
也就是说如果我们能够构造出一组\(g\),那么我们就能够在\(O(k\log k\log n)\)的时间内求出\(c\)。
\(\text{Part.3}\)
接下来考虑如何求出\(g\)。
注意到刚才的过程对于任意矩阵都是成立的。
也就是说如果对于任意一个矩阵而言都能轻松找到\(g\)那么矩阵就没用了。
所以\(g\)肯定不是什么好找的东西。然后让我们进入线性代数的内容。
先给出结论:\(\forall i\in[0,k),g_i=-f_{k-1-i},g_k=1\)。
下面将给出推导过程。
\(\text{Part.4}\)
手玩\(\mathbf A\)可以得到\(f(\lambda)=(-1)^k(\lambda^k-\sum\limits_{i=0}^{k-1}a_{k-i-1}\lambda^i)\)。
实际上取个反并不会让\(k\)个解变动,所以我们把它的特征多项式看做\(f(\lambda)=\lambda^k-\sum\limits_{i=0}^{k-1}a_{k-i-1}\lambda^i\)也没问题。
根据Cayley-Hamilton定理,\(f(\mathbf A)=\mathbf0\)。
所以我们就成功求得了\(g\)。
Berlekamp-Massey算法
给定\(a_1,\cdots,a_n\),求其最短常系数齐次线性递推式。
设第\(c\)个递推式为\(F_c=\{f_{c,1},\cdots,f_{c,s}\}\),它在\(fail_c=a_t\)出错了。
假如当前是第\(c\)个递推式,长度为\(s\),它已经拟合了\(a_1,\cdots,a_{t-1}\)。
记\(\Delta_{c,i}=a_t-\sum\limits_{i=1}^sf_{c,i}a_{t-i}\)。
如果\(\Delta_{c,t}=0\),那么说明\(F_c\)当前没有问题,它是对的。直接检查\(t+1\)位。
否则说明当前的递推式有问题,我们需要修改。
如果\(c=0\),说明\(\forall i\in[1,t-1],a_i=0\),那么易证此时能够拟合前\(t\)项的最短的递推式为\(\{0,\cdots,0\}_t\)。
如果\(c\ne0\),我们考虑构造一个最短递推式\(F'\)使得\(\forall i\in(|F'|,t),\sum\limits_{j=0}^{|F'|}F'_ja_{i-j}=0\wedge\sum\limits_{j=0}^{|F'|}F'_ja_{t-j}=\Delta_t\),然后\(F_{c+1}=F'+F_c\)就行了。
我们找一个\(id\in[0,c)\),设\(r=\frac{\Delta_{c,t}}{\Delta_{id,fail_id}}\)。
构造\(F'=\{0,\cdots,0,r,-rf_{id,1},\cdots,-rf_{id,s_{id}}\}\),前面是\(t-fail_{id}-1\)个\(0\),容易证明这个\(F'\)满足要求。
为了求最短递推式,我们只需要每次找\(t-fail_{id}+s_{id}\)最短的即\(s_{id}-fail_{id}\)最大那一个就行了。
时间复杂度为\(O(n^2)\),空间复杂度通过小优化可以做到\(O(n)\)。