Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Extend meataxe to be able to detect invariant forms of reducible modules (just one possible form is returned) #5803

Draft
wants to merge 4 commits into
base: master
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from 3 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
75 changes: 72 additions & 3 deletions doc/ref/meataxe.xml
Original file line number Diff line number Diff line change
Expand Up @@ -582,15 +582,47 @@ on all composition factors except number <A>nr</A>.
<Section Label="meataxe:Invariant Forms">
<Heading>MeatAxe Functionality for Invariant Forms</Heading>

The functions in this section can only be applied to an absolutely irreducible
MeatAxe module.

<ManSection>
<Func Name="MTX.InvariantBilinearForm" Arg='module'/>

<Description>
returns an invariant bilinear form, which may be symmetric or anti-symmetric,
of <A>module</A>, or <K>fail</K> if no such form exists.

<Example><![CDATA[
gap> 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
]]></Example>

Since GAP 4.14 also modules which are not absolutely irreducible are supported:
fingolfin marked this conversation as resolved.
Show resolved Hide resolved
<Example><![CDATA[
gap> 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
]]></Example>

</Description>
</ManSection>

Expand All @@ -603,6 +635,42 @@ returns an invariant hermitian (= self-adjoint) sesquilinear form of
<A>module</A>,
which must be defined over a finite field whose order is a square,
or <K>fail</K> if no such form exists.

<Example><![CDATA[
gap> 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
]]></Example>

Since GAP 4.14 also reducible modules are supported:
fingolfin marked this conversation as resolved.
Show resolved Hide resolved
<Example><![CDATA[
gap> 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
]]></Example>

</Description>
</ManSection>

Expand All @@ -617,6 +685,7 @@ or <K>fail</K> if no such form exists.
returns a basis of the underlying vector space of <A>module</A> which is contained
in an orbit of the action of the generators of module on that space.
This is used by <Ref Func="MTX.InvariantQuadraticForm"/> in characteristic 2.
Requires <A>module</A> to be irreducible.
</Description>
</ManSection>

Expand Down
43 changes: 12 additions & 31 deletions lib/meataxe.gi
Original file line number Diff line number Diff line change
Expand Up @@ -3311,21 +3311,19 @@
##
#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");

Check warning on line 3320 in lib/meataxe.gi

View check run for this annotation

Codecov / codecov/patch

lib/meataxe.gi#L3320

Added line #L3320 was not covered by tests
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
Copy link
Member Author

@fingolfin fingolfin Jan 15, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Here, too, we might get additional problems, i.e., iso may not be symmetric -- we ought to add a check for that.

SMTX.SetInvariantBilinearForm(module, fail);
return fail;
Expand Down Expand Up @@ -3368,41 +3366,24 @@
##
#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");

Check warning on line 3375 in lib/meataxe.gi

View check run for this annotation

Codecov / codecov/patch

lib/meataxe.gi#L3375

Added line #L3375 was not covered by tests
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;
Comment on lines -3392 to -3396
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looking at this again I realize that of course this code is needed. Not sure why I was too dense to grasp it before: the reason why is right in this comment: to ensure we get a form which is twisted symmetric. I.e. the matrix M representing the isomorphism aka the form should satisfy $M = \overline{M}^T$.

Indeed in the code the matrix is called iso and that's it computes iso * isot^-1. If this is the identity, we are done. If it is a scalar matrix, we can hopefully scale M to satisfy the property, which is what the below does.

I'll restored the deleted code and add comments with details.

That then gets me back to the tests failing then, because now in the reducible case, iso * isot^-1 is not always diagonal. I did not yet look into the details, but surely this happens if there is a homogeneous reducible summand of the module, i.e., $A \oplus A$ -- then there are many automorphisms which are not "twisted symmetric". Gotta deal with that.

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;
Expand Down
16 changes: 13 additions & 3 deletions tst/testinstall/meataxe.tst
Original file line number Diff line number Diff line change
@@ -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");

#
Expand Down Expand Up @@ -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 . . . .
Expand Down Expand Up @@ -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 );
Expand Down
Loading