([n]={1,cdots,n}),({[n]choose m})为在([n])中选出(m)个不同元素的所有方案
( ext{Some Definitions})
子矩阵
有矩阵(mathbf A_{n*m}),(Ssubseteq[n],Tsubseteq[m]),则(mathbf A_{S,T})为仅保留(mathbf A)的(rin S)行、(cin T)列得到的矩阵。
子式
(mathbf A_{n*n})的(k)阶子式(A_{S,T}=det(mathbf A_{S,T})),其中(S,Tsubseteq{[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-lambdamathbf E)mathbf x=mathbf0)成立,则称(lambda)为(mathbf A)的特征值,(mathbf x)为(mathbf A)的特征向量。
这个方程有解的充要条件是(det(mathbf A-lambdamathbf E)=0)。
同时我们有(prodlimits_{i=1}^nlambda_i=det(mathbf A),sumlimits_{i=1}^nlambda_i=sumlimits_{i=1}^nmathbf A_{i,i})。
特征多项式
设(f(lambda)=det(mathbf A-lambdamathbf E)),不难发现这是个关于(lambda)的(n)次多项式,我们称之为(mathbf A)的特征多项式,而它的(k)个解就是(mathbf A)的(n)个特征值。
( ext{Some Theorems And Examples})
Cayley-Hamilton定理
一个矩阵的特征多项式是化零多项式。
Laplace定理
(det(mathbf A_{n*n})=sumlimits_{i=1}^na_{i,k}M_{i,k}=sumlimits_{i=1}^na_{k,i}M_{k,i}qquad kin[n])
Cauchy-Binet公式
给定矩阵(mathbf A_{m*n},mathbf B_{n*m}),则(det(mathbf{AB})=sumlimits_{Sin{[n]choose m}}det(mathbf A_{[m],S})det(mathbf B_{[S],m}))。
Kirchhoff定理
Vandermonde矩阵
(mathbf V(x_0,cdots,x_n)=egin{pmatrix}x_0^0&cdots&x_n^0\vdots&ddots&vdots\x_0^n&cdots&x_n^nend{pmatrix})
我们有(det(mathbf V(x_0,cdots,x_n))=prodlimits_{0le i<jle n}(x_i-x_j))
Hadamard矩阵
(mathbf H_n)满足(mathbf {HH^T}=nmathbf I_n),一般(n)满足(n=2^k)。
(det(mathbf H_n)=pm n^{frac n2})
构造就是(mathbf H_1=(1),mathbf H_{2^k}=egin{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}(ioperatorname{ans}j)}quad(i,jin[0,n)))
( ext{Some Algorithms})
常系数齐次线性递推
给定(a_0,cdots,a_{k-1},f_0,cdots,f_{k-1}),且(forall iin[k,+infty),a_i=sumlimits_{j=1}^kf_ja_{i-j}),求(a_n)。
( ext{Part.1})
设转移矩阵为(mathbf A)。
矩阵快速幂的浪费之处在于我们求出了连续(k)项,但是我们实际只关心一项。
假如说我们现在构造出了一组(c_0,cdots,c_{k-1}),使得(mathbf A^n=sumlimits_{i=0}^{k-1}c_imathbf A^i)。
那么答案((mathbf fmathbf A^n)_0=sumlimits_{i=0}^{k-1}c_i(mathbf fmathbf A^i)_0=sumlimits_{i=0}^{k-1}c_if_i)。
也就是说如果我们能够构造出一组(c),那么我们就能够在(O(n))的时间内求出答案。
( ext{Part.2})
接下来考虑如何求出(c)。
先把(mathbf A^n)写成这样的形式:(mathbf A^n=Q(mathbf A)G(mathbf A)+R(mathbf A))。
其中(R(mathbf A)=sumlimits_{i=0}^{k-1}c_imathbf A^i)。
那么可以设(G(mathbf A)=sumlimits_{i=0}^kg_imathbf A^i)。
如果(G(mathbf A)=0)那么就有(mathbf A^nequiv R(mathbf A)pmod{G(mathbf A)})了。
也就是说如果我们能够构造出一组(g),那么我们就能够在(O(klog klog n))的时间内求出(c)。
( ext{Part.3})
接下来考虑如何求出(g)。
注意到刚才的过程对于任意矩阵都是成立的。
也就是说如果对于任意一个矩阵而言都能轻松找到(g)那么矩阵就没用了。
所以(g)肯定不是什么好找的东西。然后让我们进入线性代数的内容。
先给出结论:(forall iin[0,k),g_i=-f_{k-1-i},g_k=1)。
下面将给出推导过程。
( ext{Part.4})
手玩(mathbf A)可以得到(f(lambda)=(-1)^k(lambda^k-sumlimits_{i=0}^{k-1}a_{k-i-1}lambda^i))。
实际上取个反并不会让(k)个解变动,所以我们把它的特征多项式看做(f(lambda)=lambda^k-sumlimits_{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-sumlimits_{i=1}^sf_{c,i}a_{t-i})。
如果(Delta_{c,t}=0),那么说明(F_c)当前没有问题,它是对的。直接检查(t+1)位。
否则说明当前的递推式有问题,我们需要修改。
如果(c=0),说明(forall iin[1,t-1],a_i=0),那么易证此时能够拟合前(t)项的最短的递推式为({0,cdots,0}_t)。
如果(c
e0),我们考虑构造一个最短递推式(F')使得(forall iin(|F'|,t),sumlimits_{j=0}^{|F'|}F'_ja_{i-j}=0wedgesumlimits_{j=0}^{|F'|}F'_ja_{t-j}=Delta_t),然后(F_{c+1}=F'+F_c)就行了。
我们找一个(idin[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))。