Quotients
Quotient groups in OSCAR can be defined using the instruction quo in two ways.
- Quotients by normal subgroups.
quo — Methodquo([::Type{Q}, ]G::GAPGroup, N::GAPGroup) where Q <: GAPGroupReturn 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/Nmay have the same type as- G(which is reasonable if- Nis trivial),
- G/Nmay have type- PcGroupor- SubPcGroup(which is reasonable if- G/Nis finite and solvable), or
- G/Nmay have type- PermGroup(which is reasonable if- G/Nis finite and non-solvable).
- G/Nmay have type- FPGroup(which is reasonable if- G/Nis infinite).
An exception is thrown if N is not a normal subgroup of G.
Examples
julia> G = symmetric_group(4)
Symmetric group of degree 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 — Methodquo([::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> G,_=quo(F,[f1^2,f2^3,(f1*f2)^2]);
julia> is_finite(G)
true
julia> is_isomorphic(G,symmetric_group(3))
trueSimilarly 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 — Functionmaximal_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.
- Fmay have the same type as- G(which is reasonable if- Gis abelian),
- Fmay have type- PcGroup(which is reasonable if- Fis finite), or
- Fmay have type- FPGroup(which is reasonable if- Fis 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