# The Hom Functor

## `Hom(G, H): GrpPC, GrpPC -> GrpAb, Map`

## `Hom(G, H): GrpAb, GrpAb -> GrpAb, Map`

Given finite abelian groups $G$ and $H$, return an abelian group $A$ isomorphic to ${\rm Hom}(G, H)$, and a transfer map $t$ such that, given an element $a$ of $A$, $t(a)$ yields the corresponding (Magma `Map` type) homomorphism from $G$ to $H$. The structure of ${\rm Hom}(G, H)$ may thus be analyzed by examining $A$.

## `HomGenerators(G, H): GrpAb, GrpAb -> GrpAb, Map`

Given finite abelian groups $G$ and $H$, return a sequence of ($Z$-module) generators of ${\rm Hom}(G, H)$. The generators are returned as actual (Magma `Map` type) homomorphisms. Note that ${\rm Hom}(G, H)$ is usually not free, so it is difficult to generate all homomorphisms uniquely using the generators alone (use `Hom` or `Homomorphisms` if that is desired).

## `AllHomomorphisms(G, H): GrpAb, GrpAb -> [Map]`

## `AllHomomorphisms(G, H): GrpPC, GrpPC -> [Map]`

## `Homomorphisms(G, H): GrpAb, GrpAb -> [Map]`

Given finite abelian groups $G$ and $H$, return a sequence containing all elements of ${\rm Hom}(G, H)$. The elements are returned as actual (Magma `Map` type) homomorphisms. Note that this function simply uses `Hom`, transferring each element of the returned group to the actual Magma `Map` type homomorphism.

## `Example: Relations (ex-0d5388)`

We examine $A={\rm Hom}(G, H)$, for certain abelian groups $G$ and $H$.

```magma
> G := AbelianGroup([2, 3]);
> H := AbelianGroup([4, 6]);
> A, t := Hom(G, H);
> #A;
12
> A;
Abelian Group isomorphic to Z/2 + Z/6
Defined on 2 generators
Relations:
    2*A.1 = 0
    6*A.2 = 0
> h := t(A.1);
> h;
Mapping from: GrpAb: G to GrpAb: H
> h(G.1);
3*H.2
> h(G.2);
0

```

We now enumerate all elements of $A$ and examine the images of each generator of $G$ under each homomorphism. We note that each possible list of images occurs only once.

```magma
> I := [<h(G.1), h(G.2)> where h is t(x): x in A];
> I;
[
    <0, 0>,
    <3*H.2, 0>,
    <2*H.1, 2*H.2>,
    <2*H.1 + 3*H.2, 2*H.2>,
    <0, 4*H.2>,
    <3*H.2, 4*H.2>,
    <2*H.1, 0>,
    <2*H.1 + 3*H.2, 0>,
    <0, 2*H.2>,
    <3*H.2, 2*H.2>,
    <2*H.1, 4*H.2>,
    <2*H.1 + 3*H.2, 4*H.2>
]
> #I;
12
> #Set(I);
12

```
