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

implemented (Inner)ActorCat1Group #148

Merged
merged 2 commits into from
Dec 17, 2024
Merged
Show file tree
Hide file tree
Changes from all 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
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
Loading