Как вычислить левое нулевое пространство для матрицы над GF (2) в MATLAB?

Допустим, у меня есть матрица над GF(2) , то есть бинарная матрица. Теперь, как мне вычислить левое нулевое пространство данной матрицы над конечным полем 2?

Предоставляет ли MATLAB встроенную функцию для этого?


person Rahul Sankar    schedule 15.04.2018    source источник
comment
Это может помочь: in.mathworks.com/help/matlab/ref/null. html   -  person ammportal    schedule 16.04.2018


Ответы (1)


Я не знаю пакетов Matlab для линейной алгебры в конечном пространстве, но я запрограммировал простую функцию, которая вычисляет LU-факторизации матриц по простому модулю p (например, 2):

function [L,D,U,rows,cols] = ModLU(A,p)
%
% LU-factorization of A, modulo p:
%     A(rows,cols) - mod(L * diag(D)*U,p)
%
[m,n] = size(A);

% inverses in mod-p:
%     mod(k*invp(k+1)) = 0 if k==0; 1 otherwise
invp = 2:p-2;
for i = 2:p-2; invp = mod(invp.*[2:p-2],p); end
invp = [0,1,invp,p-1];

% Initialize outputs:
L = eye(m); U = A;
rows = 1:m;
cols = 1:n;

% Sweep
for i = 1:m
   % Pivoting
   [row,col] = find(U(i:end,:));
   if isempty(row); break; end
   row = row(1)+i-1; col = col(1);

   r = 1:m; r(i) = row; r(row) = i;
   c = 1:n; c(i) = col; c(col) = i;
   ri = rows(i); rows(i) = rows(row); rows(row)=ri;
   ci = cols(i); cols(i) = cols(col); cols(col)=ci;

   rinv = 1:m; rinv(r) = 1:m;
   U = U(r,c); L=L(r,r);

   % Gaussian elimination
   L(i+1:end,i    ) = mod(invp(U(i,i)+1) * U(i+1:end,i),p);
   U(i+1:end,i:end) = mod(U(i+1:end,i:end) + (p-L(i+1:end,i)) * U(i,i:end),p);
end

% Factorize diagonal
D = zeros(m,1); D(1:min(m,n)) = diag(U);
U = mod(diag(invp(D+1)) * U,p );

Кроме того, для верхней треугольной матрицы с единицами на диагонали функция, которая вычисляет правое нулевое пространство по модулю p:

function N = NullPU(U,p)
% for an upper triangular matrix, calculate a base for the null space modulo p:
%   U * N = 0

n = size(U,2);
rank = size(find(diag(U)),1);
A = U(1:rank,:);
for i=rank:-1:2
    A(1:i-1,:) = mod(A(1:i-1,:) + (p-1) * A(1:i-1,i) * A(i,:),p);
end
N = [mod(p-A(:,rank+1:end),p); eye(n-rank)];

Эти функции просто объединяются в функцию, которая вычисляет нулевое пространство матрицы A по модулю p:

function N = NullP(A,p)
% Calculate a basis for the null space of A, modulo p:
%    mod(A*N,p) = 0
[L,D,U,rows,cols] = ModLU(A,p);
N = NullPU(U,p);
N(cols,:) = N;

Обратите внимание, что эта функция вычисляет базу для правого нулевого пространства A по модулю p. Левое нулевое пространство находится с помощью

N = NullP(A',p)';
person Nathan    schedule 18.04.2018