Berlekamp-Massey算法学习笔记
Berlekamp-Massey算法
很久之前就听说过这个算法,当时六校联考的时候Day1T1是一道很有意思的递推,神仙zzx不会做于是就拿BM算法艹出了递推式Orzzzzzzzzzzx
我就不详细说了,只记一下自己感觉比较难理解的地方
设\(r(m)\)表示序列的递推式且长度为\(m\)
\(f(r, i)\)表示\(\sum_{j = 1}^m r_j * a[i - j]\)
\(\delta(r, i)\)表示\(a[i] - f(r, i)\)
\(fail_i\)表示第\(i\)个递推式出错的位置
对于某一个位置\(i\),如果我们求出的\(\delta(r, i) \not = 0\),这时候我们需要构造一个递推式\(r'(m')\),满足\(\forall j \in [m' + 1, i - 1] f(r', j) = 0\)且\(f(r, i) = \delta(r, i)\)
这样我们令\(r = r + r'\)就得到新位置的递推式了
\(r'\)可以这么构造
设\(mul = \frac{\delta(r, i)}{\delta(r, fail_{cnt - 1})}\)
那么\(r' = \{0, 0, 0 \dots, 0, mul, -mul * R_{cnt - 1} \}\)
\(0\)的个数为\(i - fail_{cnt - 1} - 1\)
至于为什么这么构造是对的,我思考了挺长时间,简单的证明一下
首先对于\(\forall j \in [m' + 1, i - 1]\), \(\delta(r', j) = 0\)
仔细想了想,,发现自己并不会证。。如果哪位大佬会的话可以教教本蒟蒻
感性理解就是因为\(r\)在\([1, M]\)处满足任意位置为\(0\),然后右移一下还满足?。。
至于为什么\(f(r', i) = \delta(r, i)\)
可以这么考虑,前\(i - fail_{cnt - 1} - 1\)个位置产生的贡献为\(0\)
\(mul\)产生的贡献为\(mul * a_{fail_{cnt - 1}}\)
\(-mul * R_{cnt - 1}\)产生的贡献为\(-mul * (a[fail_{cnt - 1}] - \delta(r, fail_{cnt - 1]})\)
合并同类项后可以得到\(mul * \delta(r, fail_{cnt - 1}) = \delta(r, i)\)
代码如下
#include<bits/stdc++.h>
using namespace std;
const int MAXN = 2005;
const double eps = 1e-8;
int cnt, fail[MAXN];
double val[MAXN], delta[MAXN];
vector <double> ans[MAXN];
int main() {
int N; scanf("%d", &N);
for (int i = 1; i <= N; i++) scanf("%lf", &val[i]);
for (int i = 1; i <= N; i++) {
double tmp = val[i];
for (int j = 0; j < ans[cnt].size(); j++)
tmp -= ans[cnt][j] * val[i - j - 1];
delta[i] = tmp;
if (fabs(tmp) <= eps) continue;
fail[cnt] = i;
if (cnt == 0) {
ans[++cnt].resize(i);
continue;
}
double mul = delta[i] / delta[fail[cnt - 1]];
cnt++; ans[cnt].resize(i - fail[cnt - 2] - 1);
ans[cnt].push_back(mul);
for (int j = 0; j < ans[cnt - 2].size(); j++)
ans[cnt].push_back(ans[cnt - 2][j] * -mul);
if (ans[cnt].size() < ans[cnt - 1].size()) ans[cnt].resize(ans[cnt - 1].size());
for (int j = 0; j < ans[cnt - 1].size(); j++)
ans[cnt][j] += ans[cnt - 1][j];
}
for (int i = 0; i < ans[cnt].size(); i++)
cout << ans[cnt][i] << ' ';
return 0;
}
Berlekamp-Massey算法学习笔记的更多相关文章
- C / C++算法学习笔记(8)-SHELL排序
原始地址:C / C++算法学习笔记(8)-SHELL排序 基本思想 先取一个小于n的整数d1作为第一个增量(gap),把文件的全部记录分成d1个组.所有距离为dl的倍数的记录放在同一个组中.先在各组 ...
- Manacher算法学习笔记 | LeetCode#5
Manacher算法学习笔记 DECLARATION 引用来源:https://www.cnblogs.com/grandyang/p/4475985.html CONTENT 用途:寻找一个字符串的 ...
- Johnson算法学习笔记
\(Johnson\)算法学习笔记. 在最短路的学习中,我们曾学习了三种最短路的算法,\(Bellman-Ford\)算法及其队列优化\(SPFA\)算法,\(Dijkstra\)算法.这些算法可以快 ...
- 某科学的PID算法学习笔记
最近,在某社团的要求下,自学了PID算法.学完后,深切地感受到PID算法之强大.PID算法应用广泛,比如加热器.平衡车.无人机等等,是自动控制理论中比较容易理解但十分重要的算法. 下面是博主学习过程中 ...
- Johnson 全源最短路径算法学习笔记
Johnson 全源最短路径算法学习笔记 如果你希望得到带互动的极简文字体验,请点这里 我们来学习johnson Johnson 算法是一种在边加权有向图中找到所有顶点对之间最短路径的方法.它允许一些 ...
- 算法学习笔记——sort 和 qsort 提供的快速排序
这里存放的是笔者在学习算法和数据结构时相关的学习笔记,记录了笔者通过网络和书籍资料中学习到的知识点和技巧,在供自己学习和反思的同时为有需要的人提供一定的思路和帮助. 从排序开始 基本的排序算法包括冒泡 ...
- R语言实现关联规则与推荐算法(学习笔记)
R语言实现关联规则 笔者前言:以前在网上遇到很多很好的关联规则的案例,最近看到一个更好的,于是便学习一下,写个学习笔记. 1 1 0 0 2 1 1 0 0 3 1 1 0 1 4 0 0 0 0 5 ...
- 二次剩余Cipolla算法学习笔记
对于同余式 \[x^2 \equiv n \pmod p\] 若对于给定的\(n, P\),存在\(x\)满足上面的式子,则乘\(n\)在模\(p\)意义下是二次剩余,否则为非二次剩余 我们需要计算的 ...
- SPFA算法学习笔记
一.理论准备 为了学习网络流,先水一道spfa. SPFA算法是1994年西南交通大学段凡丁提出,只要最短路径存在,SPFA算法必定能求出最小值,SPFA对Bellman-Ford算法优化的关键之处在 ...
- 算法学习笔记(三) 最短路 Dijkstra 和 Floyd 算法
图论中一个经典问题就是求最短路.最为基础和最为经典的算法莫过于 Dijkstra 和 Floyd 算法,一个是贪心算法,一个是动态规划.这也是算法中的两大经典代表.用一个简单图在纸上一步一步演算,也是 ...
随机推荐
- 利用ADO打开Access数据(64位系统)
64位的access一定要用64的程序才能正确打开,仍然用"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=Test.accdb;Persist ...
- 手机端3d旋转木马效果+保存图片到本地
<!DOCTYPE html> <html> <head> <title></title> <meta charset="U ...
- ng 的 ng-repeat(对象) 把对象的 key 和value 都拿出来 循环
对象的repeat 是这种形式
- WebView 错误码整理
在使用WebView中,我们不可避免的会接触到WebView加载失败的异常处理的需求,这时候,需要我们监听失败的方法也就是onReceivedError方法: public class CustomW ...
- css 设计规范
外部 div 设置 margin 和 padding: 内部每个元素只设计跟自己相关的属性,这样方便复用:
- 解决tomcat启动慢问题
启动慢修改如下: 在catalina.sh中加入这么一行: JAVA_OPTS="-Djava.security.egd=file:/dev/./urandom" 打开$JAVA_ ...
- C# 线程中使用delegate对控件进行操作
如果在线程中想改变控件的值是不可以的,会报出以下错误. 那么,如何在线程中改变控件上的值呢?第一个想到的就是委托. 委托定义:委托是一个类,它定义了方法的类型,使得可以将方法当作另一个方法的参数来进行 ...
- Xamarin.Android 使用线程无法更改页面文本问题
前言: 刚接触Xamarin.Android不到一个月时间,却被他折磨的不要不要的,随着开发会出现莫名其妙的问题,网上类似Xamarin.Android的文档也不多,于是本片文章是按照Java开发An ...
- 高德地图添加marker及反地理编码获取POI
项目中集成百度.高德.腾讯地图已是司空见惯的事情,今天我总结了一下项目中用到的高德地图常用的功能: 1.展示高德地图并定位显示定位图标: 2.添加实时大头针: 3.反地理编码获取周围兴趣点 效果如下: ...
- Android_如何将.9的图片转换成bitmap
//这里也可以是从sd卡上面加载.9图片 Bitmap bitmap = BitmapFactory.decodeResource(getResources(),R.drawable.ic_launc ...