【学习小记】Berlekamp-Massey算法
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∑mcjai−j
Text
BM算法的流程十分简洁明了——增量,构造,修正。
方便起见,我们令a的下标从0开始,c的下标从1开始
假设我们当前构造出来的递推系数C是第cntcntcnt版(经过cnt次修正)长度为mmm,能够满足前a0...ai−1a_0...a_{i-1}a0...ai−1项,记做cntC_{cnt}CcntC,初始时cntC_{cnt}CcntC为空,m=0
记di=ai−∑j=1mcjai−jd_i=a_i-\sum\limits_{j=1}^{m}c_ja_{i-j}di=ai−j=1∑mcjai−j
若di=0d_i=0di=0,那么C符合的很好,不用管它
否则,我们需要进行一定的修正,cntC_{cnt}CcntC需要变换到cnt+1C_{cnt+1}Ccnt+1C。
记failcnt=ifail_{cnt}=ifailcnt=i表示cntC_{cnt}CcntC在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∑mck′aj−k=0,且∑k=1mck′ai−k=1\sum\limits_{k=1}^{m}c'_ka_{i-k}=1k=1∑mck′ai−k=1
那么可以构造cnt+1C=cntC+diC′_{cnt+1}C=_{cnt}C+d_iC'cnt+1C=cntC+diC′,显然这一定满足性质。其中加法为按项数对应加。
如何构造呢?我们可以利用之前的C!
找到某一个k∈[0..cnt−1]k\in[0..cnt-1]k∈[0..cnt−1]
我们构造设w=didfailkw={d_i\over d_{fail_k}}w=dfailkdi,构造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∗kC}
其中前面填上了i−failk−1i-fail_k-1i−failk−1个0,后面相当于是kC_kCkC乘上−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_kCkC在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算法相关推荐
- Berlekamp–Massey算法简要介绍
这是一篇翻译向的文章,笔者整理了一些有关Berlekamp–Massey算法的笔记,还增加了一些自己的理解. 下面列出了笔者写此文时所参考的一些资料: wikipedia fjzzq2002 别人的博 ...
- Berlekamp–Massey 算法
学习博客 学习博客 BM算法用于求解常系数线性递推式. 它可以在 O(n2)O(n^2)O(n2) 的时间复杂度内解决问题. 先打个比赛,一会再更 学习算法看上边的两个学习链接就行,板子可以参考我下边 ...
- Berlekamp Massey算法(HDU6172)
用途:常系数k阶递推式求值 HDU6172 #include <bits/stdc++.h>using namespace std; #define rep(i, a, n) for (l ...
- 多项式的ln、exp、快速幂和开根学习小记
不妨又学习了一下多项式的求ln.exp.快速幂和开根操作. 这些操作比之前的求逆更上了一层台阶,应用同样很广. 多项式求逆等知识在我的博客里有讲:多项式的求逆.取模和多点求值学习小记 多项式ln 给出 ...
- 积性函数与Dirichlet卷积 学习小记
前言 首先感谢 XHM 大佬的悉心指导,我懂得了不少~. 链一下他关于这方面的见解.博客--XHM 的Dirichlet卷积 学习小记 一些定义 回归正题,这次我学习了一下狄利克雷卷积方面的知识. 先 ...
- python 温度 符号_【火马】Python学习小记01
Python 学习小记 Life is short,you need Python! 写在前面 自从重新拾起2016年开始注册的公众号"火马编程",我就把TA当作了自己的一块&qu ...
- quest3D学习小记2
quest3D学习小记2 今天主要理解了矩阵变幻关系,以及阴影算法在这里做一个记录. 1.矩阵 主要矩阵要搞清楚的就是自身的坐标系,有世界坐标系,物体坐标系,还有相机坐标系.那么在使用过程中现在主要用 ...
- (2012.01.12-2012.04.01)八十二天的学习小记
(2012.01.12-2012.04.01)八十二天的学习小记 哈哈,原来又是过了八十二个日子了,真快啊~这次发的学习小记日期记录时间有点长,回看1月份的东西,原来已经隔了八十多个日子了,对于这 ...
- oracle数据库学习小记一
oracle数据库学习小记 数据库函数 一.日常函数 二.数学函数 三.聚合函数(常用于group by从句的select查询中) 四.字符串函数 五.日期和时间函数 六.加密函数 七.控制流函数 八 ...
最新文章
- 你真的了解C#中的值和引用吗?(上)
- servlet返回数据_JavaEE の Servlet - Http/Servlet - Day14 - 190507
- Hibernate学习第一天
- [NOTE] sqli-labs Adv Injections
- 次梯度法matlab代码,实例:连续化次梯度法解 LASSO 问题
- 纯python好找工作吗_Python现在好找工作么?
- Java实现网页爬虫
- android shape 使用小结
- Qt warning : 该文件包含不能在当前代码页(936)中表示的字符。请将该文件保存为 Unicode 格式以防止数据丢失
- android google GMS服务包安装
- JSP文件过大 exceeding 65535 bytes limit
- 机电一体化基础知识及实训QY-JDYT01
- 未来感html5模板,未来感的家
- 美团小哥用计算机,美团2020算法工程师编程题--外卖小哥的保温箱
- 使用antV-G6在angualr中画树形关系图
- python发邮件代码要下载qq邮箱吗_python登录QQ邮箱发送QQ邮件代码
- [源码解析] 深度学习流水线并行GPipe (2) ----- 梯度累积
- 设计模式之策略模式(Strategy Pattern)
- TextFormat设置中文字体font属性注意的问题
- 如何进行一篇论文的阅读