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