clc,clear
a=[1,0,0,1,1,0,1,1,0,0,0,1,1,1,0,1,0,1,0,0];%原序列
%a=[0,0,1,0,1,1,0,1];
d=0;
f=cell(length(a)+1,1);%存储连接多项式
f(1)={1};
l=0;
for i=1:length(a)
if a(i)==0
d(i+1)=0;
f(i+1)={1};
l(i+1)=0;
else
n=i;
break
end
end
d(n+1)=a(n);
f{n+1}=add(1,mult(n,-d(n+1)));
l(n+1)=n;
n=n+1;
while(1)
t=f{n};
d(n+1)=mod(dot([t(end-l(n):end-1),1],a(n-l(n):n)),2);
if d(n+1)==0
f(n+1)=f(n);
l(n+1)=l(n);
else
i=n-1;
while(1)
if l(i)<l(n)
m=i-1;
break
else
i=i-1;
end
end
f{n+1}=add(f{n},mult(n-1-m,-f{m+1}));
l(n+1)=max(l(n),n-l(n));
end
if n==length(a)
f(n+1)%连接多项式系数,从高到低,末尾是1
l(n+1)%反馈移位寄存器长度
break
end
n=n+1;
end
T=f{n+1};
C=T(1:end-1);%是c_n,....,c_1,
poly2sym(T)%连接多项式
poly2sym(T(end:-1:1))%生成多项式
r=[];
for i=0:length(a)-l(n+1)-1
r(i+1)=mod(dot(a(i+1:i+l(n+1)),C),2);
end
all(a(l(n+1)+1:end)==r)%检验是否生成原序列
f
function Y=mult(m,a)%x^m乘多项式a,是向量,次数从高到低
Y=[a,zeros(1,m)];
end
function Y=add(x,y)%多项式加法,x,y均为向量,次数从高到低,长度不一定相等
n=max(length(x),length(y));
Y=mod([zeros(1,n-length(x)),x]+[zeros(1,n-length(y)),y],2);
end
本文的算法原理参考http://t.csdnimg.cn/sx0eX