# 41.17 Module Homomorphisms

Let M_1 and M_2 be modules acted on by the rings R_1 and R_2 (via exponentiation), and varphi a ring homomorphism from R_1 to R_2. Any linear map psi = psi_{varphi} from M_1 to M_2 with the property that (m^r)^{psi} = (m^{psi})^(r^{varphi}) is called a module homomorphism.

At the moment only the following type of module homomorphism is available in GAP. Suppose you have the module M_1 for the algebra R_1. Then you can construct the operation algebra R_2':= Operation'( R_1, M_1 ), and the module for R_2 isomorphic to M_1 as M_2':= OperationModule'( R_2 ).

Then 'OperationHomomorphism'( M_1, M_2 ) can be used to construct the module homomorphism from M_1 to M_2.

```    gap> s:= Submodule( nat, [ [ 1, 1, 0 ] *Z(2) ] );; s.name:= "s";;
gap> op:= Operation( a, s ); op.name:="op";;
UnitalAlgebra( GF(2), [ [ [ 0*Z(2), Z(2)^0 ], [ Z(2)^0, Z(2)^0 ] ],
[ [ Z(2)^0, 0*Z(2) ], [ Z(2)^0, Z(2)^0 ] ] ] )
gap> opmod:= OperationModule( op ); opmod.name:= "opmod";;
Module( op, [ [ Z(2)^0, 0*Z(2) ], [ 0*Z(2), Z(2)^0 ] ] )
gap> modhom:= OperationHomomorphism( s, opmod );
OperationHomomorphism( s, opmod )
gap> b:= Basis( s );
SemiEchelonBasis( s,
[ [ Z(2)^0, Z(2)^0, 0*Z(2) ], [ 0*Z(2), Z(2)^0, Z(2)^0 ] ] ) ```

Images and preimages of elements under module homomorphisms are computed using `Image` and `PreImagesRepresentative`, respectively. If M_1 is a row module this is done by using the knowledge of images of a basis, if M_1 is a (quotient of a) free module then the algebra homomorphism and images of the generators of M_1 are used. The computation of preimages requires in both cases the knowledge of representatives of preimages of a basis of M_2.

```    gap> im:= List( b.vectors, x -> Image( modhom, x ) );
[ [ Z(2)^0, 0*Z(2) ], [ 0*Z(2), Z(2)^0 ] ]
gap> List( im, x -> PreImagesRepresentative( modhom, x ) );
[ [ Z(2)^0, Z(2)^0, 0*Z(2) ], [ 0*Z(2), Z(2)^0, Z(2)^0 ] ] ```

GAP 3.4.4
April 1997