10 Utility functions By a utility function we mean a GAP function which is  needed by other functions in this package,  not (as far as we know) provided by the standard GAP library,  more suitable for inclusion in the main library than in this package. Sections on Printing Lists and Distinct and Common Representatives were moved to the Utils package with version 2.56. 10.1 Inclusion and Restriction Mappings These functions have been moved to the gpd package, but are still documented here. 10.1-1 InclusionMappingGroups InclusionMappingGroups( G, H )  operation MappingToOne( G, H )  operation This set of utilities concerns mappings. The map incd8 is the inclusion of d8 in d16 used in Section 3.4. MappingToOne(G,H) maps the whole of G to the identity element in H.  Example   gap> Print( incd8, "\n" ); [ (11,13,15,17)(12,14,16,18), (11,18)(12,17)(13,16)(14,15) ] -> [ (11,13,15,17)(12,14,16,18), (11,18)(12,17)(13,16)(14,15) ] gap> imd8 := Image( incd8 );; gap> MappingToOne( c4, imd8 ); [ (11,13,15,17)(12,14,16,18) ] -> [ () ]   10.1-2 InnerAutomorphismsByNormalSubgroup InnerAutomorphismsByNormalSubgroup( G, N )  operation IsGroupOfAutomorphisms( A )  property Inner automorphisms of a group G by the elements of a normal subgroup N are calculated with the first of these functions, usually with G = N.  Example   gap> autd8 := AutomorphismGroup( d8 );; gap> innd8 := InnerAutomorphismsByNormalSubgroup( d8, d8 );; gap> GeneratorsOfGroup( innd8 ); [ ^(1,2,3,4), ^(1,3) ] gap> IsGroupOfAutomorphisms( innd8 ); true   10.2 Abelian Modules 10.2-1 AbelianModuleObject AbelianModuleObject( grp, act )  operation IsAbelianModule( obj )  property AbelianModuleGroup( obj )  attribute AbelianModuleAction( obj )  attribute An abelian module is an abelian group together with a group action. These are used by the crossed module constructor XModByAbelianModule. The resulting Xabmod is isomorphic to the output from XModByAutomorphismGroup( k4 );.  Example   gap> x := (6,7)(8,9);; y := (6,8)(7,9);; z := (6,9)(7,8);; gap> k4a := Group( x, y );; SetName( k4a, "k4a" ); gap> gens3a := [ (1,2), (2,3) ];; gap> s3a := Group( gens3a );; SetName( s3a, "s3a" ); gap> alpha := GroupHomomorphismByImages( k4a, k4a, [x,y], [y,x] );; gap> beta := GroupHomomorphismByImages( k4a, k4a, [x,y], [x,z] );; gap> auta := Group( alpha, beta );; gap> acta := GroupHomomorphismByImages( s3a, auta, gens3a, [alpha,beta] );; gap> abmod := AbelianModuleObject( k4a, acta );; gap> Xabmod := XModByAbelianModule( abmod ); [k4a->s3a] gap> Display( Xabmod );  Crossed module [k4a->s3a] :-  : Source group k4a has generators:  [ (6,7)(8,9), (6,8)(7,9) ] : Range group s3a has generators:  [ (1,2), (2,3) ] : Boundary homomorphism maps source generators to:  [ (), () ] : Action homomorphism maps range generators to automorphisms:  (1,2) --> { source gens --> [ (6,8)(7,9), (6,7)(8,9) ] }  (2,3) --> { source gens --> [ (6,7)(8,9), (6,9)(7,8) ] }  These 2 automorphisms generate the group of automorphisms.