Preface

BM算法是用来求一个数列的最短线性递推式的。

形式化的,BM算法能够对于长度为n的有穷数列或者已知其满足线性递推的无穷数列\(a\),找到最短的长度为m的有穷数列\(c\),满足对于所有的\(i\geq n\),有$$a_i=\sum\limits_{j=1}^{m}c_ja_{i-j}$$

Text

BM算法的流程十分简洁明了——增量,构造,修正。

方便起见,我们令a的下标从0开始,c的下标从1开始

假设我们当前构造出来的递推系数C是第\(cnt\)版(经过cnt次修正)长度为\(m\),能够满足前\(a_0...a_{i-1}\)项,记做\(_{cnt}C\),初始时\(_{cnt}C\)为空,m=0

记\(d_i=a_i-\sum\limits_{j=1}^{m}c_ja_{i-j}\)

若\(d_i=0\),那么C符合的很好,不用管它

否则,我们需要进行一定的修正,\(_{cnt}C\)需要变换到\(_{cnt+1}C\)。

记\(fail_{cnt}\)表示\(_{cnt}C\)在\(a_i\)处拟合失败。

若\(cnt=0\),说明这是a的第一个非0元素,直接设\(m=i+1\),在\(C\)中填上i+1个0。显然这满足定义式(因为前m项是可以不满足递推式的)。

否则我们考虑如何构造,如果能找到一个\(C'\),满足对于\(m\leq j\leq i-1\),都有\(\sum\limits_{k=1}^{m}c'_ka_{j-k}=0\),且\(\sum\limits_{k=1}^{m}c'_ka_{i-k}=1\)

那么可以构造\(_{cnt+1}C=_{cnt}C+d_iC'\),显然这一定满足性质。其中加法为按项数对应加。

如何构造呢?我们可以利用之前的C!

找到某一个\(k\in[0..cnt-1]\)

我们构造设\(w={d_i\over d_{fail_k}}\),构造\(wC'=\{0,0,0,0,...,0,w,-w*{_{k}C}\}\)

其中前面填上了\(i-fail_k-1\)个0,后面相当于是\(_kC\)乘上\(-w\)接在了后面。

为什么这是对的?其实很简单,对于\(a_i\),带进去的算出来的东西相当于是$$wa_{fail_k}-w(a_{fail_k}-d_{fail_k})=wd_{fail_k}=d_i$$

而对于\(m\leq j\leq i-1\),算出来的是正好是\(w*a_{j-(i-fail_k)}-w*a_{j-(i-fail_k)}=0\),利用了\(_kC\)在1到\(fail_k-1\)都满足关系式,而在\(fail_k\)相差\(d\)的性质。

此时我们还希望总的长度最短,也就是说\(max(m_{cnt},i-fail_k+m_{k})\)最短。

我们只需要动态维护最短的\(i-fail_k+m_{k}\)即可,每次算出\(_{cnt+1}\)时都与之前的k比较一下谁更短即可,这样贪心可以感受出来是正确的。

最坏时间复杂度显然是\(O(nm)\)的

Code

LL rc[4*N],rp[4*N],le,le1,rw[4*N];
void BM()
{
le=le1=0;
memset(rc,0,sizeof(rc));
memset(rp,0,sizeof(rp));
int lf=0;LL lv=0;
fo(i,0,n1)
{
LL v=0;
fo(j,1,le) inc(v,rc[j]*ap[i-j]%mo);
if(v==ap[i]) continue;
if(le==0)
{
le=i+1;
fo(j,1,le) rc[j]=rp[j]=0;
le1=0,lf=i,lv=(ap[i]-v)%mo;
continue;
}
v=(ap[i]-v+mo)%mo;
LL mul=v*ksm(lv,mo-2)%mo; fo(j,1,le) rw[j]=rc[j]; inc(rc[i-lf],mul);
fo(j,i-lf+1,i-lf+le1) inc(rc[j],(mo-mul*rp[j-(i-lf)]%mo)%mo);
if(le<i-lf+le1)
{
swap(le1,le);
le=i-lf+le,lf=i,lv=v;
fo(j,1,le1) rp[j]=rw[j];
} v=0;
fo(j,1,le) inc(v,rc[j]*ap[i-j]%mo);
}
}

【学习小记】Berlekamp-Massey算法的更多相关文章

  1. Berlekamp Massey算法求线性递推式

    BM算法求求线性递推式   P5487 线性递推+BM算法   待AC.   Poor God Water   // 题目来源:ACM-ICPC 2018 焦作赛区网络预赛 题意   God Wate ...

  2. Gcd&Exgcd算法学习小记

    Preface 对于许多数论问题,都需要涉及到Gcd,求解Gcd,常常使用欧几里得算法,以前也只是背下来,没有真正了解并证明过. 对于许多求解问题,可以列出贝祖方程:ax+by=Gcd(a,b),用E ...

  3. mongodb入门学习小记

    Mongodb 简单入门(个人学习小记) 1.安装并注册成服务:(示例) E:\DevTools\mongodb3.2.6\bin>mongod.exe --bind_ip 127.0.0.1 ...

  4. 从决策树学习谈到贝叶斯分类算法、EM、HMM --别人的,拷来看看

    从决策树学习谈到贝叶斯分类算法.EM.HMM     引言 最近在面试中,除了基础 &  算法 & 项目之外,经常被问到或被要求介绍和描述下自己所知道的几种分类或聚类算法(当然,这完全 ...

  5. javascript学习小记(一)

    大四了,课少了许多,突然之间就不知道学什么啦.整天在宿舍混着日子,很想学习就是感觉没有一点头绪,昨天看了电影激战.这种纠结的情绪让我都有点喘不上气啦!一点要找点事情干了,所以决定找个东西开始学习.那就 ...

  6. 深度学习word2vec笔记之算法篇

    深度学习word2vec笔记之算法篇 声明:  本文转自推酷中的一篇博文http://www.tuicool.com/articles/fmuyamf,若有错误望海涵 前言 在看word2vec的资料 ...

  7. 从决策树学习谈到贝叶斯分类算法、EM、HMM

    从决策树学习谈到贝叶斯分类算法.EM.HMM                (Machine Learning & Recommend Search交流新群:172114338) 引言 log ...

  8. js 正则学习小记之匹配字符串

    原文:js 正则学习小记之匹配字符串 今天看了第5章几个例子,有点收获,记录下来当作回顾也当作分享. 关于匹配字符串问题,有很多种类型,今天讨论 js 代码里的字符串匹配.(因为我想学完之后写个语法高 ...

  9. js 正则学习小记之左最长规则

    原文:js 正则学习小记之左最长规则 昨天我在判断正则引擎用到的方法是用 /nfa|nfa not/ 去匹配 "nfa not",得到的结果是 'nfa'.其实我们的本意是想得到整 ...

随机推荐

  1. Java第六周实验+总结

    一.实验目的 (1)掌握类的继承 1.子类继承父类中非private的成员变量和成员方法,同时,注意构造方法不能被子类继承. 2.定义类时若缺省extends关键字,则所定义的类为java.lang. ...

  2. C++中多态的概念和意义

    1,函数重写回顾: 1,父类中被重写的函数依然会继承给子类: 2,子类中重写的函数将覆盖父类中的函数: 1,重写父类当中提供的函数是因为父类当中提供的这个函数版本不能满足我们的需求,因此我们要重写: ...

  3. 解决移动端浏览器 HTML 音频不能自动播放的三种方法

    https://blog.csdn.net/PY0312/article/details/90349386 由于Android,IOS移动端的浏览器以及微信自带的浏览器为了用户更好的体验,规定不自动播 ...

  4. poj2186--tarjan+缩点(有向图的强连通分量中点的个数)

    题目大意:       每一头牛的愿望就是变成一头最受欢迎的牛.现在有N头牛,给你M对整数(A,B),表示牛A认为牛B受欢迎. 这 种关系是具有传递性的,如果A认为B受欢迎,B认为C受欢迎,那么牛A也 ...

  5. 主成分分析法详解(PCA)

    引用:https://blog.csdn.net/program_developer/article/details/80632779 将n维特征映射到k维上,只保留包含绝大部分方差的维度特征,而忽略 ...

  6. 出大问题!webpack 多入口&&html模板在后端

    新公司前后端不分离,后端用的是php的twig 我用webpack做多入口文件的打包,虽然成功了.但是引入js和css是在twig上写死的根据文件名. 一开始没问题,因为就定死了那么几个global. ...

  7. 【三】Django模版的使用

    作为Web框架,Django提供了模板,可以很便利的动态生成HTML 模版系统致力于表达外观,而不是程序逻辑 模板的设计实现了业务逻辑(view)与显示内容(template)的分离,一个视图可以使用 ...

  8. [转载]Ubuntu下apache的安装与配置

    原文地址:https://blog.csdn.net/gatieme/article/details/53025505 1 安装apache 在 Ubuntu 上安装 Apache,有两种方式 使用源 ...

  9. jQuery中outerWidth()方法

    截图自:菜鸟教程https://www.runoob.com/jquery/html-outerwidth.html

  10. vue history模式 ios微信分享坑

    vue history模式 ios微信分享坑 问题分析:因为苹果分享会是调取签名失败是因为:苹果在微信中浏览器机制和安卓不同,有IOS缓存问题,和IOS对单页面的优化问题,通俗点说安卓进行页面跳转分享 ...