# How to construct submodules with GAP / MeatAxe?

Let $$G= \langle g_1, g_2 \rangle$$ be a finite group. Let $$k$$ be a finite field with $${\rm char}(k)=p>0$$ such that $$p \mid |G|$$.

Let the $$kG$$-module $$M$$ be a MeatAxe-module in GAP.

The generators of $$M$$ are given by the two matrices $$m_1$$ and $$m_2$$, respectively, which reflect the actions of $$g_1$$ and $$g_2$$, respectively.

I'd like to ask the following two (related) questions:

1.) If $${\rm dim}_k(M)=n$$ and one has a finite set $$S=\{v_1,v_2,...\}$$ of row vectors (where each vector has $$n$$ entries), how can one construct the submodule of $$M$$ generated by $$S$$ with GAP/MeatAxe ?

2.) Given a fixed element $$f\in{\rm End}_{kG}(M)$$ via a matrix in GAP, how can one construct the image and the kernel of $$f$$ as submodules of $$M$$ with GAP/MeatAxe ?

Thank you very much for the help.

• Try looking at Section 69.7 of the manual. ${\tt 69.7-1\ MTX.SubmoduleGModule}$ seems to do what you want for Qn 1, and for Qn 2, you just want the submodules spanned by the nullspace and rowspace of the matrix that defines the endomorphism. Dec 1, 2021 at 17:15
• Thank you very much for the comment. I would like to have the resulting module as a MeatAxe-module again. I got the following error message: Dec 1, 2021 at 19:07
• gap> G:=AlternatingGroup(4);p:=2;; gap> REG:=RegularModule(G,GF(4));; gap> reg:=REG[2];; gap> V:=FullRowSpace(GF(4),12);; gap> ElsF:=Elements(F);; [ 0*Z(2), Z(2)^0, Z(2^2), Z(2^2)^2 ] gap> gap> NULL:=ElsF[1]; 0*Z(2) gap> EINS:=ElsF[2]; Z(2)^0 gap> Dec 1, 2021 at 19:08
• gap> gap> SUBM:=MTX.SubGModule(reg,[EINS,EINS,EINS,EINS,EINS,EINS,EINS,EINS,EINS,EINS,EINS,EINS]); [ [ Z(2)^0, Z(2)^0, Z(2)^0, Z(2)^0, Z(2)^0, Z(2)^0, Z(2)^0, Z(2)^0, Z(2)^0, Z(2)^0, Z(2)^0, Z(2)^0 ] ] gap> gap> SUBM; [ [ Z(2)^0, Z(2)^0, Z(2)^0, Z(2)^0, Z(2)^0, Z(2)^0, Z(2)^0, Z(2)^0, Z(2)^0, Z(2)^0, Z(2)^0, Z(2)^0 ] ] Dec 1, 2021 at 19:08
• gap> Display(SUBM); 1 1 1 1 1 1 1 1 1 1 1 1 Dec 1, 2021 at 19:09

This will be a two-step process. First call a spinning algorithm to find a basis of the submodule and then make a MeatAxe module out of it.

For example:

gap> G:=AlternatingGroup(4);REG:=RegularModule(G,GF(4))[2];;
Alt( [ 1 .. 4 ] )
gap> vec:=[1,1,1,1,0,0,0,0,0,0,0,0]*One(GF(4));; # just some vector


Now the SpinnedBasis command calculates a basis for the smallest submodule containing the vector:

gap> bas:=MTX.SpinnedBasis(vec,REG.generators,GF(4));
< immutable compressed matrix 9x12 over GF(4) >


We can now take the induced action on this submodule (which will corresponds to the submodule basis in bas:

gap> sub:=MTX.InducedActionSubmodule(REG,bas);
rec( IsOverFiniteField := true, dimension := 9, field := GF(2^2),
generators := [ < immutable compressed matrix 9x9 over GF(4) >,
< immutable compressed matrix 9x9 over GF(4) > ], isMTXModule := true )


It also is possible to give a list of (independent) vectors as a seed:

gap> vec2:=[1,1,0,0,0,0,0,0,0,0,0,0]*One(GF(4));;
gap> bas:=MTX.SpinnedBasis([vec,vec2],REG.generators,GF(4));
< immutable compressed matrix 11x12 over GF(4) >

• Thank you very much for the answer, the help and the explanations. Dec 3, 2021 at 6:25