Quotient groups
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 asG(which is reasonable ifNis trivial),G/Nmay have typePcGrouporSubPcGroup(which is reasonable ifG/Nis finite and solvable), orG/Nmay have typePermGroup(which is reasonable ifG/Nis finite and non-solvable).G/Nmay have typeFPGroup(which is reasonable ifG/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 asG(which is reasonable ifGis abelian),Fmay have typePcGroup(which is reasonable ifFis finite), orFmay have typeFPGroup(which is reasonable ifFis 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