# Quotients

Quotient groups in OSCAR can be defined using the instruction `quo`

in two ways.

- Quotients by normal subgroups.

`quo`

— Method`quo([::Type{Q}, ]G::GAPGroup, N::GAPGroup) where Q <: GAPGroup`

Return the quotient group `G/N`

, together with the projection `G`

-> `G/N`

.

If `Q`

is given then `G/N`

has type `Q`

if possible, and an exception is thrown if not.

If `Q`

is not given then the type of `G/N`

is not determined by the type of `G`

.

`G/N`

may have the same type as`G`

(which is reasonable if`N`

is trivial),`G/N`

may have type`PcGroup`

or`SubPcGroup`

(which is reasonable if`G/N`

is finite and solvable), or`G/N`

may have type`PermGroup`

(which is reasonable if`G/N`

is finite and non-solvable).`G/N`

may have type`FPGroup`

(which is reasonable if`G/N`

is infinite).

An exception is thrown if `N`

is not a normal subgroup of `G`

.

**Examples**

```
julia> G = symmetric_group(4)
Sym(4)
julia> N = pcore(G, 2)[1];
julia> typeof(quo(G, N)[1])
PcGroup
julia> typeof(quo(PermGroup, G, N)[1])
PermGroup
```

- Quotients by elements.

`quo`

— Method`quo([::Type{Q}, ]G::T, elements::Vector{elem_type(G)})) where {Q <: GAPGroup, T <: GAPGroup}`

Return the quotient group `G/N`

, together with the projection `G`

-> `G/N`

, where `N`

is the normal closure of `elements`

in `G`

.

See `quo(G::GAPGroup, N::GAPGroup)`

for information about the type of `G/N`

.

For groups `G`

of type `SubFPGroup`

, this syntax is not supported. In this case, you can switch to group of different type, using `isomorphism`

, or try to create the normal subgroup `N`

in question, and call `quo(G, N)`

.

This is the typical way to build finitely presented groups.

**Example:**

```
julia> F=free_group(2);
julia> (f1,f2)=gens(F);
julia> G,_=quo(F,[f1^2,f2^3,(f1*f2)^2]);
julia> is_finite(G)
true
julia> is_isomorphic(G,symmetric_group(3))
true
```

Similarly to the subgroups, the output consists of a pair (`Q`

,`p`

), where `Q`

is the quotient group and `p`

is the projection homomorphism of `G`

into `Q`

.

`maximal_abelian_quotient`

— Function`maximal_abelian_quotient([::Type{Q}, ]G::GAPGroup) where Q <: Union{GAPGroup, FinGenAbGroup}`

Return `F, epi`

such that `F`

is the largest abelian factor group of `G`

and `epi`

is an epimorphism from `G`

to `F`

.

If `Q`

is given then `F`

has type `Q`

if possible, and an exception is thrown if not.

If `Q`

is not given then the type of `F`

is not determined by the type of `G`

.

`F`

may have the same type as`G`

(which is reasonable if`G`

is abelian),`F`

may have type`PcGroup`

(which is reasonable if`F`

is finite), or`F`

may have type`FPGroup`

(which is reasonable if`F`

is infinite).

**Examples**

```
julia> G = symmetric_group(4);
julia> F, epi = maximal_abelian_quotient(G);
julia> order(F)
2
julia> domain(epi) === G && codomain(epi) === F
true
julia> typeof(F)
PcGroup
julia> typeof(maximal_abelian_quotient(free_group(1))[1])
FPGroup
julia> typeof(maximal_abelian_quotient(PermGroup, G)[1])
PermGroup
```