常系数齐次线性递推式第n项的快速计算初探 XJB学后的XBJ胡扯
要做啥?
求\(f[n]=\sum_{i=1}^ka[i]f[n-i]\),\(a,f[1\to k]\)已经给出。
我会矩阵快速幂!
时间复杂度\(O(k^3\log n)\),其中\(n\le 10^9,k\le32000\),emmm。
我不会魔法!
设初始状态矩阵为\(S\),转移矩阵为\(A\),不难发现一步转移长得像这个样子(四阶情形)
\[ \begin{bmatrix} f[n]\\ f[n-1]\\ f[n-2]\\ f[n-3] \end{bmatrix} =\begin{bmatrix} a[1]&a[2]&a[3]&a[4]\\ 1&0&0&0\\ 0&1&0&0\\ 0&0&1&0\\ \end{bmatrix} \begin{bmatrix} f[n-1]\\ f[n-2]\\ f[n-3]\\ f[n-4] \end{bmatrix} \]
令\(n=n-k\),构造序列\(c\)满足\(A^n=\sum_{i=0}^{k-1}c[i]A^i\),两边同时右乘\(S\),
\[ A^nS=(\sum_{i=0}^{k-1}c[i]A^i)S=\sum_{i=0}^{k-1}c[i]A^iS \]
我们的答案为\((A^nS)[0,0]\),注意\(A\)的特征,可以发现,
\[ (A^nS)[0,0]=\sum_{i=0}^{k-1} c[i](A^iS)[0,0]=\sum_{i=0}^{k-1}c[i]S[i,0] \]
所以只要构造出\(c\),我们就能\(O(k)\)地完成答案的计算。所以\(c\)的构造才是重点啊
令\(G(A)\)是一个以矩阵为参数的\(k\)次多项式,并且\(G(A)=0\),那么
\[ A^n=P(A)G(A)+Q(A)=P(A)G(A)+\sum_{i=0}^{k-1}c[i](A^i)=\sum_{i=0}^{k-1}c[i]A^i \]
所以序列\(c\)就是\(A^n\bmod G(A)\)的系数。所以\(G(A)\)的构造才是重点啊
更强du力liu的魔法
上接,若等式\((\lambda I-A)V=0\)成立,称\(\lambda\)为\(A\)的特征值,\(V\)为特征向量,有如下结论
- 若\(\det(A)\not=0\),则\(A\)有\(k\)组线性无关的特征向量
- \(\det(\lambda I-A)=0\)是等式种\(V\)存在的充要条件(\(p(\lambda)=\det(\lambda I-A)\)是\(A\)的特征多项式)
Cayley-Hamilton theorem
若\(\det(A)\not=0\),则\(\prod_{t}(\lambda[t]I-A)=0\),\(\lambda[t]\)是第\(t\)个特征值。
肉眼可见对于转移矩阵\(A\)满足\(\det(A)=(-1)^{k-1}a[k]\not=0\),所以\(G(x)=\prod_{t}(\lambda[t]I-A)\)。
然而还是还是不会
结论多项式\(p(\lambda)\)与多项式\(\prod_{t}(\lambda[t]I-A)\)的系数一样。
所以求出\(p(\lambda)\)的系数就好了,手玩可得
\[ p(\lambda)=\lambda^k-\sum_{i=1}^ka[i]\lambda^{k-i} \]
为什么我手玩的\(p(\lambda)\)没有系数\((-1)^k\)呢?
所以,得到\(p(\lambda)\)的系数构造出\(G(A)\)再得到\(A^n\bmod G(A)\),然后获取答案就行了。
取模的那部分是快速幂套多项式取模,所以总的时间复杂度为\(O(k\log k\log n)\)。
魔法的copy实现
暂时留坑 题目传送门