线性递推的求解

参考文献:2019集训队论文,钟子谦《两类递推数列的性质和应用》

这篇文章介绍如何求解,线性递推的应用更多在这里

数列{a0,a1,}

向量序列{v0,v1,}

矩阵序列{M0,M1,}

的线性递推

序列a0,a1,,an的线性递推的定义应当是

对于一个常数列r0,r1,,rm(r0=1)

为了便于表示,令

λ(i,r)=j=1maijrj

Δ(i,r)=j=0maij

满足im,Δ(i,r)=0

这似乎与与平常的认知有一些冲突

 

求解序列的最短线性递推: Berlekamp-Massey 算法

对于一个n个元素的数列a1,,n,求出它的最短线性递推式

为了便于理解约定下文求出的是最小的m和对应的r1,rm使得i[m+1,n],ai=j=1maijrj

很显然使用高斯消元可以在O(n3)的时间内求解

Berlekamp-Massey(BM)算法是通过依次对于前i项构造,

添加每一项时在O(n)的时间内找到一个可行的构造方法,将复杂度降低到了O(n2)

  

算法过程

为了更好描述,设r的阶为d(r)

考虑依次加入每个数ai,设当前d(r)=m,上一次的递推是p,p出现不匹配的位置是f

特别的,初始状态的递推是r={},f=0

1.Δ(i,r)=0,那么不需要扩展

2.Δ(i,r)0

i.m=0,此时只有一种情况即插入了第一个ai0,唯一的递推序列就是d(r)=i,rj=0(j>0),此时显然成立

ii.m0

构造思路是找到一个r使得j[d(r),i1],λ(j,r)=0\andλ(n,r)=Δ(i1,r)

那么当前合法的转移就是r+r

t=Δ(n,r)Δ(f,p)

构造r=txif1(1p)

写出来就是

r={0,,0,t(1p)}

        if10

r={0,,0,t,tp1,tp2,tpd(p)}

        if10

此时,d(r)=if+d(p)

j[d(r)+1,i1]时,λ(j,r)=k=ifd(r)ajkrk

=t(aj(if)λ(j(if),p))

由于p对于j[d(r)+1(if),i1(if)]=[d(p)+1,f1]p这个递推式成立

λ(j,r)=0

j=i时,

λ(i,r)=t(ai(if)+λ(i(if),p))=tΔ(f,p)

λ(i,r)=Δ(n,r)

完成了我们想要的构造,所以每次记录上一次的失配位置,即可找到最小递推式

关于为什么求得的就是最小递推,可以看论文里的证明

求解向量序列的线性递推

对于长度为n的向量序列{v0,v1,}

在模P意义下,随机一个向量u,构造标量序列{v0u,v1u,}

构造和求解这个标量序列的线性递推,复杂度均为O(n2)

求得的线性递推也为向量序列的线性递推的概率为1nP,通常认为不会错

(可以认为复杂度与读入同阶?)

 

求解矩阵序列的线性递推

对于长度为n的矩阵序列{M0,M1,}

同样在模P意义下,随机两个向量u,v,构造标量序列{uM0v,uM1v,}

求解线性递推的复杂度为O(n2)

但是构造标量序列需要计算n次向量与矩阵的乘法,复杂度为O(n3)

(可以认为复杂度与读入同阶?)