编程语言
首页 > 编程语言> > Berlekamp-Massey 算法(最短线性递推)

Berlekamp-Massey 算法(最短线性递推)

作者:互联网

Berlekamp-Massey 算法(最短线性递推)

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

算法简介

对于一个\(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)\)

\(\lambda(n,r)=\sum_{i=1}^{d(r)}a_{n-i}r_i\)

\(\Delta(n,r)=a_n-\lambda (n,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\),此时显然成立

\(\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)\)

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

然后,上面的构造方法只满足构造出一个合法的线性递推式,并没有证明是\(m\)是最小的

但是在OI竞赛中,通常我们只是需要快速求出递推式,并不要求最短线性递推

如果想要看到严谨的证明还请移步2019集训队论文

标签:Massey,cdot,算法,cdots,Berlekamp,Delta,递推,lambda
来源: https://www.cnblogs.com/chasedeath/p/13101035.html