Skip to content

Commit

Permalink
added GO(1,q), SO(1,q), Omega(1,q), Omega(-1,2,q)
Browse files Browse the repository at this point in the history
... and adjusted the relevant statements in the documentation
  • Loading branch information
ThomasBreuer committed Mar 23, 2021
1 parent 379de8b commit fde5af5
Show file tree
Hide file tree
Showing 5 changed files with 80 additions and 25 deletions.
6 changes: 4 additions & 2 deletions grp/classic.gd
Original file line number Diff line number Diff line change
Expand Up @@ -432,7 +432,8 @@ DeclareConstructor( "SpecialOrthogonalGroupCons",
## odd, and <M>1</M> if <A>q</A> is even.)
## Also interesting is the group Omega( <A>e</A>, <A>d</A>, <A>q</A> ),
## see <Ref Oper="Omega" Label="construct an orthogonal group"/>,
## which is always of index <M>2</M> in SO( <A>e</A>, <A>d</A>, <A>q</A> ).
## which is of index <M>2</M> in SO( <A>e</A>, <A>d</A>, <A>q</A> ),
## except in the case <M><A>d</A> = 1</M>.
## <P/>
## If <A>filt</A> is not given it defaults to <Ref Filt="IsMatrixGroup"/>,
## and the returned group is the special orthogonal group itself.
Expand Down Expand Up @@ -652,7 +653,8 @@ DeclareConstructor( "OmegaCons", [ IsGroup, IsInt, IsPosInt, IsPosInt ] );
## (see&nbsp;<Ref Attr="InvariantQuadraticForm"/>) specified by <A>e</A>,
## and that have square spinor norm in odd characteristic
## or Dickson invariant <M>0</M> in even characteristic, respectively,
## in the category given by the filter <A>filt</A>. For odd <A>q</A>,
## in the category given by the filter <A>filt</A>. For odd <A>q</A>
## and <M><A>d</A> \geq 2</M>,
## this group has always index two in the corresponding special orthogonal group,
## which will be conjugate in <M>GL(d,q)</M> to the group returned by SO( <A>e</A>, <A>d</A>, <A>q</A> ),
## see <Ref Func="SpecialOrthogonalGroup"/>, but may fix a different form (see <Ref Sect="Classical Groups"/>).
Expand Down
73 changes: 55 additions & 18 deletions grp/classic.gi
Original file line number Diff line number Diff line change
Expand Up @@ -1138,12 +1138,21 @@ BindGlobal( "OzeroOdd", function( d, q, b )
# <d> and <q> must be odd
if d mod 2 = 0 then
Error( "<d> must be odd" );
elif d < 3 then
Error( "<d> must be at least 3" );
elif q mod 2 = 0 then
Error( "<q> must be odd" );
fi;

f := GF(q);
if d = 1 then
# The group has order two.
s:= ImmutableMatrix( f, [ [ One( f ) ] ], true );
g:= GroupWithGenerators( [ -s ] );
SetDimensionOfMatrixGroup( g, d );
SetFieldOfMatrixGroup( g, f );
SetSize( g, 2 );
SetInvariantQuadraticFormFromMatrix( g, s );
return g;
fi;

# identity matrix over <f>
id := Immutable( IdentityMat( d, f ) );
Expand Down Expand Up @@ -1229,8 +1238,6 @@ BindGlobal( "OzeroEven", function( d, q )
# <d> must be odd, <q> must be even
if d mod 2 = 0 then
Error( "<d> must be odd" );
elif d < 3 then
Error( "<d> must be at least 3" );
elif q mod 2 = 1 then
Error( "<q> must be even" );
fi;
Expand All @@ -1239,7 +1246,18 @@ BindGlobal( "OzeroEven", function( d, q )
o:= One( f );
n:= Zero( f );

if d = 3 then
if d = 1 then

# The group is trivial.
s:= ImmutableMatrix( f, [ [ o ] ], true );
g:= GroupWithGenerators( [], s );
SetDimensionOfMatrixGroup( g, d );
SetFieldOfMatrixGroup( g, f );
SetSize( g, 1 );
SetInvariantQuadraticFormFromMatrix( g, s );
return g;

elif d = 3 then

# The isomorphic symplectic group is $SL(2,<q>)$.
if q = 2 then
Expand Down Expand Up @@ -1351,7 +1369,7 @@ InstallMethod( GeneralOrthogonalGroupCons,
elif e = 0 then
g := OzeroEven( d, q );

# O+(2,q) = D_2(q-1)
# O+(2,q) = D_{2(q-1)}
elif e = +1 and d = 2 then
g := Oplus2(q);

Expand All @@ -1367,7 +1385,7 @@ InstallMethod( GeneralOrthogonalGroupCons,
elif e = +1 and q mod 2 = 1 then
g := OpmOdd( +1, d, q );

# O-(2,q) = D_2(q+1)
# O-(2,q) = D_{2(q+1)}
elif e = -1 and d = 2 then
g := Ominus2(q);

Expand Down Expand Up @@ -1450,10 +1468,13 @@ InstallMethod( SpecialOrthogonalGroupCons,
gens:= Reversed( gens );
fi;

Assert( 1, Length( gens ) = 2 and IsOne( DeterminantMat( gens[1] ) ) );

# Construct the group.
U:= GroupWithGenerators( [ gens[1], gens[1]^gens[2], gens[2]^2 ] );
if d = 1 then
U:= GroupWithGenerators( [], One( G ) );
else
Assert( 1, Length( gens ) = 2 and IsOne( DeterminantMat( gens[1] ) ) );
U:= GroupWithGenerators( [ gens[1], gens[1]^gens[2], gens[2]^2 ] );
fi;

# Set the group order.
SetSize( U, Size( G ) / 2 );
Expand All @@ -1467,9 +1488,7 @@ InstallMethod( SpecialOrthogonalGroupCons,
SetInvariantBilinearForm( U, InvariantBilinearForm( G ) );
SetInvariantQuadraticForm( U, InvariantQuadraticForm( G ) );
SetIsFullSubgroupGLorSLRespectingQuadraticForm( U, true );
if q mod 2 = 1 then
SetIsFullSubgroupGLorSLRespectingBilinearForm( U, true );
fi;
SetIsFullSubgroupGLorSLRespectingBilinearForm( U, true );
G:= U;

fi;
Expand Down Expand Up @@ -1497,8 +1516,9 @@ BindGlobal( "OmegaZero", function( d, q )
# <d> must be odd
if d mod 2 = 0 then
Error( "<d> must be odd" );
elif d < 3 then
Error( "<d> must be at least 3" );
elif d = 1 then
# The group is trivial.
return SO( d, q );
elif q mod 2 = 0 then
# For even q, the generators claimed in [RylandsTalor98] are wrong:
# For (d,q) = (5,2), the matrices generate only S4(2)' not S4(2).
Expand Down Expand Up @@ -1721,9 +1741,26 @@ BindGlobal( "OmegaMinus", function( d, q )
# <d> must be even
if d mod 2 = 1 then
Error( "<d> must be even" );
elif d < 4 then
# The construction in the paper does not apply to the case d = 2
Error( "<d> = 2 is not supported" );
elif d = 2 then
# The construction in the Rylands/Taylor paper does not apply
# to the case d = 2.
# The group 'Ominus2( q ) = GO(-1,2,q)' is a dihedral group
# of order 2*(q+1).
g:= Ominus2( q );
h:= GeneratorsOfGroup( g )[1];
Assert( 1, Order( h ) = q+1 );
if IsEvenInt( q ) then
# For even q, 'GO(-1,2,q)' is equal to 'SO(-1,2,q)',
# and 'Omega(-1,2,q)' is its unique subgroup of index two.
s:= GroupWithGenerators( [ h ] );
else
# For odd q, the group 'SO(-1,2,q)' is cyclic of order q+1,
# and 'Omega(-1,2,q)' is its unique subgroup of index two.
s:= GroupWithGenerators( [ h^2 ] );
fi;
SetInvariantBilinearForm( s, InvariantBilinearForm( g ) );
SetInvariantQuadraticForm( s, InvariantQuadraticForm( g ) );
return s;
fi;
f:= GF(q);
o:= One( f );
Expand Down
18 changes: 14 additions & 4 deletions tst/testinstall/grp/classic-G.tst
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,12 @@ true
gap> GO(IsPermGroup,3,5);
Perm_GO(0,3,5)

#
gap> IsTrivial( GO(1,3) );
false
gap> IsTrivial( GO(1,4) );
true

#
gap> GO(3);
Error, usage: GeneralOrthogonalGroup( [<filter>, ][<e>, ]<d>, <q> )
Expand Down Expand Up @@ -130,6 +136,10 @@ gap> GammaL(3,6);
Error, <subfield> must be a prime or a finite field

#
gap> Omega(1,2);
GO(0,1,2)
gap> Omega(1,3);
SO(0,1,3)
gap> Omega(3,2);
GO(0,3,2)
gap> Omega(3,3);
Expand All @@ -150,6 +160,10 @@ gap> Omega(+1,4,3);
Omega(+1,4,3)

#
gap> Omega(-1,2,2);
Omega(-1,2,2)
gap> Omega(-1,2,3);
Omega(-1,2,3)
gap> Omega(-1,4,2);
Omega(-1,4,2)
gap> Omega(-1,4,3);
Expand All @@ -170,12 +184,8 @@ Error, no method found! For debugging hints type ?Recovery from NoMethodFound
Error, no 1st choice method found for `OmegaCons' on 4 arguments

#
gap> Omega(1,2);
Error, <d> must be at least 3
gap> Omega(2,2);
Error, sign <e> = 0 but dimension <d> is even
gap> Omega(-1,2,2);
Error, <d> = 2 is not supported

#
gap> STOP_TEST("classic-G.tst", 1);
6 changes: 6 additions & 0 deletions tst/testinstall/grp/classic-S.tst
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,12 @@ true
gap> SO(IsPermGroup,3,5);
Perm_SO(0,3,5)
#
gap> IsTrivial( SO(1,3) );
true
gap> IsTrivial( SO(1,4) );
true
#
gap> SO(3);
Error, usage: SpecialOrthogonalGroup( [<filter>, ][<e>, ]<d>, <q> )
Expand Down
2 changes: 1 addition & 1 deletion tst/testinstall/grp/classic-forms.tst
Original file line number Diff line number Diff line change
Expand Up @@ -142,7 +142,7 @@ gap> grps:=[];;
gap> for d in [2,4,6,8] do
> for q in [2,3,4,5,7,8,9,16,17,25,27] do
> Add(grps, Omega(+1,d,q));
> if d <> 2 then Add(grps, Omega(-1,d,q)); fi;
> Add(grps, Omega(-1,d,q));
> od;
> od;
gap> ForAll(grps, CheckGeneratorsSpecial);
Expand Down

0 comments on commit fde5af5

Please sign in to comment.