常系数线性递推式的快速求单项值方法
前导知识
- 常系数线性递推式
- 形如f(n)=∑ki=1aif(n−i),其中k、
ai 为常数的递推式,称为常系数线性递推式。
- 形如f(n)=∑ki=1aif(n−i),其中k、
- Cayley-Hamilton定理
- 对于矩阵A,
det(λE−A) 是一个|A|次多项式,称为A的特征多项式(characteristic polynomial),记为g(λ)。 - 对于任意矩阵A,g(A)=0。
- 证明参见任何一本高等代数教科书。
- 对于矩阵A,
- 模多项式
- 设f是n次多项式,
g 是m次多项式。 - 存在多项式k、
l ,满足kg+l=f,且l的次数小于m。 - 称
l 为f模g 的余多项式。 - 证明参见任何一本高等代数教科书。
- 设f是n次多项式,
正文
设有递推式f(n)=∑ki=1aif(n−i),我们需要求f(m)。
通常而言,我们是构建一个k阶的矩阵A,称A为递推式的伴随矩阵(adjoint matrix);构建一个向量
那么问题转化为求(TAp)1,1的值,而主要的瓶颈在于求Ap的值。
设Ap=kg(A)+l,其中l为
最终我们得到Ap=∑|A|−1i=0biAi。注意到我们现在仅关心[T(∑|A|−1i=0biAi)]1,1,而对于|A|−1≥i≥0,(TAi)1,1都直接表示f(i+1)的值,这也就是递推的初值,于是答案就是∑|A|−1i=0bif(i+1)。
总时间复杂度为O(klogklogm)。