From 634d1fc80a8d683ed4810ded25e263a2ecac2339 Mon Sep 17 00:00:00 2001 From: Max Horn Date: Fri, 8 Nov 2024 00:17:03 +0100 Subject: [PATCH 1/4] meataxe: extend invariant form detection --- doc/ref/meataxe.xml | 4 +--- lib/meataxe.gi | 26 ++++++++++---------------- tst/testinstall/meataxe.tst | 4 ++-- 3 files changed, 13 insertions(+), 21 deletions(-) diff --git a/doc/ref/meataxe.xml b/doc/ref/meataxe.xml index 2a7b7b88c5..d00cb3028d 100644 --- a/doc/ref/meataxe.xml +++ b/doc/ref/meataxe.xml @@ -582,9 +582,6 @@ 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. - @@ -617,6 +614,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..90c375cfd8 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,23 +3366,19 @@ 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; - 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; diff --git a/tst/testinstall/meataxe.tst b/tst/testinstall/meataxe.tst index ee51f9a065..f90422bb2d 100644 --- a/tst/testinstall/meataxe.tst +++ b/tst/testinstall/meataxe.tst @@ -254,8 +254,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 ); From c075d237af2271f91970422ce2f76f3d870ba65b Mon Sep 17 00:00:00 2001 From: Max Horn Date: Fri, 8 Nov 2024 00:38:54 +0100 Subject: [PATCH 2/4] Add example / test case to documentation --- doc/ref/meataxe.xml | 71 +++++++++++++++++++++++++++++++++++++ tst/testinstall/meataxe.tst | 2 +- 2 files changed, 72 insertions(+), 1 deletion(-) diff --git a/doc/ref/meataxe.xml b/doc/ref/meataxe.xml index d00cb3028d..bd5c84d979 100644 --- a/doc/ref/meataxe.xml +++ b/doc/ref/meataxe.xml @@ -588,6 +588,41 @@ on all composition factors except number nr. 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 also modules which are not absolutely irreducible are 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 +]]> + @@ -600,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 also reducible modules are 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 +]]> + diff --git a/tst/testinstall/meataxe.tst b/tst/testinstall/meataxe.tst index f90422bb2d..0dddfd4bfe 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"); # From 3147c2b18fb78d7e1719918c1bb078aaea83b1be Mon Sep 17 00:00:00 2001 From: Max Horn Date: Fri, 8 Nov 2024 01:14:29 +0100 Subject: [PATCH 3/4] Fix SMTX.InvariantSesquilinearForm for reducible case ... by deleting unnecessary 'normalization' (???) code. --- lib/meataxe.gi | 17 ++--------------- tst/testinstall/meataxe.tst | 10 ++++++++++ 2 files changed, 12 insertions(+), 15 deletions(-) diff --git a/lib/meataxe.gi b/lib/meataxe.gi index 90c375cfd8..baa80b0260 100644 --- a/lib/meataxe.gi +++ b/lib/meataxe.gi @@ -3369,7 +3369,7 @@ end; ## 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) then Error("Argument of InvariantSesquilinearForm is not a module"); @@ -3383,20 +3383,7 @@ SMTX.InvariantSesquilinearForm:=function( module ) 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 0dddfd4bfe..699b772915 100644 --- a/tst/testinstall/meataxe.tst +++ b/tst/testinstall/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 . . . . From 44802ad77147634bb684cd5ba97a899610187a84 Mon Sep 17 00:00:00 2001 From: Max Horn Date: Thu, 5 Dec 2024 17:29:40 +0100 Subject: [PATCH 4/4] Apply suggestions from code review Co-authored-by: James Mitchell --- doc/ref/meataxe.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/doc/ref/meataxe.xml b/doc/ref/meataxe.xml index bd5c84d979..ffdfd6e081 100644 --- a/doc/ref/meataxe.xml +++ b/doc/ref/meataxe.xml @@ -602,7 +602,7 @@ gap> ForAll(MTX.Generators(m), x -> x*form*TransposedMat(x) = form); true ]]> -Since GAP 4.14 also modules which are not absolutely irreducible are supported: +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));; @@ -650,7 +650,7 @@ gap> ForAll(MTX.Generators(m), x -> x*form*TransposedMat(frob5(x)) = form); true ]]> -Since GAP 4.14 also reducible modules are supported: +Since GAP 4.14 modules that are not absolutely irreducible are also supported: g1:= GeneratorsOfGroup(SU(3, 5));; gap> g2:= GeneratorsOfGroup(SU(4, 5));;