我在二进制矩阵(1或0)的最小多项式中工作。我知道一些算法来找到矩阵的最小多项式,如Berlekamp Massey。你能否向我推荐一些matlab代码来实现Galios Field 2中的Berlekamp Massey。我尝试使用linbox lib但是它需要很长时间才能完成并且不适用于二进制矩阵。这是我的矩阵
A=[1 0 0 0;
0 1 0 1;
1 1 1 1;
1 1 1 0];
这是我的matlab代码(但我认为它不适合我在GF(2)中的问题)
function f=minPoly_Berlemap(A,b)
A=[1 0 0 0;
0 1 0 1;
1 1 1 1;
1 1 1 0];
b=[1;1;0;0];
[m n]=size(A);
A_u=[];
I=eye(n);
%% Step1
for i=1:(2*n)
A_u(:,i)= mod(A^(i-1)*b,2);
end
%% Step2
k=0;
g=[1];
gk=[1];
d=0;
%% Step3
while (d<n&k<n)
%% Step4
u_k=I(:,k+1);
s=mod(u_k'*A_u,2);
%% Step 5
d = length(g)-1;
mul_gs =mod( conv(g(end:-1:1),s),2); %multiply two polynomial
s_g = mul_gs(d+1:end-d);
%% Step 6
f=Berlekamp_Massey2(s_g);
%% Step 7
gk=mod(conv(f,g),2);
if d<n
k=k+1;
g=gk;
else
break;
end
end
f=g
end
答案 0 :(得分:1)
第1步:您应该计算(A^i)*b
而不是A*(A*(...(A*b)..))
,因为这样会降低复杂性。替换:
%% Step1 - old
for i=1:(2*n)
A_u(:,i)= mod(A^(i-1)*b,2);
end
有了这个:
%% Step1 - new
A_u(:,1) = b;
for i = 2:2*n
A_u(:,i) = mod(A*A_u(:,i-1), 2);
end
没有仔细阅读这个问题,我建议你这么简单:
通过查看:M, M^2, M^3, ...
我们看到了,
M^3 == eye(4) [mod 2].
通过这种方式,您可以知道多项式的次数不大于3。 (您可以将M^4
替换为M
,将M^5
替换为M^2
,依此类推。)
所以你的最小多项式必须是其中之一:
a_0*eye(4) + a_1*M + a_2*M^2 + a_3*M^3
,a_i
中有{0,1}
。
您可以简单地尝试所有2^4-1 = 15
可能性(我们不包括所有a_i为零的那个),您会看到,M^3 - eye(4)
是您的最小多项式。