Preface

BM算法是用来求一个数列的最短线性递推式的。
形式化的,BM算法能够对于长度为n的有穷数列或者已知其满足线性递推的无穷数列aaa,找到最短的长度为m的有穷数列ccc,满足对于所有的i≥ni\geq ni≥n,有ai=∑j=1mcjai−ja_i=\sum\limits_{j=1}^{m}c_ja_{i-j}ai​=j=1∑m​cj​ai−j​

Text

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

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

假设我们当前构造出来的递推系数C是第cntcntcnt版(经过cnt次修正)长度为mmm,能够满足前a0...ai−1a_0...a_{i-1}a0​...ai−1​项,记做cntC_{cnt}Ccnt​C,初始时cntC_{cnt}Ccnt​C为空,m=0
记di=ai−∑j=1mcjai−jd_i=a_i-\sum\limits_{j=1}^{m}c_ja_{i-j}di​=ai​−j=1∑m​cj​ai−j​

若di=0d_i=0di​=0,那么C符合的很好,不用管它

否则,我们需要进行一定的修正,cntC_{cnt}Ccnt​C需要变换到cnt+1C_{cnt+1}Ccnt+1​C。

记failcnt=ifail_{cnt}=ifailcnt​=i表示cntC_{cnt}Ccnt​C在aia_iai​处拟合失败。

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

否则我们考虑如何构造,如果能找到一个C′C'C′,满足对于m≤j≤i−1m\leq j\leq i-1m≤j≤i−1,都有∑k=1mck′aj−k=0\sum\limits_{k=1}^{m}c'_ka_{j-k}=0k=1∑m​ck′​aj−k​=0,且∑k=1mck′ai−k=1\sum\limits_{k=1}^{m}c'_ka_{i-k}=1k=1∑m​ck′​ai−k​=1

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

如何构造呢?我们可以利用之前的C!
找到某一个k∈[0..cnt−1]k\in[0..cnt-1]k∈[0..cnt−1]
我们构造设w=didfailkw={d_i\over d_{fail_k}}w=dfailk​​di​​,构造wC′={0,0,0,0,...,0,w,−w∗kC}wC'=\{0,0,0,0,...,0,w,-w*{_{k}C}\}wC′={0,0,0,0,...,0,w,−w∗k​C}

其中前面填上了i−failk−1i-fail_k-1i−failk​−1个0,后面相当于是kC_kCk​C乘上−w-w−w接在了后面。

为什么这是对的?其实很简单,对于aia_iai​,带进去的算出来的东西相当于是w∗afailk−w(afailk−dfailk)=w∗dfailk=diw*a_{fail_k}-w(a_{fail_k}-d_{fail_k})=w*d_{fail_k}=d_iw∗afailk​​−w(afailk​​−dfailk​​)=w∗dfailk​​=di​
而对于m≤j≤i−1m\leq j\leq i-1m≤j≤i−1,算出来的是正好是w∗aj−(i−failk)−w∗aj−(i−failk)=0w*a_{j-(i-fail_k)}-w*a_{j-(i-fail_k)}=0w∗aj−(i−failk​)​−w∗aj−(i−failk​)​=0,利用了kC_kCk​C在1到failk−1fail_k-1failk​−1都满足关系式,而在failkfail_kfailk​相差ddd的性质。

此时我们还希望总的长度最短,也就是说max(mcnt,i−failk+mk)max(m_{cnt},i-fail_k+m_{k})max(mcnt​,i−failk​+mk​)最短。
我们只需要动态维护最短的i−failk+mki-fail_k+m_{k}i−failk​+mk​即可,每次算出cnt+1_{cnt+1}cnt+1​时都与之前的k比较一下谁更短即可,这样贪心可以感受出来是正确的。

最坏时间复杂度显然是O(nm)O(nm)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));//rc为当前构造出的递推系数列,le为当前系数列的长度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) //如果是第一次出现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;//计算d_iLL mul=v*ksm(lv,mo-2)%mo;//计算wfo(j,1,le) rw[j]=rc[j];inc(rc[i-lf],mul);//lf为上次存的最短的C'的失配位置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];}}
}

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

  1. Berlekamp–Massey算法简要介绍

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

  2. Berlekamp–Massey 算法

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

  3. Berlekamp Massey算法(HDU6172)

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

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

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

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

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

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

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

  7. quest3D学习小记2

    quest3D学习小记2 今天主要理解了矩阵变幻关系,以及阴影算法在这里做一个记录. 1.矩阵 主要矩阵要搞清楚的就是自身的坐标系,有世界坐标系,物体坐标系,还有相机坐标系.那么在使用过程中现在主要用 ...

  8. (2012.01.12-2012.04.01)八十二天的学习小记

    (2012.01.12-2012.04.01)八十二天的学习小记   哈哈,原来又是过了八十二个日子了,真快啊~这次发的学习小记日期记录时间有点长,回看1月份的东西,原来已经隔了八十多个日子了,对于这 ...

  9. oracle数据库学习小记一

    oracle数据库学习小记 数据库函数 一.日常函数 二.数学函数 三.聚合函数(常用于group by从句的select查询中) 四.字符串函数 五.日期和时间函数 六.加密函数 七.控制流函数 八 ...

最新文章

  1. 你真的了解C#中的值和引用吗?(上)
  2. servlet返回数据_JavaEE の Servlet - Http/Servlet - Day14 - 190507
  3. Hibernate学习第一天
  4. [NOTE] sqli-labs Adv Injections
  5. 次梯度法matlab代码,实例:连续化次梯度法解 LASSO 问题
  6. 纯python好找工作吗_Python现在好找工作么?
  7. Java实现网页爬虫
  8. android shape 使用小结
  9. Qt warning : 该文件包含不能在当前代码页(936)中表示的字符。请将该文件保存为 Unicode 格式以防止数据丢失
  10. android google GMS服务包安装
  11. JSP文件过大 exceeding 65535 bytes limit
  12. 机电一体化基础知识及实训QY-JDYT01
  13. 未来感html5模板,未来感的家
  14. 美团小哥用计算机,美团2020算法工程师编程题--外卖小哥的保温箱
  15. 使用antV-G6在angualr中画树形关系图
  16. python发邮件代码要下载qq邮箱吗_python登录QQ邮箱发送QQ邮件代码
  17. [源码解析] 深度学习流水线并行GPipe (2) ----- 梯度累积
  18. 设计模式之策略模式(Strategy Pattern)
  19. TextFormat设置中文字体font属性注意的问题
  20. 如何进行一篇论文的阅读

热门文章

  1. 设计模式-原型模式 clone
  2. 做集成墙板,只有选对厂家,才能选对品牌
  3. 微信sdk 公众号 微信支付 NFC 坑笔记
  4. JXCZT网络管理系统建设方案
  5. EasyRecovery16免费的电脑的数据恢复工具
  6. MySQL忘了账号密码,除了跑路,还能补救么?
  7. css如何设置透明度?两种方法
  8. linux6.5卸载火狐,CentOS 6.5 X86 如何卸载360,并重装。
  9. 向任意平面的投影矩阵的推导
  10. OPENCV-HDR图片读取,显示及转JPG