Skip to content

Commit

Permalink
Merge pull request #148 from gap-packages/queries
Browse files Browse the repository at this point in the history
implemented (Inner)ActorCat1Group
  • Loading branch information
cdwensley authored Dec 17, 2024
2 parents 2c22a50 + 7d8ca86 commit ee8d4ba
Show file tree
Hide file tree
Showing 10 changed files with 171 additions and 32 deletions.
3 changes: 2 additions & 1 deletion CHANGES.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
# CHANGES to the 'XMod' package

## 2.92 -> 2.92dev (20/11/2024)
## 2.92 -> 2.92dev (17/12/2024)
* (17/12/24) implemented (Inner)ActorCat1Group, fixing issue #144
* (20/11/24) added AutomorphismPermGroup method for cat1-groups
renamed PermAutomorphismAsXModMorphism as
PermAutomorphismAs2dGroupMorphism and added cat1-group method
Expand Down
4 changes: 2 additions & 2 deletions PackageInfo.g
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ SetPackageInfo( rec(
PackageName := "XMod",
Subtitle := "Crossed Modules and Cat1-Groups",
Version := "2.92dev",
Date := "28/11/2024", # dd/mm/yyyy format
Date := "17/12/2024", # dd/mm/yyyy format
License := "GPL-2.0-or-later",

Persons := [
Expand Down Expand Up @@ -91,7 +91,7 @@ PackageDoc := rec(
HTMLStart := "doc/chap0_mj.html",
PDFFile := "doc/manual.pdf",
SixFile := "doc/manual.six",
LongTitle := "Crossed Modules and Cat1-Groups in GAP",
LongTitle := "Crossed Modules and Cat1-Groups in GAP"
),

Dependencies := rec(
Expand Down
84 changes: 83 additions & 1 deletion doc/gp2act.xml
Original file line number Diff line number Diff line change
Expand Up @@ -204,13 +204,14 @@ Crossed module Actor[c3->s3] :-

The main methods for these operations are written for
permutation crossed modules.
For other crossed modules an isomorphism to a permutation crodssed module
For other crossed modules an isomorphism to a permutation crossed module
is found first, and then the main method is applied to the image.
In the example the crossed module <C>XAq8</C>
is the automorphism crossed module of the quaternion group.
<Example>
<![CDATA[
gap> q8 := Group( (1,2,3,4)(5,8,7,6), (1,5,3,7)(2,6,4,8) );;
gap> SetName( q8, "q8" );
gap> XAq8 := XModByAutomorphismGroup( q8 );;
gap> StructureDescription( WhiteheadXMod( XAq8 ) );
[ "Q8", "C2 x C2 x C2" ]
Expand Down Expand Up @@ -290,4 +291,85 @@ Crossed module InnerActor[c3->s3] :-

</Section>

<Section><Heading>Actor of a cat<M>^1</M>-group</Heading>

<ManSection>
<Attr Name="ActorCat1Group"
Arg="cat1" />
<Func Name="InnerActorCat1Group"
Arg="cat1" />
<Description>
The actor of a cat<M>^1</M>-group <M>C</M> is obtained by converting
<M>C</M> to a crossed module; forming the actor of that crossed module;
and then converting that actor into a cat<M>^1</M>-group.
<P/>
A similar procedure is followed for the inner actor.
</Description>
</ManSection>
<P/>
<Example>
<![CDATA[
gap> C3;
[g18 => s3]
gap> AC3 := ActorCat1Group( C3 );
cat1(Actor[c3->s3])
gap> Display( AC3 );
Cat1-group cat1(Actor[c3->s3]) :-
: Source group has generators:
[ ( 9,10), ( 8, 9,10), ( 5, 7, 6)( 8, 9,10), (1,2)(3,4)(6,7)(8,9) ]
: Range group has generators:
[ (5,7,6), (1,2)(3,4)(6,7) ]
: tail homomorphism maps source generators to:
[ (), (), (5,7,6), (1,2)(3,4)(6,7) ]
: head homomorphism maps source generators to:
[ (1,2)(3,4)(5,6), (5,7,6), (5,7,6), (1,2)(3,4)(6,7) ]
: range embedding maps range generators to:
[ ( 5, 7, 6)( 8, 9,10), (1,2)(3,4)(6,7)(8,9) ]
: kernel has generators:
[ ( 9,10), ( 8, 9,10) ]
: boundary homomorphism maps generators of kernel to:
[ (1,2)(3,4)(5,6), (5,7,6) ]
: kernel embedding maps generators of kernel to:
[ ( 9,10), ( 8, 9,10) ]
: associated crossed module is Actor[c3->s3]
gap> StructureDescription( AC3 );
[ "S3 x S3", "S3" ]
gap> IAC3 := InnerActorCat1Group( C3 );
cat1(InnerActor[c3->s3])
gap> StructureDescription( IAC3 );
[ "(C3 x C3) : C2", "S3" ]
]]>
</Example>

<ManSection>
<Func Name="Actor"
Arg="args" />
<Func Name="InnerActor"
Arg="args" />
<Description>
The global functions <C>Actor</C> and <C>InnerActor</C>
will call operations <C>ActorXMod</C> and <C>InnerActorXMod</C>
or <C>ActorCat1Group</C> and <C>InnerActorCat1Group</C>
as appropriate.
</Description>
</ManSection>
<P/>
<Example>
<![CDATA[
gap> c4q := Subgroup( q8, [ (1,2,3,4)(5,8,7,6) ] );;
gap> SetName( c4q, "c4q" );
gap> Xc4q := XModByNormalSubgroup( q8, c4q );;
gap> AXc4q := Actor( Xc4q );
Actor[c4q->q8]
gap> StructureDescription( AXc4q );
[ "D8", "D8" ]
gap> IAXc4q := InnerActor( Xc4q );
InnerActor[c4q->q8]
gap> StructureDescription( IAXc4q );
[ "C2", "C2 x C2" ]
]]>
</Example>

</Section>

</Chapter>
20 changes: 9 additions & 11 deletions lib/apps.gi
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
##############################################################################
############################################################################
##
#W apps.gi GAP4 package `XMod' Chris Wensley
#W apps.gi GAP4 package `XMod' Chris Wensley
##
#Y Copyright (C) 2001-2024, Chris Wensley et al,
#Y School of Computer Science, Bangor University, U.K.

##############################################################################
############################################################################
##
InstallMethod( LoopClass, "for a crossed module and an element", true,
[ IsPreXMod, IsObject ], 0,
Expand Down Expand Up @@ -39,7 +39,7 @@ function( X0, a )
end );


##############################################################################
############################################################################
##
InstallMethod( LoopClasses, "for a crossed module", true, [ IsPreXMod ], 0,
function( X0 )
Expand Down Expand Up @@ -179,7 +179,7 @@ function( X0, a )
return XModByBoundaryAndAction( bdy1, act1 );
end );

##############################################################################
############################################################################
##
InstallMethod( LoopClassesNew, "for a crossed module", true,
[ IsPreXMod ], 0,
Expand Down Expand Up @@ -246,7 +246,7 @@ function( X0 )
return classes;
end );

##############################################################################
############################################################################
##
InstallMethod( LoopClassRepresentatives, "for a crossed module", true,
[ IsPreXMod ], 0,
Expand Down Expand Up @@ -294,7 +294,7 @@ function( X0 )
return reps;
end );

##############################################################################
############################################################################
##
InstallMethod( LoopsXMod, "for a crossed module and an element", true,
[ IsPreXMod, IsObject ], 0,
Expand Down Expand Up @@ -401,13 +401,13 @@ function( X0, a )
return XModByBoundaryAndAction( bdy1, act1 );
end );

##############################################################################
############################################################################
##
InstallMethod( AllLoopsXMod, "default method for a crossed module", true,
[ IsPreXMod ], 0,
function( X0 )

local bdy0, act0, M0, genM0, P0, genP0, igenP0, imgenM0, imbdy0, Q0,
local bdy0, act0, M0, genM0, P0, genP0, igenP0, imbdy0, Q0,
conjP0, repsP0, eltsP0, nclP0, i, eclP0, relP0, c, p, genimbdy0,
len, class, j, r, k, q, pos, d, h, eqreps, numreps, a, X1, allX;

Expand All @@ -418,7 +418,6 @@ function( X0 )
P0 := Range( X0 );
genP0 := GeneratorsOfGroup( P0 );
igenP0 := List( genP0, g -> ImageElm( act0, g ) );
imgenM0 := List( genM0, g -> List( igenP0, p -> ImageElm(p,g) ) );
imbdy0 := ImagesSource( bdy0 );
Q0 := P0/imbdy0;
conjP0 := ConjugacyClasses( P0 );
Expand All @@ -427,7 +426,6 @@ function( X0 )
nclP0 := Length( conjP0 );
if ( InfoLevel( InfoXMod ) > 1 ) then
Print( "#I Size(P0) = ", Size(P0), "\n" );
Print( "#I imgenM0 = ", imgenM0, "\n" ); #? this is not used
Print( "#I cokernel of boundary has IdGroup ", IdGroup(Q0), "\n" );
Print( "#I conjugacy class sizes, reps and orders:classes for P :-\n" );
Print( "#I ", List( conjP0, Size ), "\n" );
Expand Down
4 changes: 3 additions & 1 deletion lib/gp2act.gd
Original file line number Diff line number Diff line change
Expand Up @@ -53,10 +53,12 @@ DeclareAttribute( "ActorCat1Group", IsCat1Group );
#############################################################################
##
#A InnerActorXMod( <XM> )
#A InnerActorCat1Group( <C> )
#A InnerMorphism( <XM> )
#A XModCentre( <XM> ) #? (18/07/11) : cannot get plain Centre to work ??
#A XModCentre( <XM> ) ## its not possible to use Centre for this
##
DeclareAttribute( "InnerActorXMod", IsXMod );
DeclareAttribute( "InnerActorCat1Group", IsCat1Group );
DeclareAttribute( "InnerMorphism", IsXMod );
DeclareAttribute( "XModCentre", IsXMod );

Expand Down
16 changes: 13 additions & 3 deletions lib/gp2act.gi
Original file line number Diff line number Diff line change
Expand Up @@ -690,8 +690,9 @@ end );
#############################################################################
##
#M ActorCat1Group( <C> )
#M InnerActorCat1Group( <C> )
##
## a direct implementation might be better!
#? direct implementations might be better!
##
InstallMethod( ActorCat1Group, "actor cat1-group", true, [ IsCat1Group ], 0,
function( C )
Expand All @@ -703,6 +704,17 @@ function( C )
return Cat1GroupOfXMod( AXC );
end );

InstallMethod( InnerActorCat1Group, "inner actor cat1-group", true,
[ IsCat1Group ], 0,
function( C )

local XC, IAXC;

XC := XModOfCat1Group( C );
IAXC := InnerActorXMod ( XC );
return Cat1GroupOfXMod( IAXC );
end );

#############################################################################
##
#M InnerMorphism( <XM> )
Expand Down Expand Up @@ -732,8 +744,6 @@ end );
##
#M XModCentre( <XM> )
##
#? InstallOtherMethod( Centre, "centre of an xmod", true, [ IsPermXMod ], 0,
##
InstallMethod( XModCentre, "centre of an xmod", true, [ IsXMod ], 0,
function( XM )
return Kernel( InnerMorphism( XM ) );
Expand Down
14 changes: 7 additions & 7 deletions lib/gp2ind.gi
Original file line number Diff line number Diff line change
Expand Up @@ -446,7 +446,8 @@ function( X0, iota, trans )
nrFM := Length( relFM );

# determine genN = closure of genM under conjugation by P
Info( InfoXMod, 2, "finding closure of GeneratorsOfGroup(M) by P-action");
Info( InfoXMod, 2,
"finding closure of GeneratorsOfGroup(M) by P-action");
genN := ShallowCopy( genM );
ngN := Length( genN );
genFN := ShallowCopy( genFM );
Expand All @@ -459,7 +460,7 @@ function( X0, iota, trans )
posn := Position( genN, n2 );
if ( posn = fail ) then
Add( genN, n2 );
m2 := ImageElm( g2fpM, n2 );## is this better?
m2 := ImageElm( g2fpM, n2 ); ## is this better?
if not ( n2 in M ) then
Error( "M is not a normal subgroup of P" );
fi;
Expand Down Expand Up @@ -582,7 +583,7 @@ function( X0, iota, trans )
Info( InfoXMod, 2, " genQ = ", genQ );
Info( InfoXMod, 2, "geniN = ", geniN );
Info( InfoXMod, 2, " elQ = ", elQ );
Info( InfoXMod, 2, "imFIQ = images in Q of the generators of I: ", imFIQ );
Info( InfoXMod, 2, "imFIQ = images in Q of the gens of I: ", imFIQ );
# Action of the generators of Q on the generators of I
for j1 in [1..ngQ] do
q1 := genQ[j1];
Expand Down Expand Up @@ -620,7 +621,7 @@ function( X0, iota, trans )
t1 := T[i1];
n1 := (i1-1)*ngN;
Info( InfoXMod, 4, "[i1,t1] = ", [i1,t1] );
for j1 in [1..ngM] do #? no longer [1..ngN]
for j1 in [1..ngM] do
m1 := genM[j1];
t := ImageElm( comp, m1 )^t1;
if not ( t in gimD ) then
Expand Down Expand Up @@ -709,9 +710,8 @@ function( X0, iota, trans )
free2 := FreeGroupOfFpGroup( FI2 );
genfree2 := GeneratorsOfGroup( free2 );
gensFI2 := GeneratorsOfPresentation( presFI1 ); ## ?????
#? (10/07/10) do we need both of genFI2 and gensFI2 ?????
Info( InfoXMod, 3, "gensFI2 = ", gensFI2 );
Info( InfoXMod, 3, "genFI2 = gensFI2 ? ", gensFI2 = gensFI2 );
Info( InfoXMod, 3, "genFI2 = gensFI2 ? ", genFI2 = gensFI2 );
Info( InfoXMod, 1, "#I induced group has size: ", oFI2 );
#? (19/07/11) : example InducedXMod( s4, s3b, s3b ) fails
#? because of a pc isomorphism instead of a perm isomorphism,
Expand Down Expand Up @@ -842,7 +842,7 @@ function( X0, iota, trans )
Print( "mor: X0 -> IX not an xmod morphism!\n" );
fi;
if IsPermGroup( IX ) then
sdpr := SmallerDegreePermutationRepresentation2DimensionalGroup( IX );
sdpr := SmallerDegreePermutationRepresentation2DimensionalGroup(IX);
if not ( sdpr = fail ) then
IX := Range( sdpr );
mor := mor * sdpr;
Expand Down
8 changes: 4 additions & 4 deletions tst/extra/induced.tst
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
##############################################################################
############################################################################
##
#W induced.tst GAP4 package `XMod' Chris Wensley
#W induced.tst GAP4 package `XMod' Chris Wensley
##
#Y Copyright (C) 2001-2023, Chris Wensley et al,
#Y School of Computer Science, Bangor University, U.K.
Expand Down Expand Up @@ -293,6 +293,6 @@ gap> StructureDescription( indXs3c );
gap> SetInfoLevel( InfoXMod, saved_infolevel_xmod );;
gap> STOP_TEST( "induced.tst", 10000 );

##############################################################################
#############################################################################
##
#E induced.tst . . . . . . . . . . . . . . . . . . . . . . . . . . ends here
#E induced.tst . . . . . . . . . . . . . . . . . . . . . . . . . ends here
4 changes: 2 additions & 2 deletions tst/manual/apps.tst
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
##############################################################################
#############################################################################
##
#W apps.tst GAP4 package `XMod' Chris Wensley
#W apps.tst GAP4 package `XMod' Chris Wensley
##
#Y Copyright (C) 2001-2022, Chris Wensley et al,
#Y School of Computer Science, Bangor University, U.K.
Expand Down
Loading

0 comments on commit ee8d4ba

Please sign in to comment.