【学习小记】Berlekamp-Massey算法
程序员文章站
2022-03-05 20:24:58
...
Preface
BM算法是用来求一个数列的最短线性递推式的。
形式化的,BM算法能够对于长度为n的有穷数列或者已知其满足线性递推的无穷数列,找到最短的长度为m的有穷数列,满足对于所有的,有
Text
BM算法的流程十分简洁明了——增量,构造,修正。
方便起见,我们令a的下标从0开始,c的下标从1开始
假设我们当前构造出来的递推系数C是第版(经过cnt次修正)长度为,能够满足前项,记做,初始时为空,m=0
记
若,那么C符合的很好,不用管它
否则,我们需要进行一定的修正,需要变换到。
记表示在处拟合失败。
若,说明这是a的第一个非0元素,直接设,在中填上i+1个0。显然这满足定义式(因为前m项是可以不满足递推式的)。
否则我们考虑如何构造,如果能找到一个,满足对于,都有,且
那么可以构造,显然这一定满足性质。其中加法为按项数对应加。
如何构造呢?我们可以利用之前的C!
找到某一个
我们构造设,构造
其中前面填上了个0,后面相当于是乘上接在了后面。
为什么这是对的?其实很简单,对于,带进去的算出来的东西相当于是
而对于,算出来的是正好是,利用了在1到都满足关系式,而在相差的性质。
此时我们还希望总的长度最短,也就是说最短。
我们只需要动态维护最短的即可,每次算出时都与之前的k比较一下谁更短即可,这样贪心可以感受出来是正确的。
最坏时间复杂度显然是的
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);
}
}
上一篇: 小米手机怎么允许安装未知应用?
下一篇: pandas中提取符合条件的行
推荐阅读
-
Java语言Consistent Hash算法学习笔记(代码示例)
-
Java语言Consistent Hash算法学习笔记(代码示例)
-
机器学习算法(主成分分析原理及应用)
-
给你选择Python语言实现机器学习算法的三大理由
-
人工智能机器学习常用算法总结及各个常用算法精确率对比
-
学习在kernel态下使用NEON对算法进行加速的方法
-
Python机器学习之scikit-learn库中KNN算法的封装与使用方法
-
【莫烦强化学习】视频笔记(二)3.Q_Learning算法实现走迷宫
-
Intel开发出深度学习新算法SLIDE:突破性提升CPU模型训练速度
-
Python机器学习k-近邻算法(K Nearest Neighbor)实例详解