%
\Chapter{Arbitrary functions on groups: EndoMappings}
%

An *endomapping* is a mapping with equal source and range, say $G$,
where $G$ is a group. An endomapping  on $G$ then acts on $G$ by
*transforming* each element of $G$ into (precisely one) element of $G$.
Endomappings are special cases of Mappings.

Endomappings are created by the constructor functions 
`EndoMappingByPositionList', `EndoMappingByFunction', `IdentityEndoMapping',
`ConstantEndoMapping', and are represented as mappings.
The functions described in
this section can be found in the file `grptfms.g?'. 

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\Section{Defining endo mappings}


\>EndoMappingByPositionList ( <G>, <list> )

The constructor function `EndoMappingByPositionList' returns the 
the endomapping that maps the i-th element of the group (in the
ordering given by AsSortedList)
to the i-th element of list.

\beginexample
    gap> G := GTW4_2;
    4/2
    gap> t1 := EndoMappingByPositionList ( G, [1, 2, 4, 4] );
    <mapping: 4/2 -> 4/2 >
\endexample

\>EndoMappingByFunction( <G>, <fun> )

The constructor function `EndoMappingByFunction' returns the
function <fun> that maps elements of the group <G> into <G> as an
endomapping.

\beginexample
    gap> t2 := EndoMappingByFunction ( GTW8_2, g -> g^-1 );
    <mapping: 8/2 -> 8/2 >
    gap> IsGroupHomomorphism ( t2 );
    true
    gap> t3 := EndoMappingByFunction ( GTW6_2, g -> g^-1 );
    <mapping: 6/2 -> 6/2 >
    gap> IsGroupHomomorphism ( t3 );
    false
\endexample

`EndoMappings' and `GroupGeneralMappings' are different
kinds of objects in {\GAP}: `GroupGeneralMappings' model homomorphisms between
two different groups, whereas `EndoMappings' model nonlinear functions
on one group.
However, `GroupGeneralMappings' can be transformed into
`Endomappings' if they have equal source and range.

\>AsEndoMapping( <map> )

The constructor function `AsEndoMapping' returns the mapping <map> 
as an endomapping.

\beginexample
    gap> G1 := Group ((1,2,3), (1, 2));
    Group([ (1,2,3), (1,2) ])
    gap> G2 := Group ((2,3,4), (2, 3));
    Group([ (2,3,4), (2,3) ])
    gap> f1 := IsomorphismGroups ( G1, G2 );
    [ (1,2,3), (1,2) ] -> [ (2,3,4), (2,3) ]
    gap> f2 := IsomorphismGroups ( G2, G1 );
    [ (2,3,4), (2,3) ] -> [ (1,2,3), (1,2) ]
    gap> AsEndoMapping ( CompositionMapping ( f1, f2 ) );
    <mapping: Group( [ (2,3,4), (2,3) ] ) -> Group( [ (2,3,4), (2,3)
    ] ) >
\endexample

`EndoMappings' and `GroupGeneralMappings' are two completely different
kinds of objects in {\GAP}, but they can be transformed into one
another.

\>AsGroupGeneralMappingByImages( <endomap> )

`AsGroupGeneralMappingByImages' returns the
`GroupGeneralMappingByImages' that acts on the group the same way as
the endomapping <endomap>. It only makes sense to use this function
for endomappings that are group endomorphisms.

\beginexample
    gap> m := IdentityEndoMapping ( GTW6_2 );
    <mapping: 6/2 -> 6/2 >
    gap> AsGroupGeneralMappingByImages ( m );
    [ (1,2), (1,2,3) ] -> [ (1,2), (1,2,3) ]
\endexample

\>IsEndoMapping( <obj> )

`IsEndoMapping' returns `true' if the object <obj> is an endomapping
and `false' otherwise.

\beginexample
    gap> IsEndoMapping ( InnerAutomorphisms ( GTW6_2 ) [3] );
    true
\endexample

\>IdentityEndoMapping( <G> )

`IdentitEndoMapping' is the counterpart to the {\GAP} standard
library function `IdentityMapping'. It returns the identity
transformation on the group <G>.

\beginexample
    gap> AsList ( UnderlyingRelation ( IdentityEndoMapping ( Group ((1,2,3,4)) ) ) );
    [ Tuple( [ (), () ] ), Tuple( [ (1,2,3,4), (1,2,3,4) ] ), 
      Tuple( [ (1,3)(2,4), (1,3)(2,4) ] ), Tuple( [ (1,4,3,2), (1,4,3,2) ] ) 
     ]
\endexample

\>ConstantEndoMapping( <G>, <g> )

`ConstantEndoMapping' returns the endomapping on the group <G>
which maps everything to the group element <g> of <G>.

\beginexample
    gap> C3 := CyclicGroup (3);
    <pc group of size 3 with 1 generators>
    gap> m := ConstantEndoMapping (C3, AsSortedList (C3) [2]);
    MappingByFunction( <pc group of size 3 with 
    1 generators>, <pc group of size 3 with 
    1 generators>, function( x ) ... end )
    gap> List (AsList (C3), x -> Image (m, x));
    [ f1, f1, f1 ]
\endexample


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\Section{Properties of endo mappings}


\>IsIdentityEndoMapping( <endomap> )

`IsIdentityEndoMapping' returns `true' if <endomap> is the identity
function on a group.

\beginexample
    gap> IsIdentityEndoMapping (EndoMappingByFunction ( 
    > AlternatingGroup ( [1..5] ), x -> x^31));
    true
\endexample

\>IsConstantEndoMapping( <endomap> )

`IsConstantEndoMapping' returns `true' if the endomapping
<endomap> is constant and `false' otherwise.

\beginexample
    gap> C3 := CyclicGroup ( 3 );
    <pc group of size 3 with 1 generators>
    gap> IsConstantEndoMapping ( EndoMappingByFunction ( C3,  x -> x^3 ));
    true
\endexample

\>IsDistributiveEndoMapping( <endomap> )

A mapping $t$ on an (additively written) group $G$ is called
*distributive* if for all elements $x$ and $y$ in $G$:\
$t(x+y) = t(x) + t(y)$.
The function `IsDistributiveEndoMapping' returns the according
boolean value `true' or `false'.

\beginexample
    gap> G := Group ( (1,2,3), (1,2) );
    Group([ (1,2,3), (1,2) ])
    gap> IsDistributiveEndoMapping ( EndoMappingByFunction ( G, x -> x^3));
    false
    gap> IsDistributiveEndoMapping ( EndoMappingByFunction ( G, x -> x^7));
    true
\endexample

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\Section{Operations for endo mappings}


While the composition operator `\*' is applicable to mappings and
transformations, the operation `+' (pointwise addition of the images) can
only be applied to transformations.

The product operator `\*' returns the transformation which is obtained 
from the transformations <t1> and <t2> by composition of <t1> and <t2>
(i.e. performing <t2> *after* <t1>).

\beginexample
    gap> t1 := ConstantEndoMapping ( GTW2_1, ());
    MappingByFunction( 2/1, 2/1, function( x ) ... end )
    gap> t2 := ConstantEndoMapping (GTW2_1, (1, 2));
    MappingByFunction( 2/1, 2/1, function( x ) ... end )
    gap> List ( AsList ( GTW2_1 ), x -> Image ( t1 * t2, x ));
    [ (1,2), (1,2) ]
\endexample

The add operator `+' returns the endomapping which is obtained 
from the endomappings <t1> and <t2> by pointwise addition 
of <t1> and <t2>. (Note that in this context addition means that
for every place $x$ in the source of <t1> and <t2>,   
{\GAP} performs the  operation `p\ \*\ q', where
`p' is the image of <t1> at $x$ and `q' is the image of <t2> at $x$.) 

The subtract operator `-' returns the endomapping which is 
obtained from the endomappings <t1> and <t2> by pointwise 
subtraction of <t1> and <t2>. (Note that in this context subtraction 
means performing the {\GAP} operation `p\ \*\ q\^{}(-1)',
where
`p' is the image of <t1> at a place $x$ and `q' is the image of <t2> at $x$.) 

\beginexample
    gap> G := SymmetricGroup ( 3 );
    Sym( [ 1 .. 3 ] )
    gap> invertingOnG := EndoMappingByFunction ( G, x -> x^-1 );
    <mapping: SymmetricGroup( [ 1 .. 3 ] ) -> SymmetricGroup(
    [ 1 .. 3 ] ) >
    gap> identityOnG := IdentityEndoMapping (G);
    <mapping: SymmetricGroup( [ 1 .. 3 ] ) -> SymmetricGroup(
    [ 1 .. 3 ] ) >
    gap> AsSortedList ( G );
    [ (), (2,3), (1,2), (1,2,3), (1,3,2), (1,3) ]
    gap> List ( AsSortedList (G), 
    >              x -> Image ( identityOnG * invertingOnG, x ));
    [ (), (2,3), (1,2), (1,3,2), (1,2,3), (1,3) ]
    gap> List ( AsSortedList (G),
    >              x -> Image ( identityOnG + invertingOnG, x ));
    [ (), (), (), (), (), () ]
    gap> IsIdentityEndoMapping ( - invertingOnG );
    true
    gap> - invertingOnG = identityOnG;
    true
\endexample

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\Section{Nicer ways to print a mapping}


\> GraphOfMapping( <mapping> )

`GraphOfMapping' returns the set of all pairs (x,m(x)), where
x lies in the source of the mapping. In particular, it returns
List (Source (m), x -> [x, Image (m, x)]);

\beginexample
    gap> G := SymmetricGroup ( 3 );
    Sym( [ 1 .. 3 ] )
    gap> m := ConstantEndoMapping (G, (1,2,3)) + IdentityEndoMapping( G );
    MappingByFunction( Sym( [ 1 .. 3 ] ), Sym( [ 1 .. 3 ] ), function( g ) ... end )
    gap> PrintArray( GraphOfMapping( m ) );
    [ [       (),  (1,2,3) ],
      [    (2,3),    (1,3) ],
      [    (1,2),    (2,3) ],
      [  (1,2,3),  (1,3,2) ],
      [  (1,3,2),       () ],
      [    (1,3),    (1,2) ] ]
\endexample

\> PrintAsTerm( <mapping> )

If <mapping> is a polynomial function on its source then `PrintAsTerm'
prints a polynomial that induces the mapping <mapping>.
\beginexample
    gap> G := SymmetricGroup ( 3 );
    Sym( [ 1 .. 3 ] )
    gap> p := Random( PolynomialNearRing( G ) );
    <mapping: SymmetricGroup( [ 1 .. 3 ] ) -> SymmetricGroup( [ 1 .. 3 ] ) >
    gap> PrintAsTerm( p );
    g1 - x - 2 * g1 - g2 - x - g1 - g2 + g1 - x - 2 * g1 - 
    g2 - x - g1 - g2 - 3 * x + g1
    gap> GeneratorsOfGroup( G );
    [ (1,2,3), (1,2) ]
\endexample

The expressions `g1' and `g2' stand for the first and secong generator 
of the group <G> respectively. The result is not necessarily a 
polynomial of minimal length.

%%% Local Variables: 
%%% mode: latex
%%% TeX-master: t
%%% End: 
