简介

Berlekamp-Massey算法,简称BM算法,可以在O(N2)O(N^2)O(N2)时间内求解一个数列的最短线性递推式。

教程

一篇讲的很详细的博客

Berlekamp-Massey算法

我们采用增量法构造数列{an}\{a_n\}{an​}最短线性递推式。

假设现在已经得到了数列a1,a2,...,ai−1a_1,a_2,...,a_{i-1}a1​,a2​,...,ai−1​的最短线性递推式,且在这之前递推式被修改过cntcntcnt次,设第kkk次修改后的递推式为RkR_kRk​。

如果在加入aia_iai​后原来的递推式仍然满足,也就是有∑k=1mrk∗ai−k=ai\sum_{k=1}^mr_k*a_{i-k}=a_ik=1∑m​rk​∗ai−k​=ai​
那么数列a1,a2,...,ana_1,a_2,...,a_na1​,a2​,...,an​的最短线性递推式就是RcntR_{cnt}Rcnt​。

不然的话,表明第cntcntcnt次修改后的递推式在位置iii处出错。定义failkfail_{k}failk​表示第kkk次修改后的递推式在failkfail_{k}failk​处出错,显然有failcnt=ifail_{cnt}=ifailcnt​=i,同时定义deltacnt=ai−∑k=1mrk∗ai−kdelta_{cnt}=a_i-\sum_{k=1}^mr_k*a_{i-k}deltacnt​=ai​−∑k=1m​rk​∗ai−k​

如果cnt=0cnt=0cnt=0,表明aia_iai​是数列中第一个非零元素,不难证明当前最短线性递推数列就是{0,0,...,0}\{0,0,...,0\}{0,0,...,0}也就是iii个000。

不然的话,我们可以考虑构造一个新的递推式R′R'R′,若对于任意m′+1≤j≤i−1m'+1\le j\le i-1m′+1≤j≤i−1有∑k=1m′rk′∗aj−k=0\sum_{k=1}^{m'}r'_{k}*a_{j-k}=0k=1∑m′​rk′​∗aj−k​=0
且满足∑k=1m′rk′∗ai−k=deltacnt\sum_{k=1}^{m'}r'_k*a_{i-k}=delta_{cnt}k=1∑m′​rk′​∗ai−k​=deltacnt​

那么我们只要把RcntR_{cnt}Rcnt​和R′R'R′的对应位分别相加就可以得到一个合法的线性递推式。

考虑通过以下方法构造R′R'R′:

设mul=deltacntdeltacnt−1mul=\frac{delta_{cnt}}{delta_{cnt-1}}mul=deltacnt−1​deltacnt​​,使R′={0,0,...,0,mul,−mul∗Rcnt−1}R'=\{0,0,...,0,mul,-mul*R_{cnt-1}\}R′={0,0,...,0,mul,−mul∗Rcnt−1​},也就是最前面有i−failcnt−1−1i-fail_{cnt-1}-1i−failcnt−1​−1个000,再把数列{1,−Rcnt−1}\{1,-R_{cnt-1}\}{1,−Rcnt−1​}乘上mulmulmul后接到后面。

为什么这样的R′R'R′是合法的呢?

首先∑k=1m′rk′∗ai−k=mul∗deltacnt−1=deltacnt\sum_{k=1}^{m'}r'_k*a_{i-k}=mul*delta_{cnt-1}=delta_{cnt}k=1∑m′​rk′​∗ai−k​=mul∗deltacnt−1​=deltacnt​
其次对于所有m′+1≤j≤i−1m'+1\le j\le i-1m′+1≤j≤i−1,设p=j−i+failcnt−1p=j-i+fail_{cnt-1}p=j−i+failcnt−1​,有∑k=1m′rk′∗aj−k=mul∗(ap−∑k=1mcnt−1rcnt−1,k∗ap−k)\sum_{k=1}^{m'}r'_k*a_{j-k}=mul*(a_p-\sum_{k=1}^{m_{cnt-1}}r_{cnt-1,k}*a_{p-k})k=1∑m′​rk′​∗aj−k​=mul∗(ap​−k=1∑mcnt−1​​rcnt−1,k​∗ap−k​)
又因为Rcnt−1R_{cnt-1}Rcnt−1​对于数列a1,...,afailcnt−1a_1,...,a_{fail_{cnt-1}}a1​,...,afailcnt−1​​是一个合法的递推式,故上式等于000。

所以新的递推式就是R′+RcntR'+R_{cnt}R′+Rcnt​。

后来发现这样求出的递推式并不是最短的。
可以发现∣R′∣=i−failcnt−1+∣Rcnt−1∣|R'|=i-fail_{cnt-1}+|R_{cnt-1}|∣R′∣=i−failcnt−1​+∣Rcnt−1​∣,既然要让新递推式尽量短,那么只要选择∣Rk∣−failk|R_{k}|-fail_{k}∣Rk​∣−failk​尽可能小的kkk来替代前面的cnt−1cnt-1cnt−1就好了。

代码

namespace BM
{int delta[N],fail[N];std::vector<int> r[N],t;std::vector<int> work(int n,int *a){int cnt=0,mx=0;for (int i=1;i<=n;i++){int w=a[i];for (int j=0;j<r[cnt].size();j++) (w+=MOD-(LL)r[cnt][j]*a[i-j-1]%MOD)%=MOD;if (!w) continue;delta[cnt]=w;fail[cnt]=i;if (!cnt) {r[++cnt].clear();r[cnt].resize(i);continue;}int mul=(LL)delta[cnt]*ksm(delta[mx],MOD-2)%MOD;t.clear();t.resize(i-fail[mx]-1);t.pb(mul);for (int j=0;j<r[mx].size();j++) t.pb(MOD-(LL)r[mx][j]*mul%MOD);if (t.size()<r[cnt].size()) t.resize(r[cnt].size());for (int j=0;j<r[cnt].size();j++) (t[j]+=r[cnt][j])%=MOD;if (r[cnt].size()-i<r[mx].size()-fail[mx]) mx=cnt;r[++cnt]=t;}return r[cnt];}
}

Berlekamp-Massey算法学习小记相关推荐

  1. Berlekamp–Massey算法简要介绍

    这是一篇翻译向的文章,笔者整理了一些有关Berlekamp–Massey算法的笔记,还增加了一些自己的理解. 下面列出了笔者写此文时所参考的一些资料: wikipedia fjzzq2002 别人的博 ...

  2. Berlekamp–Massey 算法

    学习博客 学习博客 BM算法用于求解常系数线性递推式. 它可以在 O(n2)O(n^2)O(n2) 的时间复杂度内解决问题. 先打个比赛,一会再更 学习算法看上边的两个学习链接就行,板子可以参考我下边 ...

  3. 最小树形图——朱刘算法学习小记

    参考资料: https://www.cnblogs.com/hdu-zsk/p/8167687.html https://www.luogu.com.cn/blog/xiaojiji/solution ...

  4. 二次剩余Cipolla算法学习小记

    Preface 今天zz大神给我们讲数论和代数,然后后面讲了几个超级神的算法.CipollaCipolla算是其中一个吧.貌似国内直接查名字还没有什么资料,查二次剩余的算法有ACdreamer简略的介 ...

  5. java 二维卡尔曼滤波_卡尔曼滤波(Kalman filtering)算法学习小记

    动画和视频 一个例子 import numpy as np # 模拟数据 t = np.linspace(1, 100, 100) a = 0.5 position = (a * t ** 2) / ...

  6. Berlekamp Massey算法(HDU6172)

    用途:常系数k阶递推式求值 HDU6172 #include <bits/stdc++.h>using namespace std; #define rep(i, a, n) for (l ...

  7. 多项式的ln、exp、快速幂和开根学习小记

    不妨又学习了一下多项式的求ln.exp.快速幂和开根操作. 这些操作比之前的求逆更上了一层台阶,应用同样很广. 多项式求逆等知识在我的博客里有讲:多项式的求逆.取模和多点求值学习小记 多项式ln 给出 ...

  8. 积性函数与Dirichlet卷积 学习小记

    前言 首先感谢 XHM 大佬的悉心指导,我懂得了不少~. 链一下他关于这方面的见解.博客--XHM 的Dirichlet卷积 学习小记 一些定义 回归正题,这次我学习了一下狄利克雷卷积方面的知识. 先 ...

  9. python 温度 符号_【火马】Python学习小记01

    Python 学习小记 Life is short,you need Python! 写在前面 自从重新拾起2016年开始注册的公众号"火马编程",我就把TA当作了自己的一块&qu ...

最新文章

  1. 在Gradle里访问任务(task)的几种方式
  2. 为什么要在密码里加点“盐”
  3. c#winform使用WebBrowser 大全[超长文转载]
  4. Targeted Resumes How to Write a Targeted Resume By Alison Doyle
  5. 表单标签 input
  6. work summary(3)
  7. 如何利用Google谷歌浏览器来查看GET或POST请求以及传递的数据
  8. RK3326 Android 8.1 吉字节问题解决
  9. ASP.NET常用服务器控件
  10. 我学历不高,怎样找前端的工作?
  11. Vue3/ Vue3 组件通讯 -- 子传父 方法流程 总结
  12. 【Chrome 调试技巧】教你一步不用安装插件就可以完成--电脑页面截图
  13. 008-break语句与continue语句的使用,循环嵌套
  14. 26.JavaScript对象和基础类型之间的转换、hint、Symbol.toPrimitive、toString、valueOf
  15. kitti rotation,label等细节相关
  16. JavaEddy的难题
  17. pytorch——AlexNet——训练花分类数据集
  18. C编程 求1+1/2+1/3+……+1/100的和
  19. 【IDEA】在idea中启动单元测试报错:No tests were found
  20. 电脑运行android 吃鸡,什么电脑可玩端游吃鸡

热门文章

  1. 海光信息将于科创板上市:估值900亿,争夺“国产CPU第一股”
  2. 现在备考初级会计还能来得及吗?是不是太迟了?
  3. 工欲善其事,必先利其器(一)
  4. 普耐尔momo7w安装Linux,momo7w安装单系统(安卓)或双系统(安卓+windows)教程第七次修订版.doc...
  5. 六石编程学:比垃圾软件更差更可怕的致命软件、剧毒软件
  6. android开发手机推荐 2015,外媒评选出2015年6大最佳Android智能手机
  7. python如何仿写文章_句子仿写 python
  8. 平面设计中怎么塑造立体感_设计塑造理解和信念的力量
  9. ios 嵌套H5页面 input 光标跑偏的问题
  10. 您最喜欢的“非主流”编程语言是什么?