如何找到二进制矩阵的最小多项式

时间:2014-12-29 15:04:52

标签: matlab matrix linear-algebra polynomials

我在二进制矩阵(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

1 个答案:

答案 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^3a_i中有{0,1}

您可以简单地尝试所有2^4-1 = 15可能性(我们不包括所有a_i为零的那个),您会看到,M^3 - eye(4)是您的最小多项式。