线性递推(Berlekamp-Massey 算法)

线性递推的求解

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

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

数列\(\{a_0,a_1,\cdots \}\)

向量序列\(\{v_0,v_1,\cdots\}\)

矩阵序列\(\{M_0,M_1,\cdots\}\)

的线性递推

序列\(a_0,a_1,\cdots,a_n\)的线性递推的定义应当是

对于一个常数列\(r_0,r_1,\cdots,r_m(r_0=1)\)

为了便于表示,令

\(\lambda(i,r)=\sum_{j=1}^{m}a_{i-j}r_j\)

\(\Delta(i,r)=\sum_{j=0}^m a_{i-j}\)

满足\(\forall i\ge m,\Delta(i,r)=0\)

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

\[\ \]

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

对于一个\(n\)个元素的数列\(a_{1,\cdots, n}\),求出它的最短线性递推式

为了便于理解约定下文求出的是最小的\(m\)和对应的\(r_1,\cdots r_m\)使得\(\forall i\in [m+1,n],a_i=\sum_{j=1}^{m}a_{i-j}r_j\)

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

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

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

\[\ \]

\[\ \]

算法过程

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

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

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

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

2.\(\Delta(i,r)\ne 0\)

\(\text{i}.m=0\),此时只有一种情况即插入了第一个\(a_i\ne 0\),唯一的递推序列就是\(d(r')=i,r_j=0(j>0)\),此时显然成立

\(\text{ii}.m\ne 0\)

构造思路是找到一个\(r'\)使得\(\forall j\in[d(r'),i-1],\lambda(j,r')=0\and \lambda (n,r')=\Delta(i-1,r)\)

那么当前合法的转移就是\(r+r'\)

\(t=\frac{\Delta(n,r)}{\Delta(f,p)}\)

构造\(r'=t \cdot x^{i-f-1}(1-p)\)

写出来就是

\(r'=\{\underbrace{0,\cdots,0},t\cdot (1-p)\}\)

$ \ \ \ \ \ \ \ \ i-f-1$个\(0\)

\(r'=\{\underbrace{0,\cdots,0},t,-t\cdot p_{1},-t\cdot p_{2}\cdots,-t\cdot p_{d(p)}\}\)

$ \ \ \ \ \ \ \ \ i-f-1$个\(0\)

此时,\(d(r')=i-f+d(p)\)

\(j\in [d(r')+1,i-1]\)时,\(\lambda(j,r')=\sum_{k=i-f}^{d(r')}a_{j-k}r'_k\)

\(=t\cdot( a_{j-(i-f)}-\lambda(j-(i-f),p))\)

由于\(p\)对于\(j\in[d(r')+1-(i-f),i-1-(i-f)]=[d(p)+1,f-1]\)\(p\)这个递推式成立

\(\lambda(j,r')=0\)

\(j=i\)时,

\(\lambda(i,r')=t\cdot (a_{i-(i-f)}+\lambda(i-(i-f),p))=t\cdot \Delta(f,p)\)

\(\lambda (i,r')=\Delta(n,r)\)

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

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

求解向量序列的线性递推

对于长度为\(n\)的向量序列\(\{v_0,v_1,\cdots\}\)

在模\(P\)意义下,随机一个向量\(u\),构造标量序列\(\{v_0u,v_1u,\cdots\}\)

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

求得的线性递推也为向量序列的线性递推的概率为\(1-\frac{n}{P}\),通常认为不会错

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

\[\ \]

求解矩阵序列的线性递推

对于长度为\(n\)的矩阵序列\(\{M_0,M_1,\cdots\}\)

同样在模\(P\)意义下,随机两个向量\(u,v\),构造标量序列\(\{uM_0v,uM_1v,\cdots\}\)

求解线性递推的复杂度为\(O(n^2)\)

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

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

posted @ 2020-06-12 17:56  chasedeath  阅读(1276)  评论(0编辑  收藏  举报