[GAP Forum] Find rank-1 matrices in given subspace of matrices
Alexander Hulpke
hulpke at math.colostate.edu
Mon Feb 15 21:07:24 GMT 2016
Dear Benoit,
Ah — within a subspace will give you polynomial equations (all 2x2 subdeterminants=0) in the coefficients of a linear combination, and at least in principle this can be done with Groebner bases (i.e. you get rank <=1, but rank 0 is easily eliminated.)
For example (using the appended function) for the standard basis of Q^{3\times 4}:
gap> b:=BasisVectors(Basis(MatrixSpace(Rationals,3,4)));;
gap> e:=Rank1Equations(b);
[ x_1*x_6-x_2*x_5, x_1*x_7-x_3*x_5, x_1*x_8-x_4*x_5, x_2*x_7-x_3*x_6,
x_2*x_8-x_4*x_6, x_3*x_8-x_4*x_7, x_1*x_10-x_2*x_9, x_1*x_11-x_3*x_9,
x_1*x_12-x_4*x_9, x_2*x_11-x_3*x_10, x_2*x_12-x_4*x_10, x_3*x_12-x_4*x_11,
x_5*x_10-x_6*x_9, x_5*x_11-x_7*x_9, x_5*x_12-x_8*x_9, x_6*x_11-x_7*x_10,
x_6*x_12-x_8*x_10, x_7*x_12-x_8*x_11 ]
gap> ReducedGroebnerBasis(e,MonomialLexOrdering());
[ x_7*x_12-x_8*x_11, x_6*x_12-x_8*x_10, x_6*x_11-x_7*x_10, x_5*x_12-x_8*x_9,
x_5*x_11-x_7*x_9, x_5*x_10-x_6*x_9, x_3*x_12-x_4*x_11, x_3*x_8-x_4*x_7,
x_2*x_12-x_4*x_10, x_2*x_11-x_3*x_10, x_2*x_8-x_4*x_6, x_2*x_7-x_3*x_6,
x_1*x_12-x_4*x_9, x_1*x_11-x_3*x_9, x_1*x_10-x_2*x_9, x_1*x_8-x_4*x_5,
x_1*x_7-x_3*x_5, x_1*x_6-x_2*x_5 ]
So x_7 =x_8*x_11/x_12 (and case for x_12=0) etc. and you can build an (ugly) parameterization from these.
(Alternatively one could try to use \sum_c_i M_i=v\cdot w^T with v and w given by extra variables that are to be eliminated. This will yield the same Groebner basi after variable elimination.)
Best,
Alexander
Rank1Equations:=function(mats)
local l,f,r,vars,n,m,c,d,eqs;
l:=Length(mats);
f:=DefaultFieldOfMatrix(mats[1]);
r:=PolynomialRing(f,l);
vars:=IndeterminatesOfPolynomialRing(r);
n:=Length(mats[1]);
m:=Length(mats[1][1]);
eqs:=[];
for c in Combinations([1..n],2) do
for d in Combinations([1..m],2) do
Add(eqs,
Sum([1..l],x->vars[x]*mats[x][c[1]][d[1]])
*Sum([1..l],x->vars[x]*mats[x][c[2]][d[2]])
-Sum([1..l],x->vars[x]*mats[x][c[1]][d[2]])
*Sum([1..l],x->vars[x]*mats[x][c[2]][d[1]]));
od;
od;
return eqs;
end;
More information about the Forum
mailing list