  
  [1X2 2d-objects[0X
  
  
  [1X2.1 Constructions for crossed modules[0X
  
  A  crossed  module  mathcalX  =  (partial  :  S  ->  R ) consists of a group
  homomorphism  partial,  called  the  [13Xboundary[0m of mathcalX, with [13Xsource[0m S and
  [13Xrange[0m  R.  The  Group R acts on itself by conjugation, and on S by an action
  alpha : R -> Aut(S) such that, for all s,s_1,s_2 in S and r in R,
  
  
       {\bf XMod\ 1} ~:~ \partial(s^r) = r^{-1} (\partial s) r =
       (\partial s)^r, \qquad {\bf XMod\ 2} ~:~ s_1^{\partial s_2} =
       s_2^{-1}s_1 s_2 = {s_1}^{s_2}.
  
  
  The kernel of partial is abelian.
  
  There are a variety of constructors for crossed modules:
  
  [1X2.1-1 XMod[0m
  
  [2X> XMod( [0X[3Xargs[0X[2X ) _____________________________________________________[0Xfunction
  [2X> XModByBoundaryAndAction( [0X[3Xbdy, act[0X[2X ) _____________________________[0Xoperation
  [2X> XModByTrivialAction( [0X[3Xbdy[0X[2X ) ______________________________________[0Xoperation
  [2X> XModByNormalSubgroup( [0X[3XG, N[0X[2X ) ____________________________________[0Xoperation
  [2X> XModByCentralExtension( [0X[3Xbdy[0X[2X ) ___________________________________[0Xoperation
  [2X> XModByAutomorphismGroup( [0X[3Xgrp[0X[2X ) __________________________________[0Xoperation
  [2X> XModByInnerAutomorphismGroup( [0X[3Xgrp[0X[2X ) _____________________________[0Xoperation
  [2X> XModByGroupOfAutomorphisms( [0X[3XG, A[0X[2X ) ______________________________[0Xoperation
  [2X> XModByAbelianModule( [0X[3Xabgrp[0X[2X ) ____________________________________[0Xoperation
  [2X> DirectProduct( [0X[3XX1, X2[0X[2X ) _________________________________________[0Xoperation
  
  Here are the standard constructions which these implement:
  
  --    A  [13Xconjugation  crossed  module[0m is an inclusion of a normal subgroup S
        unlhd R, where R acts on S by conjugation.
  
  --    A  [13Xcentral  extension  crossed  module[0m  has  as  boundary a surjection
        partial  :  S  ->  R  with  central  kernel, where r in R acts on S by
        conjugation with partial^-1r.
  
  --    An  [13Xautomorphism  crossed  module[0m  has  as  range  a subgroup R of the
        automorphism  group  Aut(S) of S which contains the inner automorphism
        group of S. The boundary maps s in S to the inner automorphism of S by
        s.
  
  --    A [13Xtrivial action crossed module[0m partial : S -> R has s^r = s for all s
        in  S,  r in R, the source is abelian and the image lies in the centre
        of the range.
  
  --    A  [13Xcrossed abelian module[0m has an abelian module as source and the zero
        map as boundary.
  
  --    The  direct product mathcalX_1 x mathcalX_2 of two crossed modules has
        source  S_1 x S_2, range R_1 x R_2 and boundary partial_1 x partial_2,
        with R_1, R_2 acting trivially on S_2, S_1 respectively.
  
  [1X2.1-2 Source[0m
  
  [2X> Source( [0X[3XX0[0X[2X ) ____________________________________________________[0Xattribute
  [2X> Range( [0X[3XX0[0X[2X ) _____________________________________________________[0Xattribute
  [2X> Boundary( [0X[3XX0[0X[2X ) __________________________________________________[0Xattribute
  [2X> AutoGroup( [0X[3XX0[0X[2X ) _________________________________________________[0Xattribute
  [2X> XModAction( [0X[3XX0[0X[2X ) ________________________________________________[0Xattribute
  
  In  this implementation the attributes used in the construction of a crossed
  module [10XX0[0m are as follows.
  
  --    [10XSource(X0)[0m  and [10XRange(X0)[0m are the source S and range R of partial, the
        boundary [10XBoundary(X0)[0m;
  
  --    [10XAutoGroup(X0)[0m is a group of automorphisms of S;
  
  --    [10XXModAction(X0)[0m is a homomorphism from R to [10XAutoGroup(X0)[0m.
  
  [1X2.1-3 Size[0m
  
  [2X> Size( [0X[3XX0[0X[2X ) ______________________________________________________[0Xattribute
  [2X> Name( [0X[3XX0[0X[2X ) ______________________________________________________[0Xattribute
  
  More   familiar   attributes  are  [10XSize[0m  and  [10XName[0m,  the  latter  formed  by
  concatenating  the  names  of  the  source  and  range  (if these exist). An
  [10XEnumerator[0m  function  has not been implemented. The [10XDisplay[0m function is used
  to print details of [10X2d-objects[0m.
  
  Here  is  a simple example of an automorphism crossed module, using a cyclic
  group of size five.
  
  [4X---------------------------  Example  ----------------------------[0X
    [4X[0X
    [4Xgap> c5 := Group( (5,6,7,8,9) );;[0X
    [4Xgap> SetName( c5, "c5" );[0X
    [4Xgap> X1 := XModByAutomorphismGroup( c5 );[0X
    [4X[c5 -> PAut(c5)] [0X
    [4Xgap> Display( X1 );[0X
    [4XCrossed module [c5 -> PAut(c5)] :-[0X
    [4X: Source group c5 has generators:[0X
    [4X  [ (5,6,7,8,9) ][0X
    [4X: Range group PAut(c5) has generators:[0X
    [4X  [ (1,2,4,3) ][0X
    [4X: Boundary homomorphism maps source generators to:[0X
    [4X  [ () ][0X
    [4X: Action homomorphism maps range generators to automorphisms:[0X
    [4X  (1,2,4,3) --> { source gens --> [ (5,7,9,6,8) ] }[0X
    [4X  This automorphism generates the group of automorphisms.[0X
    [4Xgap> Size( X1 );[0X
    [4X[ 5, 4 ][0X
    [4Xgap> Print( RepresentationsOfObject(X1), "\n" );[0X
    [4X[ "IsComponentObjectRep", "IsAttributeStoringRep", "IsPreXModObj" ][0X
    [4Xgap> Print( KnownPropertiesOfObject(X1), "\n" );[0X
    [4X[ "Is2dObject", "IsPerm2dObject", "IsPreXMod", "IsXMod",[0X
    [4X  "IsTrivialAction2dObject", "IsAutomorphismGroup2dObject" ][0X
    [4Xgap> Print( KnownAttributesOfObject(X1), "\n" );[0X
    [4X[ "Name", "Size", "Range", "Source", "Boundary", "AutoGroup", "XModAction" ][0X
    [4X[0X
  [4X------------------------------------------------------------------[0X
  
  [1X2.1-4 SubXMod[0m
  
  [2X> SubXMod( [0X[3XX0, src, rng[0X[2X ) _________________________________________[0Xoperation
  [2X> IdentitySubXMod( [0X[3XX0[0X[2X ) ___________________________________________[0Xattribute
  [2X> NormalSubXMods( [0X[3XX0[0X[2X ) ____________________________________________[0Xattribute
  
  With  the  standard  crossed  module  constructors  listed above as building
  blocks,   sub-crossed  modules,  normal  sub-crossed  modules  mathcalN  lhd
  mathcalX,  and  also  quotients  mathcalX/mathcalN  may  be  constructed.  A
  sub-crossed  module  mathcalS  =  (delta  :  N -> M) is [13Xnormal[0m in mathcalX =
  (partial : S -> R) if
  
  --    N,M are normal subgroups of S,R respectively,
  
  --    delta is the restriction of partial,
  
  --    n^r in N for all n in N,~r in R,
  
  --    s^-1s^m in N for all m in M,~s in S.
  
  These  conditions ensure that M ltimes N is normal in the semidirect product
  R ltimes S.
  
  
  [1X2.2 Pre-crossed modules[0X
  
  [1X2.2-1 PreXModByBoundaryAndAction[0m
  
  [2X> PreXModByBoundaryAndAction( [0X[3Xbdy, act[0X[2X ) __________________________[0Xoperation
  [2X> SubPreXMod( [0X[3XX0, src, rng[0X[2X ) ______________________________________[0Xoperation
  
  When  axiom  {\bf  XMod\ 2} is [13Xnot[0m satisfied, the corresponding structure is
  known as a [13Xpre-crossed module[0m.
  
  [4X---------------------------  Example  ----------------------------[0X
    [4X[0X
    [4Xgap> c := (11,12,13,14,15,16,17,18);;  d := (12,18)(13,17)(14,16);;[0X
    [4Xgap> d16 := Group( c, d );;[0X
    [4Xgap> sk4 := Subgroup( d16, [ c^4, d ] );;[0X
    [4Xgap> SetName( d16, "d16" );  SetName( sk4, "sk4" );[0X
    [4Xgap> bdy16 := GroupHomomorphismByImages( d16, sk4, [c,d], [c^4,d] );;[0X
    [4Xgap> h1 := GroupHomomorphismByImages( d16, d16, [c,d], [c^5,d] );;[0X
    [4Xgap> h2 := GroupHomomorphismByImages( d16, d16, [c,d], [c,c^4*d] );;[0X
    [4Xgap> aut16 := Group( [ h1, h2 ] );;[0X
    [4Xgap> act16 := GroupHomomorphismByImages( sk4, aut16, [c^4,d], [h1,h2] );;[0X
    [4Xgap> P16 := PreXModByBoundaryAndAction( bdy16 );[0X
    [4X[d16->sk4][0X
    [4X[0X
  [4X------------------------------------------------------------------[0X
  
  [1X2.2-2 PeifferSubgroup[0m
  
  [2X> PeifferSubgroup( [0X[3XX0[0X[2X ) ___________________________________________[0Xattribute
  [2X> XModByPeifferQuotient( [0X[3Xprexmod[0X[2X ) ________________________________[0Xattribute
  
  The  [13XPeiffer  subgroup[0m  of  a  pre-crossed  module P of S is the subgroup of
  ker(partial) generated by [13XPeiffer commutators[0m
  
  
       \langle s_1,s_2 \rangle \quad=\quad (s_1^{-1})^{\partial
       s_2}~s_2^{-1}~s_1~s_2~.
  
  
  Then  mathcalP  =  (0  :  P  -> {1_R}) is a normal sub-pre-crossed module of
  mathcalX and mathcalX/mathcalP = (partial : S/P -> R) is a crossed module.
  
  In the following example the Peiffer subgroup is cyclic of size 4.
  
  [4X---------------------------  Example  ----------------------------[0X
    [4X[0X
    [4Xgap> P := PeifferSubgroup( P16 );[0X
    [4XGroup( [ (11,15)(12,16)(13,17)(14,18), (11,17,15,13)(12,18,16,14) ] )[0X
    [4Xgap> X16 := XModByPeifferQuotient( P16 );[0X
    [4X[d16/P->sk4][0X
    [4Xgap> Display( X16 );[0X
    [4XCrossed module [d16/P->sk4] :-[0X
    [4X: Source group has generators:[0X
    [4X  [ f1, f2 ][0X
    [4X: Range group has generators:[0X
    [4X  [ (11,15)(12,16)(13,17)(14,18), (12,18)(13,17)(14,16) ][0X
    [4X: Boundary homomorphism maps source generators to:[0X
    [4X  [ (12,18)(13,17)(14,16), (11,15)(12,16)(13,17)(14,18) ][0X
    [4X  The automorphism group is trivial[0X
    [4Xgap> iso16 := IsomorphismPermGroup( Source( X16 ) );;[0X
    [4Xgap> S16 := Image( iso16 );[0X
    [4XGroup([ (1,3)(2,4), (1,2)(3,4) ])   [0X
    [4X[0X
  [4X------------------------------------------------------------------[0X
  
  [1X2.2-3 IsPermXMod[0m
  
  [2X> IsPermXMod( [0X[3XX0[0X[2X ) _________________________________________________[0Xproperty
  [2X> IsPcPreXMod( [0X[3XX0[0X[2X ) ________________________________________________[0Xproperty
  
  When  both  source  and  range  groups  are  of the same type, corresponding
  properties are assigned to the crossed module.
  
  
  [1X2.3 Cat1-groups and pre-cat1-groups[0X
  
  [1X2.3-1 Source[0m
  
  [2X> Source( [0X[3XC[0X[2X ) _____________________________________________________[0Xattribute
  [2X> Range( [0X[3XC[0X[2X ) ______________________________________________________[0Xattribute
  [2X> TailMap( [0X[3XC[0X[2X ) ____________________________________________________[0Xattribute
  [2X> HeadMap( [0X[3XC[0X[2X ) ____________________________________________________[0Xattribute
  [2X> RangeEmbedding( [0X[3XC[0X[2X ) _____________________________________________[0Xattribute
  [2X> KernelEmbedding( [0X[3XC[0X[2X ) ____________________________________________[0Xattribute
  [2X> Boundary( [0X[3XC[0X[2X ) ___________________________________________________[0Xattribute
  [2X> Name( [0X[3XC[0X[2X ) _______________________________________________________[0Xattribute
  [2X> Size( [0X[3XC[0X[2X ) _______________________________________________________[0Xattribute
  
  These are the attributes of a cat1-group mathcalC in this implementation.
  
  In  [Lod82],  Loday  reformulated  the  notion  of  a  crossed  module  as a
  cat1-group,  namely  a  group  G  with  a pair of homomorphisms t,h : G -> G
  having a common image R and satisfying certain axioms. We find it convenient
  to  define  a cat1-group mathcalC = (e;t,h : G -> R ) as having source group
  G,  range group R, and three homomorphisms: two surjections t,h : G -> R and
  an embedding e : R -> G satisfying:
  
  
       {\bf Cat\ 1} ~:~ te = he = {\rm id}_R, \qquad {\bf Cat\ 2} ~:~
       [\ker t, \ker h] = \{ 1_G \}.
  
  
  It follows that teh = h, het = t, tet = t, heh = h.
  
  The  maps  t,h are often referred to as the [13Xsource[0m and [13Xtarget[0m, but we choose
  to  call  them the [13Xtail[0m and [13Xhead[0m of mathcalC, because [13Xsource[0m is the [5XGAP[0m term
  for the domain of a function. The [10XRangeEmbedding[0m is the embedding of [10XR[0m in [10XG[0m,
  the  [10XKernelEmbedding[0m  is  the  inclusion  of  the  kernel of [10Xt[0m in [10XG[0m, and the
  [10XBoundary[0m is the restriction of [10Xh[0m to the kernel of [10Xt[0m.
  
  [1X2.3-2 Cat1[0m
  
  [2X> Cat1( [0X[3Xargs[0X[2X ) ____________________________________________________[0Xattribute
  [2X> PreCat1ByTailHeadEmbedding( [0X[3Xt, h, e[0X[2X ) ___________________________[0Xattribute
  [2X> PreCat1ByEndomorphisms( [0X[3Xt, h[0X[2X ) __________________________________[0Xattribute
  [2X> PreCat1ByNormalSubgroup( [0X[3XG, N[0X[2X ) _________________________________[0Xattribute
  [2X> Cat1ByPeifferQuotient( [0X[3XP[0X[2X ) ______________________________________[0Xattribute
  [2X> Reverse( [0X[3XC0[0X[2X ) ___________________________________________________[0Xattribute
  
  These are some of the constructors for pre-cat1-groups and cat1-groups.
  
  The following listing shows an example of a cat1-group of pc-groups:
  
  [4X---------------------------  Example  ----------------------------[0X
    [4X[0X
    [4Xgap> s3 := SymmetricGroup(IsPcGroup,3);;   [0X
    [4Xgap> gens3 := GeneratorsOfGroup(s3);[0X
    [4X[ f1, f2 ][0X
    [4Xgap> pc4 := CyclicGroup(4);; [0X
    [4Xgap> SetName(s3,"s3");  SetName( pc4, "pc4" );[0X
    [4Xgap> s3c4 := DirectProduct( s3, pc4 );; [0X
    [4Xgap> SetName( s3c4, "s3c4" );  [0X
    [4Xgap> gens3c4 := GeneratorsOfGroup( s3c4 );[0X
    [4X[ f1, f2, f3, f4 ][0X
    [4Xgap> a := gens3[1];;  b := gens3[2];;  one := One(s3);;[0X
    [4Xgap> t2 := GroupHomomorphismByImages( s3c4, s3, gens3c4, [a,b,one,one] );[0X
    [4X[ f1, f2, f3, f4 ] -> [ f1, f2, &lt;identity&gt; of ..., &lt;identity&gt; of ... ][0X
    [4Xgap> e2 := Embedding( s3c4, 1 );[0X
    [4X[ f1, f2 ] -> [ f1, f2 ][0X
    [4Xgap> C2 := Cat1( t2, t2, e2 );[0X
    [4X[s3c4=>s3][0X
    [4Xgap> Display( C2 );[0X
    [4XCat1-group [s3c4=>s3] :-[0X
    [4X: source group has generators:[0X
    [4X  [ f1, f2, f3, f4 ][0X
    [4X:  range group has generators:[0X
    [4X  [ f1, f2 ][0X
    [4X: tail homomorphism maps source generators to:[0X
    [4X  [ f1, f2, &lt;identity&gt; of ..., &lt;identity&gt; of ... ][0X
    [4X: head homomorphism maps source generators to:[0X
    [4X  [ f1, f2, &lt;identity&gt; of ..., &lt;identity&gt; of ... ][0X
    [4X: range embedding maps range generators to:[0X
    [4X  [ f1, f2 ][0X
    [4X: kernel has generators:[0X
    [4X  [ f3, f4 ][0X
    [4X: boundary homomorphism maps generators of kernel to:[0X
    [4X  [ &lt;identity&gt; of ..., &lt;identity&gt; of ... ][0X
    [4X: kernel embedding maps generators of kernel to:[0X
    [4X  [ f3, f4 ][0X
    [4Xgap> IsPcCat1( C2 );[0X
    [4Xtrue[0X
    [4Xgap> Size( C2 );[0X
    [4X[ 24, 6 ][0X
    [4X[0X
  [4X------------------------------------------------------------------[0X
  
  [1X2.3-3 Cat1OfXMod[0m
  
  [2X> Cat1OfXMod( [0X[3XX0[0X[2X ) ________________________________________________[0Xattribute
  [2X> XModOfCat1( [0X[3XC0[0X[2X ) ________________________________________________[0Xattribute
  [2X> PreCat1OfPreXMod( [0X[3XP0[0X[2X ) __________________________________________[0Xattribute
  [2X> PreXModOfPreCat1( [0X[3XP0[0X[2X ) __________________________________________[0Xattribute
  
  The   category   of  crossed  modules  is  equivalent  to  the  category  of
  cat1-groups,  and the functors between these two categories may be described
  as  follows.  Starting with the crossed module mathcalX = (partial : S -> R)
  the  group  G  is defined as the semidirect product G = R ltimes S using the
  action from mathcalX, with multiplication rule
  
  
       (r_1,s_1)(r_2,s_2) ~=~ (r_1r_2,{s_1}^{r_2}s_2).
  
  
  The structural morphisms are given by
  
  
       t(r,s) = r, \quad h(r,s) = r (\partial s), \quad er = (r,1).
  
  
  On  the  other hand, starting with a cat1-group mathcalC = (e;t,h : G -> R),
  we  define S = ker t, the range R remains unchanged, and partial = h|_S. The
  action of R on S is conjugation in G via the embedding of R in G.
  
  [4X---------------------------  Example  ----------------------------[0X
    [4X[0X
    [4Xgap> SetName( Kernel(t2), "ker(t2)" );;[0X
    [4Xgap> X2 := XModOfCat1( C2 );[0X
    [4X[Group( [ f3, f4 ] )->s3][0X
    [4Xgap> Display( X2 );[0X
    [4XCrossed module [ker(t2)->s3] :-[0X
    [4X: Source group has generators:[0X
    [4X  [ f3, f4 ][0X
    [4X: Range group s3 has generators:[0X
    [4X  [ f1, f2 ][0X
    [4X: Boundary homomorphism maps source generators to:[0X
    [4X  [ &lt;identity&gt; of ..., &lt;identity&gt; of ... ][0X
    [4X  The automorphism group is trivial[0X
    [4X: associated cat1-group is [s3c4=>s3][0X
    [4X[0X
  [4X------------------------------------------------------------------[0X
  
  
  [1X2.4 Selection of a small cat1-group[0X
  
  The  [10XCat1[0m function may also be used to select a cat1-group from a data file.
  All  cat1-structures on groups of size up to 47 are stored in a list in file
  [11Xcat1data.g[0m.     Global    variables    [10XCAT1_LIST_MAX_SIZE    :=    47[0m    and
  [10XCAT1_LIST_CLASS_SIZES[0m  are  also  stored. The [5XXMod[0m~2 version of the database
  orders the groups of size up to 47 according to the [5XGAP[0m~4 numbering of small
  groups.  The data is read into the list [10XCAT1_LIST[0m only when this function is
  called.
  
  [1X2.4-1 Cat1Select[0m
  
  [2X> Cat1Select( [0X[3Xsize, gpnum, num[0X[2X ) __________________________________[0Xattribute
  
  This  function  may  be  used  in three ways. [10XCat1Select( size )[0m returns the
  names  of the groups with this size. [10XCat1Select( size, gpnum )[0m prints a list
  of cat1-structures for this chosen group. [10XCat1Select( size, gpnum, num )[0m (or
  just [10XCat1( size, gpnum, num )[0m) returns the chosen cat1-group.
  
  The  example  below  is  the  first  case in which t <> h and the associated
  conjugation crossed module is given by the normal subgroup [10Xc3[0m of [10Xs3[0m.
  
  [4X---------------------------  Example  ----------------------------[0X
    [4X[0X
    [4Xgap> L18 := Cat1Select( 18 );[0X
    [4X#I  Loading cat1-group data into CAT1_LIST[0X
    [4XUsage:  Cat1( size, gpnum, num )[0X
    [4X[ "d18", "c18", "s3c3", "c3^2|Xc2", "c6c3" ][0X
    [4Xgap> Cat1Select( 18, 4 );[0X
    [4XThere are 4 cat1-structures for the group c3^2|Xc2.[0X
    [4X[ [range gens], source & range names, [tail genimages], [head genimages] ] :-[0X
    [4X[ [ (1,2,3), (4,5,6), (2,3)(5,6) ],  tail = head = identity mapping ][0X
    [4X[ [ (2,3)(5,6) ], "c3^2", "c2", [ (), (), (2,3)(5,6) ],[0X
    [4X  [ (), (), (2,3)(5,6) ] ][0X
    [4X[ [ (4,5,6), (2,3)(5,6) ], "c3", "s3", [ (), (4,5,6), (2,3)(5,6) ],[0X
    [4X  [ (), (4,5,6), (2,3)(5,6) ] ][0X
    [4X[ [ (4,5,6), (2,3)(5,6) ], "c3", "s3", [ (4,5,6), (4,5,6), (2,3)(5,6) ],[0X
    [4X  [ (), (4,5,6), (2,3)(5,6) ] ][0X
    [4XUsage:  Cat1( size, gpnum, num );[0X
    [4XGroup has generators [ (1,2,3), (4,5,6), (2,3)(5,6) ][0X
    [4X4[0X
    [4Xgap> C4 := Cat1( 18, 4, 4 );[0X
    [4X[c3^2|Xc2=>s3][0X
    [4Xgap> Display( C4 );[0X
    [4XCat1-group [c3^2|Xc2=>s3] :-[0X
    [4X: source group has generators:[0X
    [4X  [ (1,2,3), (4,5,6), (2,3)(5,6) ][0X
    [4X:  range group has generators:[0X
    [4X  [ (4,5,6), (4,5,6), (2,3)(5,6) ][0X
    [4X: tail homomorphism maps source generators to:[0X
    [4X  [ (4,5,6), (4,5,6), (2,3)(5,6) ][0X
    [4X: head homomorphism maps source generators to:[0X
    [4X  [ (), (4,5,6), (2,3)(5,6) ][0X
    [4X: range embedding maps range generators to:[0X
    [4X  [ (4,5,6), (4,5,6), (2,3)(5,6) ][0X
    [4X: kernel has generators:[0X
    [4X  [ ( 1, 2, 3)( 4, 6, 5) ][0X
    [4X: boundary homomorphism maps generators of kernel to:[0X
    [4X  [ (4,6,5) ][0X
    [4X: kernel embedding maps generators of kernel to:[0X
    [4X  [ (1,2,3)(4,6,5) ][0X
    [4Xgap> XC4 := XModOfCat1( C4 );[0X
    [4X[Group( [ ( 1, 2, 3)( 4, 6, 5) ] )->s3][0X
    [4X[0X
  [4X------------------------------------------------------------------[0X
  
