线性递推的求解
参考文献:2019集训队论文,钟子谦《两类递推数列的性质和应用》
这篇文章介绍如何求解,线性递推的应用更多在这里
数列{a0,a1,⋯}
向量序列{v0,v1,⋯}
矩阵序列{M0,M1,⋯}
的线性递推
序列a0,a1,⋯,an的线性递推的定义应当是
对于一个常数列r0,r1,⋯,rm(r0=1)
为了便于表示,令
λ(i,r)=∑mj=1ai−jrj
Δ(i,r)=∑mj=0ai−j
满足∀i≥m,Δ(i,r)=0
这似乎与与平常的认知有一些冲突
求解序列的最短线性递推: Berlekamp-Massey 算法
对于一个n个元素的数列a1,⋯,n,求出它的最短线性递推式
为了便于理解约定下文求出的是最小的m和对应的r1,⋯rm使得∀i∈[m+1,n],ai=∑mj=1ai−jrj
很显然使用高斯消元可以在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,此时只有一种情况即插入了第一个ai≠0,唯一的递推序列就是d(r′)=i,rj=0(j>0),此时显然成立
ii.m≠0
构造思路是找到一个r′使得∀j∈[d(r′),i−1],λ(j,r′)=0\andλ(n,r′)=Δ(i−1,r)
那么当前合法的转移就是r+r′
设t=Δ(n,r)Δ(f,p)
构造r′=t⋅xi−f−1(1−p)
写出来就是
r′={0,⋯,0,t⋅(1−p)}
i−f−1个0
r′={0,⋯,0,t,−t⋅p1,−t⋅p2⋯,−t⋅pd(p)}
i−f−1个0
此时,d(r′)=i−f+d(p)
当j∈[d(r′)+1,i−1]时,λ(j,r′)=∑d(r′)k=i−faj−kr′k
=t⋅(aj−(i−f)−λ(j−(i−f),p))
由于p对于j∈[d(r′)+1−(i−f),i−1−(i−f)]=[d(p)+1,f−1],p这个递推式成立
即λ(j,r′)=0
当j=i时,
λ(i,r′)=t⋅(ai−(i−f)+λ(i−(i−f),p))=t⋅Δ(f,p)
即λ(i,r′)=Δ(n,r)
完成了我们想要的构造,所以每次记录上一次的失配位置,即可找到最小递推式
关于为什么求得的就是最小递推,可以看论文里的证明
求解向量序列的线性递推
对于长度为n的向量序列{v0,v1,⋯}
在模P意义下,随机一个向量u,构造标量序列{v0u,v1u,⋯}
构造和求解这个标量序列的线性递推,复杂度均为O(n2)
求得的线性递推也为向量序列的线性递推的概率为1−nP,通常认为不会错
(可以认为复杂度与读入同阶?)
求解矩阵序列的线性递推
对于长度为n的矩阵序列{M0,M1,⋯}
同样在模P意义下,随机两个向量u,v,构造标量序列{uM0v,uM1v,⋯}
求解线性递推的复杂度为O(n2)
但是构造标量序列需要计算n次向量与矩阵的乘法,复杂度为O(n3)
(可以认为复杂度与读入同阶?)