====== Berlekamp-Massey 算法 ====== ===== 算法介绍 ===== 设域 $F$ 上有一无限数列 $s_{0},s_{1},\cdots$,我们想要对某个有限的 $n$,找到一个尽可能短的数列 $c_{1},\cdots,c_{L}$,使得 $s_{j}=-\sum_{i=1}^{L}c_{i}s_{j-i}$ 对 $j=L,L+1,\cdots,n-1$ 成立。特别地,若 $L=0$,意味着 $s_{0}=s_{1}=\cdots=s_{n-1}=0$。记 $s_{0},\cdots,s_{n-1}$ 为 $s^{(n)}$,这样的数列 $c$ 称为 $s^{(n)}$ 的递推式。由定义可以看出,任意 $L\ge n$ 的数列 $c$ 都是 $s^{(n)}$ 的递推式。我们定义长度最小的递推式为最小递推式。下面证明一个重要的引理: ==== 引理 1 ==== 设长度为 $L$ 的数列 $c$ 是 $s^{(n)}$ 的递推式,而不是 $s^{(n+1)}$ 的递推式;长度为 $L'$ 的数列 $c'$ 是 $s^{(n+1)}$ 的递推式,那么 $L'\ge n+1-L$。 **证明**:采用反证法,假设 $L'\le n-L$,那么有 $$ \begin{aligned} s_{n}&=-\sum_{i=1}^{L'}c'_{i}s_{n-i}\\ &=-\sum_{i=1}^{L'}c'_{i}\left(-\sum_{j=1}^{L}c_{j}s_{n-i-j}\right) \end{aligned} $$ 注意这里如果 $L'>n-L$,则不能展开成括号内的形式。 $$ \begin{aligned} s_{n}&=-\sum_{j=1}^{L}c_{j}\left(-\sum_{i=1}^{L'}c'_{i}s_{n-i-j}\right)\\ &=-\sum_{j=1}^{L}c_{j}s_{n-j} \end{aligned} $$ 这与 $c$ 不是 $s^{(n+1)}$ 的递推式矛盾。$\Box$ 我们定义 $L^{(n)}(s)$ 表示 $s^{(n)}$ 最小递推式的长度。显然有 $L^{(n)}(s)\le L^{(n+1)}(s)$。假如 $L^{(n)}(s)$ 对应的 $c$ 不是 $s^{(n+1)}$ 的递推式,那么就有 $L^{(n+1)}(s)\ge\max\{L^{(n)}(s),n+1-L^{(n)}(s)\}$。我们定义多项式 $C(x)=1+\sum_{i=1}^{L}c_{i}x^{i}$,并记 $L^{(n)}(s)$ 对应的 $c$ 为 $c^{(n)}$,它对应的多项式为 $C^{(n)}(x)$。 为了便于叙述下面的定理,我们先讲一个性质:如果不同的 $c^{(n)}$ 中,既有是 $s^{(n+1)}$ 的递推式的,也有不是 $s^{(n+1)}$ 的递推式的,那么显然有 $L^{(n)}(s)\ge n+1-L^{(n)}(s)$。 ==== 定理 1 ==== 对于 $\forall n\in\mathbb{N}$,若 $c^{(n)}$ 中有是 $s^{(n+1)}$ 的递推式的,那么 $L^{(n+1)}(s)=L^{(n)}(s)$;若 $c^{(n)}$ 中有不是 $s^{(n+1)}$ 的递推式的,那么 $L^{(n+1)}(s)=\max\{L^{(n)}(s),n+1-L^{(n)}(s)\}$ 。根据上面的性质,如果二者都有,命题也不矛盾。 **证明**:我们用归纳法证明该性质。记 $d_{n}=s_{n}+\sum_{i=1}^{L^{(n)}(s)}c^{(n)}_{i}s_{n-i}$。 第一个部分,即存在一个 $d_{n}=0$。我们只要让 $c^{(n+1)}=c^{(n)}$ 即可。 第二个部分,即存在一个 $d_{n}\neq 0$。若 $L^{(n)}(s)=0$,那么也显然成立。 否则,必然存在一个 $m$,使得 $L^{(m)}(s)