线性递推的求解(Berlekamp-Massey)

线性递推的求解(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\) 的线性递推的定义为:

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

  2. \(\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\) 的序列为一个线性递推序列。

稍作变换可以得到更加符合常理的形式:\(a_i=\sum_{j=1}^m r'_j \cdot a_{i-j}\)


求解序列的最短线性递推: 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\)

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

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

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