常系数齐次线性递推算法学习

时间:2021-08-09 11:14:21

简介

定义:设有数列{an}an=i=1kanifi,则称该数列满足k阶齐次线性递推关系。

求法

现在我们从最基础的矩阵快速幂开始一步一步优化求an的时间复杂度。

矩阵快速幂

直接上矩阵快速幂来优化递推即可,时间复杂度为O(k3logn),非常不优秀,因此我们考虑用更快的方法求出an

在我们知道了a1,a2,...ak之后想推出an的方法可以借鉴矩阵快速幂的方法,构造一个kk的矩阵M来完成递推,关键就是优化求Mn的时间复杂度了,这里我们引入一个叫做特征多项式的东西。

特征多项式

一些定义

特征值,特征向量A,λvλv=Av则称向量v为矩阵A的一组特征向量,λ为矩阵A的一组特征值。
特征多项式,特征方程,特征值:我们对上面的关系式进行变换:(λEA)v=0,学过线性代数的都知道这个方程有解的充要条件是det(λEA)=0,于是我们将det(λEA)看成一个k次多项式f(x),我们将f(x)=0这个方程称作特征方程,将f(x)称作特征多项式,而特征方程的k个根就是k个特征值。
由于一共有k个解,因此我们可以换一种形式来表示f(x)f(x)=i=1k(xλi),λiii

Cayley-Hamilton定理

这是特征根多项式的一个重要性质,叙述如下:
A是数域P上的N阶矩阵,其特征多项式f(λ)=λEA=λN+b1λN1+b2λN2+...+bN1λ+bN
f(A)=AN+b1AN1+b2AN2+...+bN1A+bN=O,即f(λ)为化零多项式。

递推优化

考虑M的特征多项式f(x),这是一个k次多项式。
不妨对Mnf(M)做一个多项式除法,令Mn=f(M)g(M)+r(M),考虑到f(x)M的特征多项式,因此f(M)=Or(M)=Mn,于是问题转化成了求Mn%f(M),并且我们已知这个多项式次数最多是k1
然后就只用求出f(M)即可。
推导过程摘自DZYO的博客
常系数齐次线性递推算法学习
常系数齐次线性递推算法学习
求出来之后对多项式取模即可。
直接O(k2)取模总时间复杂度是O(k2logn)的。
当然可以更加毒瘤,我们用FFT来优化把总时间复杂度降到O(klogklogn)