常系数线性递推

坚强是说给别人听的谎言 提交于 2019-12-27 20:28:52

常系数齐次线性递推

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

设转移矩阵为\(A\)
矩阵快速幂的浪费之处在于我们求出了连续\(k\)项,但是我们实际只关心一项。
假如说我们现在构造出了一组\(c_0,\cdots,c_{k-1}\),使得\(A^n=\sum\limits_{i=0}^{k-1}c_iA^i\)
那么答案\((\mathbf fA^n)_0=\sum\limits_{i=0}^{k-1}c_i(\mathbf fA^i)_0=\sum\limits_{i=0}^{k-1}c_if_i\)
也就是说如果我们能够构造出一组\(c\),那么我们就能够在\(O(n)\)的时间内求出答案。

Part.2

接下来考虑如何求出\(c\)
先把\(A^n\)写成这样的形式:\(A^n=Q(A)G(A)+R(A)\)
其中\(R(A)=\sum\limits_{i=0}^{k-1}c_iA^i\)
那么可以设\(G(A)=\sum\limits_{i=0}^kg_iA^i\)
如果\(G(A)=0\)那么就有\(A^n\equiv R(A)(\mod G(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\)

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!