A homomorphism m from a groupoid G to a groupoid H consists of a map from the objects of G to those of H together with a map from the elements of G to those of H which is compatible with tail and head and which preserves multiplication:
m(g1 : o1 \to o2)*m(g2 : o2 \to o3) ~=~ m(g1*g2 : o1 \to o3).
Note that when a homomorphism is not injective on objects, the image of the source need not be a subgroupoid of the range. The simplest example of this is given by the homomorphism from the two-object groupoid with trivial group to the free group < a > on one generator, when the image is [1,a,a^-1].
> GroupoidHomomorphismFromSinglePiece( src, rng, hom, imobs, imrays ) | ( operation ) |
> GroupoidHomomorphismByGroupHom( src, rng, hom ) | ( operation ) |
> GroupoidHomomorphism( args ) | ( function ) |
> InclusionMappingGroupoids( gpd, sgpd ) | ( operation ) |
> RootObjectHomomorphism( gpdhom ) | ( attribute ) |
As usual, there are a variety of homomorphism operations. The basic construction is a homomorphism G -> H with G the direct product of a group and a complete graph. The homomorphism has attributes Source, Range, ImagesOfObjects, PieceImages and RootObjectHomomorphism. The input data consists of the source; the range; and
a homomorphism hom from the root group of G to that of H;
a list imobs of the images of the objects of G;
a list imrays of the images of the rays of G.
gap> gend12 := [ (15,16,17,18,19,20), (15,20)(16,19)(17,18) ];;
gap> d12 := Group( gend12 );;
gap> Gd12 := Groupoid( d12, [-37,-36,-35,-34] );;
gap> SetName( d12, "d12" );
gap> SetName( Gd12, "Gd12" );
gap> s3 := Subgroup( d12, [ (15,17,19)(16,18,20), (15,20)(16,19)(17,18) ] );;
gap> Gs3 := SubgroupoidByPieces( Gd12, [ [ s3, [-36,-35,-34] ] ] );;
gap> SetName( s3, "s3" );
gap> SetName( Gs3, "Gs3" );
gap> gend8 := GeneratorsOfGroup( d8 );;
gap> imhd8 := [ ( ), (15,20)(16,19)(17,18) ];;
gap> hd8 := GroupHomomorphismByImages( d8, s3, gend8, imhd8 );;
gap> homd8 := GroupoidHomomorphismByGroupHom( Gd8, Gs3, hd8 );
magma with objects homomorphism : Gd8 -> Gs3
[ [ GroupHomomorphismByImages( d8, s3, [ (1,2,3,4), (1,3) ],
[ (), (15,20)(16,19)(17,18) ] ), [ -36, -35, -34 ], [ (), (), () ] ] ]
gap> e2; ImageElm( homd8, e2 );
[(1,3) : -8 -> -7]
[(15,20)(16,19)(17,18) : -35 -> -34]
gap> incGs3 := InclusionMappingGroupoids( Gd12, Gs3 );;
gap> ihomd8 := homd8 * incGs3;;
gap> IsBijectiveWithObjects( ihomd8 );
false
gap> Display( ihomd8 );
groupoid mapping: [ Gd8 ] -> [ Gd12 ]
root homomorphism: [ [ (1,2,3,4), (1,3) ], [ (), (15,20)(16,19)(17,18) ] ]
images of objects: [ -36, -35, -34 ]
images of rays: [ (), (), () ]
|
> HomomorphismToSinglePiece( src, rng, pieces ) | ( operation ) |
When G is made up of two or more pieces, all of which get mapped to a connected groupoid, we have a homomorphism to a single piece. The third input parameter in this case is a list of the PieceImages of the individual homomorphisms from the single pieces. See section 3.1 for the corresponding operation on homomorphisms of magmas with objects.
In the following example the source has three pieces, and one of the component homomorphisms is an IdentityMapping .
gap> hc6 := GroupHomomorphismByImages( c6, s3,
gap> [(5,6,7)(8,9)], [(15,16)(17,20)(18,19)] );;
gap> Fs3 := FullSubgroupoid( Gs3, [ -35 ] );;
gap> SetName( Fs3, "Fs3" );
gap> homc6 := GroupoidHomomorphism( Gc6, Fs3, hc6 );;
gap> incFs3 := InclusionMappingGroupoids( Gs3, Fs3 );;
gap> ihomc6 := homc6 * incFs3;
magma with objects homomorphism : Gc6 -> Gs3
[ [ GroupHomomorphismByImages( c6, s3, [ (5,6,7)(8,9) ],
[ (15,16)(17,20)(18,19) ] ), [ -35 ], [ () ] ] ]
gap> idGs3 := IdentityMapping( Gs3 );;
gap> V3 := ReplaceOnePieceInUnion( U3, Gs4, Gs3 );
groupoid with 3 pieces:
1: Gs3
2: Gd8
3: Gc6
gap> images3 := [ PieceImages( idGs3 )[1],
gap> PieceImages( homd8 )[1],
gap> PieceImages( ihomc6 )[1] ];;
gap> homV3 := HomomorphismToSinglePiece( V3, Gs3, images3 );;
gap> Display( homV3 );
homomorphism to single piece magma with pieces:
(1): [ Gs3 ] -> [ Gs3 ]
magma mapping: [ [ (15,17,19)(16,18,20), (15,20)(16,19)(17,18) ],
[ (15,17,19)(16,18,20), (15,20)(16,19)(17,18) ] ]
object map: [ -36, -35, -34 ] -> [ -36, -35, -34 ]
(2): [ Gd8 ] -> [ Gs3 ]
magma mapping: [ [ (1,2,3,4), (1,3) ], [ (), (15,20)(16,19)(17,18) ] ]
object map: [ -9, -8, -7 ] -> [ -36, -35, -34 ]
(3): [ Gc6 ] -> [ Gs3 ]
magma mapping: [ [ (5,6,7)(8,9) ], [ (15,16)(17,20)(18,19) ] ]
object map: [ -6 ] -> [ -35 ]
|
> HomomorphismByUnion( src, rng, homs ) | ( operation ) |
As in section 3.3, when the range H has more than one connected component, a homomorphism is a union of homomorphisms, one for each piece.
gap> isoq8 := IsomorphismNewObjects( Gq8, [-38,-37] );
magma with objects homomorphism :
[ [ IdentityMapping( q8 ), [ -38, -37 ],
[ <identity> of ..., <identity> of ... ] ] ]
gap> Gq8b := Range( isoq8 );;
gap> SetName( Gq8b, "Gq8b" );
gap> V4 := UnionOfPieces( [ V3, Gq8 ] );
groupoid with 4 pieces:
1: Gs3
2: Gq8
3: Gd8
4: Gc6
gap> SetName( V4, "V4" );
gap> Vs3q8b := UnionOfPieces( [ Gs3, Gq8b ] );
gap> SetName( Vs3q8b, "Vs3q8b" );
gap> hom4 := HomomorphismByUnion( V4, Vs3q8b, [ homV3, isoq8 ] );;
gap> PiecesOfMapping(hom4);
[ magma with objects homomorphism : Gq8 -> Gq8b
[ [ IdentityMapping( q8 ), [ -38, -37 ],
[ <identity> of ..., <identity> of ... ] ] ]
, magma with objects homomorphism :
[ [ IdentityMapping( s3 ), [ -36, -35, -34 ], [ (), (), () ] ],
[ GroupHomomorphismByImages( d8, s3, [ (1,2,3,4), (1,3) ],
[ (), (15,20)(16,19)(17,18) ] ), [ -36, -35, -34 ],
[ (), (), () ] ],
[ GroupHomomorphismByImages( c6, s3, [ (5,6,7)(8,9) ],
[ (15,16)(17,20)(18,19) ] ), [ -35 ], [ () ] ] ]
]
|
> GroupoidAutomorphismByObjectPerm( gpd, imobs ) | ( operation ) |
> GroupoidAutomorphismByGroupAuto( gpd, gpauto ) | ( operation ) |
> GroupoidAutomorphismByRayImages( gpd, imrays ) | ( operation ) |
We describe here automorphisms a of a groupoid G which is the direct product of a group and a complete graph. The group of automorphisms is generated by three types of automorphism:
a permutation of the n objects;
an automorphism of the root group g;
a choice of image for each ray: a(1 : o_1 -> o_i) = (g_i : o_1 -> o_i) for i ne 1.
gap> a4 := Subgroup( s4, [(1,2,3),(2,3,4)] );; gap> SetName( a4, "a4" ); gap> gensa4 := GeneratorsOfGroup( a4 );; gap> Ga4 := SubgroupoidByPieces( Gs4, [ [a4, [-15,-13,-11]] ] ); single piece groupoid: < a4, [ -15, -13, -11 ] > gap> SetName( Ga4, "Ga4" ); gap> aut1 := GroupoidAutomorphismByObjectPerm( Ga4, [-13,-11,-15] );; gap> Display( aut1 ); groupoid mapping: [ Ga4 ] -> [ Ga4 ] root homomorphism: [ [ (1,2,3), (2,3,4) ], [ (1,2,3), (2,3,4) ] ] images of objects: [ -13, -11, -15 ] images of rays: [ (), (), () ] gap> h2 := GroupHomomorphismByImages( a4, a4, gensa4, [(2,3,4), (1,3,4)] );; gap> aut2 := GroupoidAutomorphismByGroupAuto( Ga4, h2 );; gap> Display( aut2 ); groupoid mapping: [ Ga4 ] -> [ Ga4 ] root homomorphism: [ [ (1,2,3), (2,3,4) ], [ (2,3,4), (1,3,4) ] ] images of objects: [ -15, -13, -11 ] images of rays: [ (), (), () ] gap> im3 := [(), (1,3,2), (2,4,3)];; gap> aut3 := GroupoidAutomorphismByRayImages( Ga4, im3 );; gap> Display( aut3 ); groupoid mapping: [ Ga4 ] -> [ Ga4 ] root homomorphism: [ [ (1,2,3), (2,3,4) ], [ (1,2,3), (2,3,4) ] ] images of objects: [ -15, -13, -11 ] images of rays: [ (), (1,3,2), (2,4,3) ] gap> aut123 := aut1*aut2*aut3;; gap> Display( aut123 ); groupoid mapping: [ Ga4 ] -> [ Ga4 ] root homomorphism: [ [ (1,2,3), (2,3,4) ], [ (2,3,4), (1,3,4) ] ] images of objects: [ -13, -11, -15 ] images of rays: [ (), (1,4,3), (1,2,3) ] gap> inv123 := InverseGeneralMapping( aut123 );; gap> Display( inv123 ); groupoid mapping: [ Ga4 ] -> [ Ga4 ] root homomorphism: [ [ (2,3,4), (1,3,4) ], [ (1,2,3), (2,3,4) ] ] images of objects: [ -11, -15, -13 ] images of rays: [ (), (1,2,4), (1,3,4) ] gap> id123 := aut123 * inv123;; gap> id123 = IdentityMapping( Ga4 ); true |
The AutomorphismGroup of G is isomorphic to the quotient of S_n x A x g^n by a subgroup isomorphic to g, where A is the automorphism group of g and S_n is the symmetric group on the n objects. This is one of the main topics in [AW10].
The current implementation is experimental, and the nice monomorphisms produced does not appear to be correct, as shown by the final tests below.
gap> ## attempt to create automorphism group for Ga4
gap> AGa4 := AutomorphismGroup( Ga4 );
<group with 10 generators>
gap> NGa4 := NiceObject( AGa4 );
Group([ f6, f3, f11*f12, f12, f2, f1, f4*f9, f4^2, f5*f9*f10*f11*f12, f5^2 ])
gap> MGa4 := NiceMonomorphism( AGa4 );;
gap> Print( "AGa4 has size ", Size( AGa4 ), "\n" );
AGa4 has size 20736
gap> SetName( AGa4, "AGa4" );
gap> SetName( NGa4, "NGa4" );
gap> Print( MGa4, "\n" );
GroupHomomorphismByImages( AGa4, Group( [ f1, f2, f3, f4, f5, f6, f7, f8, f9,
f10, f11, f12 ] ), [ magma with objects homomorphism : Ga4 -> Ga4
[ [ InnerAutomorphism( a4, (2,4,3) ), [ -15, -13, -11 ], [ (), (), () ] ]
]
, magma with objects homomorphism : Ga4 -> Ga4
[ [ ConjugatorAutomorphism( a4, (3,4) ), [ -15, -13, -11 ],
[ (), (), () ] ] ]
, magma with objects homomorphism : Ga4 -> Ga4
[ [ InnerAutomorphism( a4, (1,2)(3,4) ), [ -15, -13, -11 ],
[ (), (), () ] ] ]
, magma with objects homomorphism : Ga4 -> Ga4
[ [ InnerAutomorphism( a4, (1,4)(2,3) ), [ -15, -13, -11 ],
[ (), (), () ] ] ]
, magma with objects homomorphism : Ga4 -> Ga4
[ [ GroupHomomorphismByImages( a4, a4, [ (1,2,3), (2,3,4) ],
[ (1,2,3), (2,3,4) ] ), [ -13, -11, -15 ], [ (), (), () ] ] ]
, magma with objects homomorphism : Ga4 -> Ga4
[ [ GroupHomomorphismByImages( a4, a4, [ (1,2,3), (2,3,4) ],
[ (1,2,3), (2,3,4) ] ), [ -13, -15, -11 ], [ (), (), () ] ] ]
, magma with objects homomorphism : Ga4 -> Ga4
[ [ IdentityMapping( a4 ), [ -15, -13, -11 ], [ (), (1,2,3), () ] ] ]
, magma with objects homomorphism : Ga4 -> Ga4
[ [ IdentityMapping( a4 ), [ -15, -13, -11 ], [ (), (2,3,4), () ] ] ]
, magma with objects homomorphism : Ga4 -> Ga4
[ [ IdentityMapping( a4 ), [ -15, -13, -11 ], [ (), (), (1,2,3) ] ] ]
, magma with objects homomorphism : Ga4 -> Ga4
[ [ IdentityMapping( a4 ), [ -15, -13, -11 ], [ (), (), (2,3,4) ] ] ]
], [ f6, f3, f11*f12, f12, f2, f1, f4*f9, f4^2, f5*f9*f10*f11*f12, f5^2
] )
gap> ## Now do some tests!
gap> mgi := MappingGeneratorsImages( MGa4 );;
gap> autgen := mgi[1];;
gap> pcgen := mgi[2];;
gap> ngen := Length( autgen );;
gap> for i in [1..ngen] do
gap> ai := Order( autgen[i] );
gap> pi := Order( pcgen[i] );
gap> Print( ai," = ",pi," ? ", ai=pi, "\n" );
gap> od;
3 = 3 ? true
2 = 2 ? true
2 = 2 ? true
2 = 2 ? true
3 = 3 ? true
2 = 2 ? true
1 = 3 ? false
1 = 3 ? false
1 = 3 ? false
1 = 3 ? false
|
generated by GAPDoc2HTML