C:BM(Berlekamp-Massey)算法

伯利坎普-梅西算法(Berlekamp-Massey)

百度百科:Berlekamp-Massey算法可以找到给定二进制输出序列的最短线性反馈移位寄存器(LFSR)。 该算法还将在任意场中找到线性递归序列的最小多项式。

算法原理

(跟网上流传的原理方法有些不同)
在这里插入图片描述

算法流程

在这里插入图片描述

我的思路

我认为这种算法的主要难度在于给定或已算出的f i (x)对a(i+1)的计算,参考思路如下:
在这里插入图片描述
当然这也是最直接暴力的思路,仅供参考

程序代码

数组长度均为可调

输入

不超过数组长度的二进制序列,如0111010101(乱打的

输出

最短LFSR的特征多项式 f(x),次数由高到低排列

#include<stdio.h>
int cb(int f,int a[],int n)//f以二进制表示系数 
{
	if(f==1) return 0;
	int c[30],i,k,b=0;
	i=0;
	while(f!=0)//f对应的系数序列c[] 
	{
		c[i]=f%2;
		f=f/2;
		i++;
		c[i]=-1;
	}
	k=i-2;//c1.place
	while(k>=0)//计算a~ 
	{
		b=b+c[k]*a[n-1];
		n--;
		k--;
	}
	return b%2;
}
int cpl(int l[],int n)//compare l[]
{
	int i;
	for(i=n;i>=0;i--)
	{
		if(i==0) return n;//all equal
		if(l[i]>l[i-1]) return i-1;//return m
	}
}
int pow(int m,int n)
{
	int s=1;
	while(n!=0)
	{
		if(n&1) s*=m;
		m*=m;
		n>>=1;
	}
	return s;
}
int cfn(int fm,int fn)//计算f[n+1] 
{
	int cm[30],cn[30],i,s;
	for(i=0;i<30;i++)
	{
		cm[i]=0;
		cn[i]=0;
	}
	i=0;
	while(fm!=0)
	{
		cm[i]=fm%2;
		fm=fm/2;
		i++;
	}
	i=0;
	while(fn!=0)
	{
		cn[i]=fn%2;
		fn=fn/2;
		i++;
	}
	for(i=0;i<30;i++) cn[i]=(cm[i]+cn[i])%2;//序列对应系数相加后模2 
	s=0;
	for(i=0;i<30;i++) if(cn[i]==1) s+=pow(2,i);
	return s;
}
int max(int a,int b)
{
	if(a>b) return a;
	return b;
}
int main()
{
	char a_str[30];
	int a[30],f[30],l[30],b[30],i=0,len,n,m,d;//max length = 30
	f[0]=1;l[0]=0;
	printf("二进制序列:");
	scanf("%s",a_str);
	while(a_str[i]!='\0') 
	{
		a[i]=a_str[i]-'0';
		i++;
	}
	len=i;
	for(n=0;n<len;n++)
	{
		if(a[n]==cb(f[n],a,n))//f[n]能生成a的前n+1位 
		{
			f[n+1]=f[n];
			l[n+1]=l[n];
		}
		else//不能生成 
		{
			if(cpl(l,n)==n)//l0=l1=...=ln 
			{
				f[n+1]=pow(2,n+1)+1;
				l[n+1]=n+1;
			}
			else
			{
				m=cpl(l,n);//lm<lm+1=...=ln
				d=(m-l[m])-(n-l[n]);
				if(d>=0) f[n+1]=cfn(f[n],(f[m]<<d));//m-lm ≥n-ln 
				else
				{
					d=-1*d;//n-ln>m-lm
					f[n+1]=cfn((f[n]<<d),f[m]);
				}
				l[n+1]=max(l[n],n+1-l[n]);
			}
		}
	}
	int s=f[n],c[30],k,q;
	i=0;
	while(s!=0)
	{
		c[i]=s%2;
		s=s/2;
		i++;
		c[i]=-1;
	}
	k=i-1;
	for(i=0;i<=k;i++) if(c[i]==1) break;
	q=i;
	printf("最短LFSR的特征多项式 f = ");
	for(i=k;i>=q;i--)
	{
		if(c[i]==1&&i!=q)
		{
			if(i!=1) printf("x^%d + ",i);
			else printf("x + ");
		}
		else if(i==q)
		{
			if(q!=0)
			{
				if(i!=1) printf("x^%d",i);
				else printf("x");
			}
			else printf("1");
		}
	}
	return 0;
}

原理和流程都是比较简单的,就是C语言写的有点多(或者大概率是我菜
用python的话就不用考虑数组长度和整型数大小(C也有一个Miracl库可以实现大数
python实现请移步隔(不记得哪的)壁

函数说明
cb():计算a’,即通过已知的多项式f(x)求出相应的a以用于与输入的二进制序列比较
cpl():比较l[ ]中的每一个数值,在不能生成前n+1位时使用,返回值为次小值的最大下标,若无次小值,返回当前可生成的位数n
pow():快速指数运算
cfn():在不能生成前n+1位时用于计算f[n+1]

  • 1
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Berlekamp-Massey算法是一种线性复杂度算法,用于在一个序列中求出最短的线性递推序列。它可以用来检测线性级别的纠错码,并在检测到错误时纠正这些错误。该算法于1967年由Elwyn Berlekamp和James Massey首先提出。 ### 回答2: Berlekamp-Massey算法是线性递推序列的一个求解算法,主要用于加密算法、编码和错误校验码等。 对于一个由$a_0, a_1, a_2, ..., a_n$组成的序列,如果它是一个线性递推序列,则存在$f(x)=f_0+f_1x+f_2x^2+...+f_nx^n$和$g(x)=g_0+g_1x+g_2x^2+...+g_nx^n$满足以下条件: 1. $f(x)a_n+f_1(x)a_{n-1}+f_2(x)a_{n-2}+...+f_n(x)a_0=0$ 2. $f(x)g(x)=1+0x+0x^2+...+0x^{2n}$ 其中$f(x)$和$g(x)$都是多项式,系数都属于$GF(2)$域,即所有系数都为$0$或$1$。 Berlekamp-Massey算法的核心思想是通过不断更新推导出$f(x)$多项式,从而确定序列是否为线性递推序列。具体操作如下: 1. 初始化$f(x)=a_0$和$g(x)=1$ 2. 设$i=0$,继续下面的步骤。 3. 如果$f(x)$使得$f(x)a_i+f_1(x)a_{i-1}+f_2(x)a_{i-2}+...+f_i(x)a_{i-i}=0$,则跳过下一步。 4. 否则更新$f(x)$和$g(x)$为:$f(x)=f(x)-f_i(x)x^{i-ld}$,$g(x)=g(x)+f_i(x)x^{i-ld}$,其中$ld$是最低位的非零项指数。 5. 如果$i$等于序列长度$n$,则停止,否则将$i$增加1,返回步骤3。 当算法执行结束后,如果$deg(f(x))<n$,则序列是线性递推序列。否则,序列不是线性递推序列。 Berlekamp-Massey算法具有高效的时间复杂度和空间复杂度,并且能够在有限时间内判断序列是否为线性递推序列。由于其可靠性和适用性,该算法在加密、编码、校验等方面得到广泛应用。 ### 回答3: Berlekamp-Massey算法是一种线性复杂度扫描算法,用于寻找给定有限域上的线性递推序列的最短线性递推关系。在密码学、纠错码、伪随机序列等应用中有着广泛的应用。 该算法的基本思想是利用一个长度为m的寄存器序列和一个长度为m的系数序列,去逐步生成原序列,通过比较原序列和生成序列之间的差异,逐步解决递推关系。当序列长度超过m时,就可以使用修改寄存器序列和系数序列来更新序列。在任意时刻,算法都会保持当前序列前r个元素的线性关系,直到找到整个递推式。因此,它可以通过线性时间求解整个递推式。 Berlekamp-Massey算法对于极大伪随机序列具有特别的重要性,因为它可以判断一个序列是否为线性复杂度生成,并且可以通过线性时间求出其线性递推关系。具体来说,一个序列为线性复杂度生成当且仅当它的线性递推关系的位数达到了序列的长度。在密码学中,这意味着一个暴力破解程序所需要的运算次数会达到指数级。因此,一些密码学应用需要使用Berlekamp-Massey算法对生成的伪随机序列进行测试,以保证其没有线性递推关系,从而更好地保证密码的安全性。 总的来说,Berlekamp-Massey算法是一种重要的算法,在密码学和其他应用中都有广泛的应用和重要性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值