简介
定义:设有数列{an}满足递推关系an=i=1∑kan−ifi,则称该数列满足k阶齐次线性递推关系。
求法
现在我们从最基础的矩阵快速幂开始一步一步优化求an的时间复杂度。
矩阵快速幂
直接上矩阵快速幂来优化递推即可,时间复杂度为O(k3logn),非常不优秀,因此我们考虑用更快的方法求出an。
在我们知道了a1,a2,...ak之后想推出an的方法可以借鉴矩阵快速幂的方法,构造一个k∗k的矩阵M来完成递推,关键就是优化求Mn的时间复杂度了,这里我们引入一个叫做特征多项式的东西。
特征多项式
一些定义
特征值,特征向量:对于一个矩阵A,若∃常数λ和向量v满足λv=Av则称向量v为矩阵A的一组特征向量,λ为矩阵A的一组特征值。
特征多项式,特征方程,特征值:我们对上面的关系式进行变换:(λE−A)v=0,学过线性代数的都知道这个方程有解的充要条件是det(λE−A)=0,于是我们将det(λE−A)看成一个k次多项式f(x),我们将f(x)=0这个方程称作特征方程,将f(x)称作特征多项式,而特征方程的k个根就是k个特征值。
由于一共有k个解,因此我们可以换一种形式来表示f(x):f(x)=∏i=1k(x−λi),λi指第i个特征值即第i个解
Cayley-Hamilton定理
这是特征根多项式的一个重要性质,叙述如下:
设A是数域P上的N阶矩阵,其特征多项式f(λ)=∣λE−A∣=λN+b1λN−1+b2λN−2+...+bN−1λ+bN。
则f(A)=AN+b1AN−1+b2AN−2+...+bN−1A+bN=O,即f(λ)为化零多项式。
递推优化
考虑M的特征多项式f(x),这是一个k次多项式。
不妨对Mn和f(M)做一个多项式除法,令Mn=f(M)g(M)+r(M),考虑到f(x)是M的特征多项式,因此f(M)=O⇒r(M)=Mn,于是问题转化成了求Mn%f(M),并且我们已知这个多项式次数最多是k−1
然后就只用求出f(M)即可。
推导过程摘自DZYO的博客:
求出来之后对多项式取模即可。
直接O(k2)取模总时间复杂度是O(k2logn)的。
当然可以更加毒瘤,我们用FFT来优化把总时间复杂度降到O(klogklogn)