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