Berlekamp-Massey算法

Berlekamp-Massey算法

https://blog.csdn.net/qq_39972971/article/details/80725873?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-2.nonecase&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-2.nonecase

\(R\) 表示数列 \(\{a_1,a_2,\cdots,a_n\}\) 的最短线性递推式 \(\{r_1,r_2,\cdots,r_m\}\) ,即

\[a_i = \sum_{j=1}^m a_{i-j}r_j \ \ \ (i > m) \]

用Berlekamp-Massey算法可以在 \(O(n |R|)\) 的时间算出 \(R\) .

可以用于找到题目性质,乃至于直接求出答案的递推式.

算法思想

求出 \(\{a_1,a_2,\cdots,a_{i-1}\}\) 的最短线性递推式,然后通过调整的方法求出 \(\{a_1,a_2,\cdots,a_i,a_i\}\) 的最短线性递推式

算法流程

定义 \(\{a_1,a_2,\cdots,a_{i-1}\}\) 的最短线性递推式 \(\{r_1,r_2,\cdots,r_m\}\) 为当前递推式,记递推式修改此时为 \(cnt\) ,第 \(i\) 次修改后的递推式为 \(R_i\) ,则当前递推式为 \(R_{cnt}\) .

初始 \(R_{0}=\{\}\) 为空.

\(d_i = a_i - \sum_{j=1}^{m} a_{i-j}r_j\) .若 \(d_i=0\) 则不需要修改当前递推式.

否则,记 \(fail_{cnt}=i\) 表示出错位置.

\(cnt=0\) ,那么可以令 \(R_1=\{\underbrace{0,0,\cdots,0}_{i \text{ zeros}}\}\) ,因为当前数列长度为 \(i\) ,所以这是合法的.

否则,考虑求出 \(R'=\{r'_1,r'_2,\cdots,r'_{m'}\}\) 使得

\[\forall k \in [m'+1,i-1] \ \ \sum_{j=1}^{m'} a_{k-j}r'_j=0 \\ \sum_{j=1}^{m'}a_{i-j}r_j' = d_i \]

那么我们就可以令 \(R_{cnt+1} = R_{cnt} + R'\) 了.

考虑构造 \(R'\) ,设 \(M= \dfrac {d_i}{d_{fail_{cnt-1}}}\) . 那么令 \(R'=\{\underbrace{0,0,\cdots,0}_{i-fail_{cnt-1}-1 \text{ zeros}},M\} +(-M \cdot R_{cnt-1})\) 其中 \(+\) 表示两个数列拼起来, \(\cdot\) 表示数列中的每个数乘上某个数.

考虑这样是否满足上述条件,有 \(m'=i-fail_{cnt-1}+|R_{cnt-1}|\)

\[\forall k \in [m'+1,i-1]\ \ \ \sum_{j=1}^{m'} a_{k-j} r'_j = Ma_{k-(i-fail_{cnt-1})}-M\sum_{j=1}^{|R_{cnt-1}|} a_{k-(i-fail_{cnt-1})-j}R_{cnt-1,j} = 0 \]

因为 \(k-(i-fail_{cnt-1}) < fail_{cnt-1}\) ,所以上式成立.

\[\sum_{j=1}^{m'} a_{i-j}r'_j = M(a_{fail_{cnt-1}} - \sum_{j=1}^{|R_{cnt-1}|}a_{fail_{cnt-1}-j}R_{cnt-1,j}) = \dfrac {d_i}{d_{fail_{cnt-1}}} \cdot d_{fail_{cnt-1}} = d_i \]

综上,我们构造的 \(R'\) 是合法的.

一次修改的复杂度为 \(O(|R|)\) ,一共要进行 \(O(n)\) 次修改,复杂度为 \(O(n |R|)\) .

posted @ 2020-06-09 16:16  LJZ_C  阅读(172)  评论(0编辑  收藏  举报