# Abelian Groups

Here we describe the interface to abelian groups in Hecke.

## Introduction

Within Hecke, abelian groups are of generic abstract type GrpAb which does not have to be finitely generated, $\mathbb Q/\mathbb Z$ is an example of a more general abelian group. Having said that, most of the functionality is restricted to abelian groups that are finitely presented as $\mathbb Z$-modules.

### Basic Creation

Finitely presented (as $\mathbb Z$-modules) abelian groups are of type GrpAbFinGen with elements of type GrpAbFinGenElem. The creation is mostly via a relation matrix $M = (m_{i,j})$ for $1\le i\le n$ and $1\le j\le m$. This creates a group with $m$ generators $e_j$ and relations

$$$\sum_{i=1}^n m_{i,j} e_j = 0.$$$
abelian_groupMethod
abelian_group(::Type{T} = GrpAbFinGen, M::ZZMatrix) -> GrpAbFinGen

Creates the abelian group with relation matrix M. That is, the group will have ncols(M) generators and each row of M describes one relation.

abelian_groupMethod
abelian_group(::Type{T} = GrpAbFinGen, M::AbstractMatrix{<:IntegerUnion})

Creates the abelian group with relation matrix M. That is, the group will have ncols(M) generators and each row of M describes one relation.

abelian_groupMethod
abelian_group(::Type{T} = GrpAbFinGen, M::AbstractMatrix{<:IntegerUnion})

Creates the abelian group with relation matrix M. That is, the group will have ncols(M) generators and each row of M describes one relation.

Alternatively, there are shortcuts to create products of cyclic groups:

abelian_groupMethod
abelian_group(::Type{T} = GrpAbFinGen, M::AbstractVector{<:IntegerUnion}) -> GrpAbFinGen
abelian_group(::Type{T} = GrpAbFinGen, M::IntegerUnion...) -> GrpAbFinGen

Creates the direct product of the cyclic groups $\mathbf{Z}/m_i$, where $m_i$ is the $i$th entry of M.

julia> G = abelian_group(2, 2, 6)GrpAb: (Z/2)^2 x Z/6

or even

free_abelian_groupMethod
free_abelian_group(::Type{T} = GrpAbFinGen, n::Int) -> GrpAbFinGen

Creates the free abelian group of rank n.

abelian_groupsMethod
abelian_groups(n::Int) -> Vector{GrpAbFinGen}

Given a positive integer $n$, return a list of all abelian groups of order $n$.

julia> abelian_groups(8)3-element Vector{GrpAbFinGen}:
GrpAb: (Z/2)^3
GrpAb: Z/2 x Z/4
GrpAb: Z/8

### Invariants

is_snfMethod
is_snf(G::GrpAbFinGen) -> Bool

Return whether the current relation matrix of the group $G$ is in Smith normal form.

ngensMethod
ngens(G::GrpAbFinGen) -> Int

Return the number of generators of $G$ in the current representation.

nrelsMethod
nrels(G::GrpAbFinGen) -> Int

Return the number of relations of $G$ in the current representation.

relsMethod
rels(A::GrpAbFinGen) -> ZZMatrix

Return the currently used relations of $G$ as a single matrix.

isfiniteMethod
isfinite(A::GrpAbFinGen) -> Bool

Return whether $A$ is finite.

rankMethod
rank(A::GrpAbFinGen) -> Int

Return the rank of $A$, that is, the dimension of the $\mathbf{Q}$-vectorspace $A \otimes_{\mathbf Z} \mathbf Q$.

orderMethod
order(A::GrpAbFinGen) -> ZZRingElem

Return the order of $A$. It is assumed that $A$ is finite.

exponentMethod
exponent(A::GrpAbFinGen) -> ZZRingElem

Return the exponent of $A$. It is assumed that $A$ is finite.

istrivialMethod
istrivial(A::GrpAbFinGen) -> Bool

Return whether $A$ is the trivial group.

is_torsionMethod
is_torsion(G::GrpAbFinGen) -> Bool

Return whether G is a torsion group.

is_cyclicMethod
is_cyclic(G::GrpAbFinGen) -> Bool

Return whether $G$ is cyclic.

elementary_divisorsMethod
elementary_divisors(G::GrpAbFinGen) -> Vector{ZZRingElem}

Given $G$, return the elementary divisors of $G$, that is, the unique positive integers $e_1,\dotsc,e_k$ with $e_i \mid e_{i + 1}$ and $G \cong \mathbf{Z}/e_1\mathbf{Z} \times \dotsb \times \mathbf{Z}/e_k\mathbf{Z}$.