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集训队论文