diff --git a/doc/ref/meataxe.xml b/doc/ref/meataxe.xml index 2a7b7b88c5..ffdfd6e081 100644 --- a/doc/ref/meataxe.xml +++ b/doc/ref/meataxe.xml @@ -582,15 +582,47 @@ on all composition factors except number nr.
MeatAxe Functionality for Invariant Forms -The functions in this section can only be applied to an absolutely irreducible -MeatAxe module. - returns an invariant bilinear form, which may be symmetric or anti-symmetric, of module, or fail if no such form exists. + + g:= SO(-1, 4, 5);; +gap> m:= NaturalGModule( g );; +gap> form:= MTX.InvariantBilinearForm( m );; +gap> Display( form ); + . 3 . . + 3 . . . + . . 2 . + . . . 1 +gap> ForAll(MTX.Generators(m), x -> x*form*TransposedMat(x) = form); +true +]]> + +Since GAP 4.14 modules that are not absolutely irreducible are also supported: + g1:= GeneratorsOfGroup(SO(-1, 4, 5));; +gap> g2:= GeneratorsOfGroup(SO(+1, 4, 5));; +gap> m:= GModuleByMats(SMTX.MatrixSum(g1,g2), GF(5));; +gap> MTX.IsIrreducible(m); +false +gap> form:= MTX.InvariantBilinearForm( m );; +gap> Display( form ); + . 3 . . . . . . + 3 . . . . . . . + . . 2 . . . . . + . . . 1 . . . . + . . . . . 3 . . + . . . . 3 . . . + . . . . . . 1 . + . . . . . . . 1 +gap> ForAll(MTX.Generators(m), x -> x*form*TransposedMat(x) = form); +true +]]> + @@ -603,6 +635,42 @@ returns an invariant hermitian (= self-adjoint) sesquilinear form of module, which must be defined over a finite field whose order is a square, or fail if no such form exists. + + g:= SU(4, 5);; +gap> m:= NaturalGModule( g );; +gap> form:= MTX.InvariantSesquilinearForm( m );; +gap> Display( form ); + . . . 1 + . . 1 . + . 1 . . + 1 . . . +gap> frob5 := g -> List(g,row->List(row,x->x^5));; # field involution +gap> ForAll(MTX.Generators(m), x -> x*form*TransposedMat(frob5(x)) = form); +true +]]> + +Since GAP 4.14 modules that are not absolutely irreducible are also supported: + g1:= GeneratorsOfGroup(SU(3, 5));; +gap> g2:= GeneratorsOfGroup(SU(4, 5));; +gap> m:= GModuleByMats(SMTX.MatrixSum(g1,g2), GF(25));; +gap> MTX.IsIrreducible(m); +false +gap> form:= MTX.InvariantSesquilinearForm( m );; +gap> Display( form ); + . . 1 . . . . + . 1 . . . . . + 1 . . . . . . + . . . . . . 1 + . . . . . 1 . + . . . . 1 . . + . . . 1 . . . +gap> frob5 := g -> List(g,row->List(row,x->x^5));; # field involution +gap> ForAll(MTX.Generators(m), x -> x*form*TransposedMat(frob5(x)) = form); +true +]]> + @@ -617,6 +685,7 @@ or fail if no such form exists. returns a basis of the underlying vector space of module which is contained in an orbit of the action of the generators of module on that space. This is used by in characteristic 2. +Requires module to be irreducible. diff --git a/lib/meataxe.gi b/lib/meataxe.gi index 69d0cef90c..baa80b0260 100644 --- a/lib/meataxe.gi +++ b/lib/meataxe.gi @@ -3311,21 +3311,19 @@ end; ## #F InvariantBilinearForm( module ) . . . . ## -## Look for an invariant bilinear form of the absolutely irreducible -## GModule module. Return fail, or the matrix of the form. +## Look for an invariant bilinear form of the GModule module. +## Return fail, or the matrix of the form. SMTX.InvariantBilinearForm:=function( module ) local DM, iso; - if not SMTX.IsMTXModule(module) or - not SMTX.IsAbsolutelyIrreducible(module) then - Error( - "Argument of InvariantBilinearForm is not an absolutely irreducible module"); + if not SMTX.IsMTXModule(module) then + Error("Argument of InvariantBilinearForm is not a module"); fi; if IsBound(module.InvariantBilinearForm) then return module.InvariantBilinearForm; fi; DM:=SMTX.DualModule(module); - iso:=MTX.IsomorphismIrred(module,DM); + iso:=MTX.IsomorphismModules(module,DM); if iso = fail then SMTX.SetInvariantBilinearForm(module, fail); return fail; @@ -3368,41 +3366,24 @@ end; ## #F InvariantSesquilinearForm( module ) . . . . ## -## Look for an invariant sesquililinear form of the absolutely irreducible -## GModule module. Return fail, or the matrix of the form. +## Look for an invariant sesquililinear form of the GModule module. +## Return fail, or the matrix of the form. SMTX.InvariantSesquilinearForm:=function( module ) - local DM, q, r, iso, isot, l; + local DM, iso; - if not SMTX.IsMTXModule(module) or - not SMTX.IsAbsolutelyIrreducible(module) then - Error( - "Argument of InvariantSesquilinearForm is not an absolutely irreducible module" - ); + if not SMTX.IsMTXModule(module) then + Error("Argument of InvariantSesquilinearForm is not a module"); fi; - if IsBound(module.InvariantSesquilinearForm) then return module.InvariantSesquilinearForm; fi; DM:=SMTX.TwistedDualModule(module); - iso:=MTX.IsomorphismIrred(module,DM); + iso:=MTX.IsomorphismModules(module,DM); if iso = fail then SMTX.SetInvariantSesquilinearForm(module, fail); return fail; fi; - # Replace iso by a scalar multiple to get iso twisted symmetric - q:=Size(module.field); - r:=RootInt(q,2); - isot:=List( TransposedMat(iso), x -> List(x, y->y^r) ); - isot:=iso * isot^-1; - if not IsDiagonalMat(isot) then - Error("Form does not seem to be of the right kind (non-diagonal)!"); - fi; - l:=LogFFE(isot[1,1],Z(q)); - if l mod (r-1) <> 0 then - Error("Form does not seem to be of the right kind (not (q-1)st root)!"); - fi; - iso:=Z(q)^(l/(r-1)) * iso; - iso:=ImmutableMatrix(GF(q), iso); + iso:=ImmutableMatrix(module.field, iso); SMTX.SetInvariantSesquilinearForm(module, iso); return iso; end; diff --git a/tst/testinstall/meataxe.tst b/tst/testinstall/meataxe.tst index ee51f9a065..699b772915 100644 --- a/tst/testinstall/meataxe.tst +++ b/tst/testinstall/meataxe.tst @@ -1,4 +1,4 @@ -#@local G,M,M2,M3,M4,M5,V,bf,bo,cf,homs,m,mat,qf,randM,res,sf,subs,mats,Q,orig,S +#@local G,M,M2,M3,M4,M5,V,bf,bo,cf,homs,m,mat,qf,randM,res,sf,subs,mats,Q,orig,S,g1,g2,form,frob5 gap> START_TEST("meataxe.tst"); # @@ -105,6 +105,16 @@ gap> MTX.OrthogonalSign(M2); gap> SMTX.RandomIrreducibleSubGModule(M2); # returns false for irreducible module false +# test invariant form detection on reducible module with two isomorphic +# components (hence many automorphisms exist) +gap> g1:= GeneratorsOfGroup(SU(4, 5));; +gap> g2:= GeneratorsOfGroup(SU(4, 5));; +gap> m:= GModuleByMats(SMTX.MatrixSum(g1,g2), GF(25));; +gap> form:= MTX.InvariantSesquilinearForm( m );; +gap> frob5 := g -> List(g,row->List(row,x->x^5));; # field involution +gap> ForAll(MTX.Generators(m), x -> x*form*TransposedMat(frob5(x)) = form); +true + # gap> Display(MTX.IsomorphismModules(M,M)); 1 . . . . @@ -254,8 +264,8 @@ gap> MTX.InvariantQuadraticForm( m ); Error, Argument of InvariantQuadraticForm is not an absolutely irreducible mod\ ule gap> MTX.OrthogonalSign( m ); -Error, Argument of InvariantBilinearForm is not an absolutely irreducible modu\ -le +Error, Argument of InvariantQuadraticForm is not an absolutely irreducible mod\ +ule gap> mats:= GeneratorsOfGroup( SP( 4, 2 ) );; gap> m:= GModuleByMats( mats, GF(2) );; gap> Q:= MTX.InvariantQuadraticForm( m );