常系数线性递推

常系数齐次线性递推

给定\(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\)

一眼看上去有点像分治NTT。

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)\)的时间内求出答案。

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)(\mod G(\mathbf A))\)了。
也就是说如果我们能够构造出一组\(g\),那么我们就能够在\(O(k\log k\log n)\)的时间内求出\(c\)

Part.3

接下来考虑如何求出\(g\)
注意到刚才的过程对于任意矩阵都是成立的。
也就是说如果对于任意一个矩阵而言都存在一个\(g\)那么矩阵就没用了。
所以\(g\)肯定不是什么好找的东西。然后让我们进入线性代数的内容。
先给出结论:\(\forall i\in[0,k),g_i=f_{k-1-i}.g_k=1\)
下面将给出推导过程。

猜你喜欢

转载自www.cnblogs.com/cjoierShiina-Mashiro/p/12109447.html