1.24 About Mappings and Homomorphisms

A mapping is an object which maps each element of its source to a value in its range. Source and range can be arbitrary sets of elements. But in most applications the source and range are structured sets and the mapping, in such applications called homomorphism, is compatible with this structure.

In the last sections you have already encountered examples of homomorphisms, namely natural homomorphisms of groups onto their factor groups and operation homomorphisms of groups into symmetric groups.

Finite fields also bear a structure and homomorphisms between fields are always bijections. The Galois group of a finite field is generated by the Frobenius automorphism. It is very easy to construct.

    gap> f := FrobeniusAutomorphism( GF(81) );
    FrobeniusAutomorphism( GF(3^4) )
    gap> Image( f, Z(3^4) );
    Z(3^4)^3
    gap> A := Group( f );
    Group( FrobeniusAutomorphism( GF(3^4) ) )
    gap> Size( A );
    4
    gap> IsCyclic( A );
    true
    gap> Order( Mappings, f );
    4
    gap> Kernel( f );
    [ 0*Z(3) ] 

For finite fields and cyclotomic fields the function GaloisGroup is an easy way to construct the Galois group.

    gap> GaloisGroup( GF(81) );
    Group( FrobeniusAutomorphism( GF(3^4) ) )
    gap> Size( last );
    4
    gap> GaloisGroup( CyclotomicField( 18 ) );
    Group( NFAutomorphism( CF(9) , 2 ) )
    gap> Size( last );
    6 

Not all group homomorphisms are bijections of course, natural homomorphisms do have a kernel in most cases and operation homomorphisms need neither be surjective nor injective.

    gap> s4 := Group( (1,2,3,4), (1,2) );
    Group( (1,2,3,4), (1,2) )
    gap> s4.name := "s4";;
    gap> v4 := Subgroup( s4, [ (1,2)(3,4), (1,3)(2,4) ] );
    Subgroup( s4, [ (1,2)(3,4), (1,3)(2,4) ] )
    gap> v4.name := "v4";;
    gap> s3 := s4 / v4;
    (s4 / v4)
    gap> f := NaturalHomomorphism( s4, s3 );
    NaturalHomomorphism( s4, (s4 / v4) )
    gap> IsHomomorphism( f );
    true
    gap> IsEpimorphism( f );
    true
    gap> Image( f );
    (s4 / v4)
    gap> IsMonomorphism( f );
    false
    gap> Kernel( f );
    v4 

The image of a group homomorphism is always one element of the range but the preimage can be a coset. In order to get one representative of this coset you can use the function PreImagesRepresentative.

    gap> Image( f, (1,2,3,4) );
    FactorGroupElement( v4, (2,4) )
    gap> PreImages( f, s3.generators[1] );
    (v4*(2,4))
    gap> PreImagesRepresentative( f, s3.generators[1] );
    (2,4) 

But even if the homomorphism is a monomorphism but not surjective you can use the function PreImagesRepresentative in order to get the preimage of an element of the range.

    gap> A := Z(3) * [ [ 0, 1 ], [ 1, 0 ] ];;
    gap> B := Z(3) * [ [ 0, 1 ], [ -1, 0 ] ];;
    gap> G := Group( A, B );
    Group( [ [ 0*Z(3), Z(3) ], [ Z(3), 0*Z(3) ] ],
    [ [ 0*Z(3), Z(3) ], [ Z(3)^0, 0*Z(3) ] ] )
    gap> Size( G );
    8
    gap> G.name := "G";;
    gap> d8 := Operation( G, Orbit( G, Z(3)*[1,0] ) );
    Group( (1,2)(3,4), (1,2,3,4) )
    gap> e := OperationHomomorphism( Subgroup( G, [B] ), d8 );
    OperationHomomorphism( Subgroup( G,
    [ [ [ 0*Z(3), Z(3) ], [ Z(3)^0, 0*Z(3) ] ] ] ), Group( (1,2)(3,4),
    (1,2,3,4) ) )
    gap> Kernel( e );
    Subgroup( G, [  ] )
    gap> IsSurjective( e );
    false
    gap> PreImages( e, (1,3)(2,4) );
    (Subgroup( G, [  ] )*[ [ Z(3), 0*Z(3) ], [ 0*Z(3), Z(3) ] ])
    gap> PreImage( e, (1,3)(2,4) );
    Error, <bij> must be a bijection, not an arbitrary mapping in
    bij.operations.PreImageElm( bij, img ) called from
    PreImage( e, (1,3)(2,4) ) called from
    main loop
    brk> quit;
    gap> PreImagesRepresentative( e, (1,3)(2,4) );
    [ [ Z(3), 0*Z(3) ], [ 0*Z(3), Z(3) ] ] 

Only bijections allow PreImage in order to get the preimage of an element of the range.

    gap> Operation( G, Orbit( G, Z(3)*[1,0] ) );
    Group( (1,2)(3,4), (1,2,3,4) )
    gap> d := OperationHomomorphism( G, last );
    OperationHomomorphism( G, Group( (1,2)(3,4), (1,2,3,4) ) )
    gap> PreImage( d, (1,3)(2,4) );
    [ [ Z(3), 0*Z(3) ], [ 0*Z(3), Z(3) ] ] 

Both PreImage and PreImages can also be applied to sets. They return the complete preimage.

    gap> PreImages( d, Group( (1,2)(3,4), (1,3)(2,4) ) );
    Subgroup( G, [ [ [ 0*Z(3), Z(3) ], [ Z(3), 0*Z(3) ] ],
      [ [ Z(3), 0*Z(3) ], [ 0*Z(3), Z(3) ] ] ] )
    gap> Size( last );
    4
    gap> f := NaturalHomomorphism( s4, s3 );
    NaturalHomomorphism( s4, (s4 / v4) )
    gap> PreImages( f, s3 );
    Subgroup( s4, [ (1,2)(3,4), (1,3)(2,4), (2,4), (3,4) ] )
    gap> Size( last );
    24 

Another way to construct a group automorphism is to use elements in the normalizer of a subgroup and construct the induced automorphism. A special case is the inner automorphism induced by an element of a group, a more general case is a surjective homomorphism induced by arbitrary elements of the parent group.

    gap> d12 := Group((1,2,3,4,5,6),(2,6)(3,5));;  d12.name := "d12";;
    gap> i1 := InnerAutomorphism( d12, (1,2,3,4,5,6) );
    InnerAutomorphism( d12, (1,2,3,4,5,6) )
    gap> Image( i1, (2,6)(3,5) );
    (1,3)(4,6)
    gap> IsAutomorphism( i1 );
    true 

Mappings can also be multiplied, provided that the range of the first mapping is a subgroup of the source of the second mapping. The multiplication is of course defined as the composition. Note that, in line with the fact that mappings operate from the right, Image( map1 * map2, elm ) is defined as Image( map2, Image( map1, elm ) ).

    gap> i2 := InnerAutomorphism( d12, (2,6)(3,5) );
    InnerAutomorphism( d12, (2,6)(3,5) )
    gap> i1 * i2;
    InnerAutomorphism( d12, (1,6)(2,5)(3,4) )
    gap> Image( last, (2,6)(3,5) );
    (1,5)(2,4) 

Mappings can also be inverted, provided that they are bijections.

    gap> i1 ^ -1;
    InnerAutomorphism( d12, (1,6,5,4,3,2) )
    gap> Image( last, (2,6)(3,5) );
    (1,5)(2,4) 

Whenever you have a set of bijective mappings on a finite set (or domain) you can construct the group generated by those mappings. So in the following example we create the group of inner automorphisms of d12.

    gap> autd12 := Group( i1, i2 );
    Group( InnerAutomorphism( d12,
    (1,2,3,4,5,6) ), InnerAutomorphism( d12, (2,6)(3,5) ) )
    gap> Size( autd12 );
    6
    gap> Index( d12, Centre( d12 ) );
    6 

Note that the computation with such automorphism groups in their present implementation is not very efficient. For example to compute the size of such an automorphism group all elements are computed. Thus work with such automorphism groups should be restricted to very small examples.

The function ConjugationGroupHomomorphism is a generalization of InnerAutomorphism. It accepts a source and a range and an element that conjugates the source into the range. Source and range must lie in a common parent group, and the conjugating element must also lie in this parent group.

    gap> c2 := Subgroup( d12, [ (2,6)(3,5) ] );
    Subgroup( d12, [ (2,6)(3,5) ] )
    gap> v4 := Subgroup( d12, [ (1,2)(3,6)(4,5), (1,4)(2,5)(3,6) ] );
    Subgroup( d12, [ (1,2)(3,6)(4,5), (1,4)(2,5)(3,6) ] )
    gap> x := ConjugationGroupHomomorphism( c2, v4, (1,3,5)(2,4,6) );
    ConjugationGroupHomomorphism( Subgroup( d12,
    [ (2,6)(3,5) ] ), Subgroup( d12, [ (1,2)(3,6)(4,5), (1,4)(2,5)(3,6)
     ] ), (1,3,5)(2,4,6) )
    gap> IsSurjective( x );
    false
    gap> Image( x );
    Subgroup( d12, [ (1,5)(2,4) ] ) 

But how can we construct homomorphisms which are not induced by elements of the parent group? The most general way to construct a group homomorphism is to define the source, range and the images of the generators under the homomorphism in mind.

    gap> c := GroupHomomorphismByImages( G, s4, [A,B], [(1,2),(3,4)] );
    GroupHomomorphismByImages( G, s4,
    [ [ [ 0*Z(3), Z(3) ], [ Z(3), 0*Z(3) ] ],
      [ [ 0*Z(3), Z(3) ], [ Z(3)^0, 0*Z(3) ] ] ], [ (1,2), (3,4) ] )
    gap> Kernel( c );
    Subgroup( G, [ [ [ Z(3), 0*Z(3) ], [ 0*Z(3), Z(3) ] ] ] )
    gap> Image( c );
    Subgroup( s4, [ (1,2), (3,4) ] )
    gap> IsHomomorphism( c );
    true
    gap> Image( c, A );
    (1,2)
    gap> PreImages( c, (1,2) );
    (Subgroup( G, [ [ [ Z(3), 0*Z(3) ], [ 0*Z(3), Z(3) ] ] ] )*
    [ [ 0*Z(3), Z(3) ], [ Z(3), 0*Z(3) ] ]) 

Note that it is possible to construct a general mapping this way that is not a homomorphism, because GroupHomomorphismByImages does not check if the given images fulfill the relations of the generators.

    gap> b := GroupHomomorphismByImages( G, s4, [A,B], [(1,2,3),(3,4)] );
    GroupHomomorphismByImages( G, s4,
    [ [ [ 0*Z(3), Z(3) ], [ Z(3), 0*Z(3) ] ],
      [ [ 0*Z(3), Z(3) ], [ Z(3)^0, 0*Z(3) ] ] ], [ (1,2,3), (3,4) ] )
    gap> IsHomomorphism( b );
    false
    gap> Images( b, A );
    (Subgroup( s4, [ (1,3,2), (2,3,4), (1,3,4), (1,4)(2,3), (1,4,2)
     ] )*()) 

The result is a multi valued mapping, i.e., one that maps each element of its source to a set of elements in its range. The set of images of A under b is defined as follows. Take all the words of two letters w( x, y ) such that w( A, B ) = A, e.g., x and x y x y x. Then the set of images is the set of elements that you get by inserting the images of A and B in those words, i.e., w( (1,2,3), (3,4) ), e.g., (1,2,3) and (1,4,2). One can show that the set of images of the identity under a multi valued mapping such as b is a subgroup and that the set of images of other elements are cosets of this subgroup.

Previous Up Top Next
Index

GAP 3.4.4
April 1997