B-M算法求已知序列极小多项式
算法代码(c++)
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<math.h>
#include<iostream>
using namespace std;
int B_M(int a[],int nn);
int cc[20000]={0},dd[20000]={0},ss[20000]={0},l[20000]={0},ee[20000]={0},b[20000];
int main()
{
int nn=0,v=0;
char line[20000];
cout<<"请输入序列a:";//直接输入01比特串,不用打空格
cin>>line;
nn=strlen(line);
for(v=0;v<nn;v++)
{
b[v]=line[v]-48;
}
B_M(b,nn);
system("pause");
return 0;
}
int B_M(int a[],int nn)
{
int i=0,j=0,k=0,e=0,t=0;
int m=0,d1=0;
for(i=0;i<nn;i++)//初始化
if(a[i]==1)//判断第i位是0还是1,1进入语句,0则跳过//
{
e=i;//记录第一个1的位置
l[i]=e+1;//记录有1的地方,记为i+1,作为线性复杂度
cc[0]=1;
for(j=1;j<=e;j++)
{
cc[j]=0;
}
cc[e+1]=1;
break;//遇到第一个1便终止//
}
else
{
cc[i]=0;
l[i]=0;
}
dd[0]=1;
for(i=1;i<2000;i++)
{
dd[i]=0;
}
for(i=e+1;i<nn;i++)
{
d1=a[i];
for(j=0;j<l[i-1];j++)
{d1=d1^(cc[j]&(a[j+i-l[i-1]]));}
if(d1==0)//判断是否零化下一个比特
{
l[i]=l[i-1];
}
else//不能零化
{
j=i-1;
do
{
j=j-1;
}
while(l[j]==l[j+1]);
m=j+1;
k=abs(m-l[m-1]-(i-l[i-1]));//计算线性复杂度跳跃点和k值
if((m-l[m-1])>=(i-l[i-1]))
{
for(j=0;j<k;j++)
{
ee[j]=cc[j];
}
for(j=k;j<=l[i-1];j++)
{
ee[j]=(cc[j])^(dd[j-k]);
}
for(j=0;j<=1999;j++)
{
cc[j]=ee[j];
}
l[i]=l[i-1];
}
else
{
for(j=0;j<2000;j++)
{
ss[j]=cc[j];
}
for(j=0;j<k;j++)
{
ee[j]=dd[j];
}
for(j=k;j<=(k+l[i-1]);j++)
{
ee[j]=(dd[j])^(cc[j-k]);
}
for(j=0;j<=1999;j++)
{
cc[j]=ee[j];
}
l[i]=k+l[i-1];
for(j=0;j<2000;j++)//记录跳跃前的多项式系数
{
dd[j]=ss[j];
}
}
}
}
for(i=0;i<=nn;i++)
{
if(cc[i]==1)
{
t=i;
break;
}
}
cout<<"序列a("<<nn<<")=(";
for(i=0;i<nn;i++)
cout<<a[i];
cout<<")的极小多项式为:"<<endl;
if(t==0)
{
cout<<"f(x)=";
for(i=l[nn-1];i>0;i--)
{
if(cc[i]==1)
{cout<<"x^"<<i<<"+";}
else
continue;
}
cout<<"1";
}
else
{
cout<<"f(x)=";
for(j=l[nn-1];j>t;j--)
{
if(cc[j]==1)
cout<<"x^"<<j<<"+";
else
continue;
}
cout<<"x^"<<t;
}
cout<<endl;
cout<<"dn="<<d1<<endl;
cout<<"m="<<m<<endl;
cout<<"k="<<k<<endl;
cout<<"线性复杂度为:"<<endl;
cout<<"l="<<l[nn-1]<<endl;
cout<<"极小多项式系数为";
for(i=l[nn-1];i>=0;i--)
cout<<cc[i];
cout<<endl;
}