# Subgroups

The following functions are available in OSCAR for subgroup properties:

subMethod
sub(G::GAPGroup, gens::AbstractVector{<:GAPGroupElem}; check::Bool = true)
sub(gens::GAPGroupElem...)

This function returns two objects: a group H, that is the subgroup of G generated by the elements x,y,..., and the embedding homomorphism of H into G. The object H has the same type of G, and it has no memory of the "parent" group G: it is an independent group.

If check is set to false then it is not checked whether each element of gens is an element of G.

Examples

julia> G = symmetric_group(4); H, _ = sub(G,[cperm([1,2,3]),cperm([2,3,4])]);

julia> H == alternating_group(4)
true
source
is_subgroupFunction
is_subgroup(G::T, H::T) where T <: GAPGroup

Return (true,f) if H is a subgroup of G, where f is the embedding homomorphism of H into G, otherwise return (false,nothing).

source
embeddingMethod
embedding(G::T, H::T) where T <: GAPGroup

Return the embedding morphism of H into G. An exception is thrown if H is not a subgroup of G.

source
indexMethod
index(::Type{I} = fmpz, G::T, H::T) where I <: IntegerUnion where T <: GAPGroup

Return the index of H in G, as an instance of I.

source
is_normalMethod
is_normal(G::T, H::T) where T <: GAPGroup

Return whether the group H is normalized by G, i.e., whether H is invariant under conjugation with elements of G.

Note

To test whether H is a normal subgroup, use is_normal(G, H) && issubset(H, G)

source
is_characteristicMethod
is_characteristic(G::T, H::T) where T <: GAPGroup

Return whether the subgroup H is characteristic in G, i.e., H is invariant under all automorphisms of G.

Note

To test whether H is a characteristic subgroup, use is_characteristic(G, H) && issubset(H, G)

source

## Standard subgroups

The following functions are available in OSCAR to obtain standard subgroups of a group G. Every such function returns a tuple (H,f), where H is a group of the same type of G and f is the embedding homomorphism of H into G.

trivial_subgroupFunction
trivial_subgroup(G::GAPGroup)

Return the trivial subgroup of G, together with its embedding morphism into G.

source
centerMethod
center(G::Group)

Return the center of G, i.e., the subgroup of all $x$ in G such that $x y$ equals $y x$ for every $y$ in G, together with its embedding morphism into G.

source
sylow_subgroupMethod
sylow_subgroup(G::Group, p::IntegerUnion)

Return a Sylow p-subgroup of the finite group G, for a prime p. This is a subgroup of p-power order in G whose index in G is coprime to p.

Examples

julia> g = symmetric_group(4); order(g)
24

julia> s = sylow_subgroup(g, 2); order(s[1])
8

julia> s = sylow_subgroup(g, 3); order(s[1])
3

source
derived_subgroupFunction
derived_subgroup(G::GAPGroup)

Return the derived subgroup of G, i.e., the subgroup generated by all commutators of G.

source
fitting_subgroupFunction
fitting_subgroup(G::GAPGroup)

Return the Fitting subgroup of G, i.e., the largest nilpotent normal subgroup of G.

source
frattini_subgroupFunction
frattini_subgroup(G::GAPGroup)

Return the Frattini subgroup of G, i.e., the intersection of all maximal subgroups of G.

source
radical_subgroupFunction
radical_subgroup(G::GAPGroup)

Return the solvable radical of G, i.e., the largest solvable normal subgroup of G.

source
pcoreMethod
pcore(G::Group, p::IntegerUnion)

Return C, f, where C is the p-core (i.e. the largest normal p-subgroup) of G and f is the embedding morphism of C into G.

source
intersectMethod
intersect(V::T...) where T <: Group
intersect(V::AbstractVector{T}) where T <: Group

If V is $[ G_1, G_2, \ldots, G_n ]$, return the intersection $K$ of the groups $G_1, G_2, \ldots, G_n$, together with the embeddings of $K into$G_i$. source The following functions return a vector of subgroups. maximal_normal_subgroupsFunction maximal_normal_subgroups(G::Group) Return the vector of maximal normal subgroups of G, i.e., of those proper normal subgroups of G that are maximal among the proper normal subgroups. source minimal_normal_subgroupsFunction minimal_normal_subgroups(G::Group) Return the vector of minimal normal subgroups of G, i.e., of those nontrivial normal subgroups of G that are minimal among the nontrivial normal subgroups. source characteristic_subgroupsFunction characteristic_subgroups(G::Group) Return the list of characteristic subgroups of G, i.e., those subgroups that are invariant under all automorphisms of G. source derived_seriesFunction derived_series(G::GAPGroup) Return the vector$[ G_1, G_2, \ldots ]$, where$G_1 =$G and$G_{i+1} =$derived_subgroup$(G_i)$. source sylow_systemFunction sylow_system(G::Group) Return a vector of Sylow$p$-subgroups of the finite group G, where$p$runs over the prime factors of the order of G, such that every two such subgroups commute with each other (as subgroups). Sylow systems exist only for solvable groups, an exception is thrown if G is not solvable. source hall_subgroup_repsFunction hall_subgroup_reps(G::Group, P::AbstractVector{<:IntegerUnion}) Return a vector that contains representatives of conjugacy classes of Hall P-subgroups of the finite group G, for a vector P of primes. A Hall P-subgroup of G is a subgroup the order of which is only divisible by primes in P and whose index in G is coprime to all primes in P. For solvable G, Hall P-subgroups exist and are unique up to conjugacy. For nonsolvable G, Hall P-subgroups may not exist or may not be unique up to conjugacy. Examples julia> g = dihedral_group(30); julia> h = hall_subgroup_reps(g, [2, 3]); julia> (length(h), order(h[1])) (1, 6) julia> g = GL(3, 2) GL(3,2) julia> h = hall_subgroup_reps(g, [2, 3]); julia> (length(h), order(h[1])) (2, 24) julia> h = hall_subgroup_reps(g, [2, 7]); length(h) 0  source hall_systemFunction hall_system(G::Group) Return a vector of$P$-Hall subgroups of the finite group G, where$P$runs over the subsets of prime factors of the order of G. Hall systems exist only for solvable groups, an exception is thrown if G is not solvable. source complement_class_repsFunction complement_class_reps(G::T, N::T) where T <: GAPGroup Return a vector of representatives of the conjugacy classes of complements of the normal subgroup N in G. This function may throws an error exception if both N and G/N are nonsolvable. A complement is a subgroup of G which intersects trivially with N and together with N generates G. Examples julia> G = symmetric_group(3); julia> complement_class_reps(G, derived_subgroup(G)[1]) 1-element Vector{PermGroup}: Group([ (2,3) ]) julia> G = dihedral_group(8) <pc group of size 8 with 3 generators> julia> complement_class_reps(G, center(G)[1]) PcGroup[] source complement_systemFunction complement_system(G::Group) Return a vector of Hall$p'$-subgroups of the finite group G, where$p$runs over the prime factors of the order of G. Complement systems exist only for solvable groups, an exception is thrown if G is not solvable. source Note When a function returns a vector of subgroups, the output consists in the subgroups only; the embeddings are not returned as well. To get the embedding homomorphism of the subgroup H in G, one can type embedding(G,H). ## Conjugation action of elements and subgroups is_conjugateMethod is_conjugate(G::GAPGroup, x::GAPGroupElem, y::GAPGroupElem) Return whether x and y are conjugate elements in G, i.e., there is an element$z$in G such that x^$z$equals y. source is_conjugateMethod is_conjugate(G::GAPGroup, H::GAPGroup, K::GAPGroup) Return whether H and K are conjugate subgroups in G. Examples julia> G = symmetric_group(4); julia> H = sub(G, [G([2, 1, 3, 4])])[1] Group([ (1,2) ]) julia> K = sub(G, [G([1, 2, 4, 3])])[1] Group([ (3,4) ]) julia> is_conjugate(G, H, K) true julia> K = sub(G, [G([2, 1, 4, 3])])[1] Group([ (1,2)(3,4) ]) julia> is_conjugate(G, H, K) false  source representative_actionMethod representative_action(G::Group, x::GAPGroupElem, y::GAPGroupElem) If x and y are conjugate in G, return (true, z), where x^z == y holds; otherwise, return (false, nothing). source representative_actionMethod representative_action(G::Group, H::Group, K::Group) If H and K are conjugate subgroups in G, return true, z where H^z = K; otherwise, return false, nothing. Examples julia> G = symmetric_group(4); julia> H = sub(G, [G([2, 1, 3, 4])])[1] Group([ (1,2) ]) julia> K = sub(G, [G([1, 2, 4, 3])])[1] Group([ (3,4) ]) julia> representative_action(G, H, K) (true, (1,3)(2,4)) julia> K = sub(G, [G([2, 1, 4, 3])])[1] Group([ (1,2)(3,4) ]) julia> representative_action(G, H, K) (false, nothing)  source centralizerMethod centralizer(G::Group, x::GroupElem) Return the centralizer of x in G, i.e., the subgroup of all$g$in G such that$g$x equals x$g$, together with its embedding morphism into G. source centralizerMethod centralizer(G::Group, H::Group) Return the centralizer of H in G, i.e., the subgroup of all$g$in G such that$g h$equals$h g$for every$h\$ in H, together with its embedding morphism into G.

source
normalizerMethod
normalizer(G::Group, x::GAPGroupElem)

Return N, f, where N is the normalizer of the cyclic subgroup generated by x in G and f is the embedding morphism of N into G.

source
normalizerMethod
normalizer(G::Group, H::Group)

Return N, f, where N is the normalizer of H in G, i.e., the largest subgroup of G in which H is normal, and f is the embedding morphism of N into G.

source
coreMethod
core(G::Group, H::Group)

Return C, f, where C is the normal core of H in G, that is, the largest normal subgroup of G that is contained in H, and f is the embedding morphism of C into G.

source
normal_closureMethod
normal_closure(G::Group, H::Group)

Return N, f, where N is the normal closure of H in G, that is, the smallest normal subgroup of G that contains H, and f is the embedding morphism of N into G.

Note that H must be a subgroup of G.

source
GroupConjClassType
GroupConjClass

It could be either the conjugacy class of an element or of a subgroup in a group G. It is displayed as

     cc = x ^ G

where G is a group and x = representative(cc) is either an element or a subgroup of G.

source
representativeMethod
representative(C::GroupConjClass)

Return a representative of the conjugacy class C.

Examples

julia> G = symmetric_group(4);

julia> C = conjugacy_class(G, G([2, 1, 3, 4]))
(1,2) ^ Sym( [ 1 .. 4 ] )

julia> representative(C)
(1,2)

source
acting_groupMethod
acting_group(C::GroupConjClass)

Return the acting group of the conjugacy class C.

Examples

julia> G = symmetric_group(4);

julia> C = conjugacy_class(G, G([2, 1, 3, 4]))
(1,2) ^ Sym( [ 1 .. 4 ] )

julia> acting_group(C) === G
true

source
conjugacy_classMethod
conjugacy_class(G::Group, g::GAPGroupElem) -> GroupConjClass

Return the conjugacy class cc of g in G, where g = representative(cc).

Examples

julia> G = symmetric_group(4);

julia> C = conjugacy_class(G, G([2, 1, 3, 4]))
(1,2) ^ Sym( [ 1 .. 4 ] )

source
conjugacy_classMethod
conjugacy_class(G::T, H::T) where T<:Group -> GroupConjClass

Return the subgroup conjugacy class cc of H in G, where H = representative(cc).

source
conjugacy_classesMethod
conjugacy_classes(G::Group)

Return the vector of all conjugacy classes of elements in G. It is guaranteed that the class of the identity is in the first position.

source
conjugacy_classes_subgroupsMethod
conjugacy_classes_subgroups(G::Group)

Return the vector of all conjugacy classes of subgroups of G.

Examples

julia> G = symmetric_group(3)
Sym( [ 1 .. 3 ] )

julia> conjugacy_classes_subgroups(G)
4-element Vector{GroupConjClass{PermGroup, PermGroup}}:
Group(()) ^ Sym( [ 1 .. 3 ] )
Group([ (2,3) ]) ^ Sym( [ 1 .. 3 ] )
Group([ (1,2,3) ]) ^ Sym( [ 1 .. 3 ] )
Group([ (1,2,3), (2,3) ]) ^ Sym( [ 1 .. 3 ] )

source
conjugacy_classes_maximal_subgroupsMethod
conjugacy_classes_maximal_subgroups(G::Group)

Return the vector of all conjugacy classes of maximal subgroups of G.

Examples

julia> G = symmetric_group(3);

julia> conjugacy_classes_maximal_subgroups(G)
2-element Vector{GroupConjClass{PermGroup, PermGroup}}:
Group([ (1,2,3) ]) ^ Sym( [ 1 .. 3 ] )
Group([ (2,3) ]) ^ Sym( [ 1 .. 3 ] )

source

## Cosets (left/right/double)

GroupCosetType
GroupCoset{T<: Group, S <: GAPGroupElem}

Type of group cosets. It is displayed as H * x (right cosets) or x * H (left cosets), where H is a subgroup of a group G and x is an element of G. Two cosets are equal if, and only if, they are both left (resp. right) and they contain the same elements.

source
right_cosetMethod
right_coset(H::Group, g::GAPGroupElem)
*(H::Group, g::GAPGroupElem)

Return the coset Hg.

Examples

julia> G = symmetric_group(5)
Sym( [ 1 .. 5 ] )

julia> g = perm(G,[3,4,1,5,2])
(1,3)(2,4,5)

julia> H = symmetric_group(3)
Sym( [ 1 .. 3 ] )
source
left_cosetMethod
left_coset(H::Group, g::GAPGroupElem)
*(g::GAPGroupElem, H::Group)

Return the coset gH.

Note

Since GAP supports right cosets only, the underlying GAP object of left_coset(H,g) is the right coset H^(g^-1) * g.

Examples

julia> g = perm([3,4,1,5,2])
(1,3)(2,4,5)

julia> H = symmetric_group(3)
Sym( [ 1 .. 3 ] )

julia> gH = left_coset(H,g)
Left coset   (1,3)(2,4,5) * Sym( [ 1 .. 3 ] )
source
is_rightMethod
is_right(c::GroupCoset)

Return whether the coset c is a right coset of its acting domain.

source
is_leftMethod
is_left(c::GroupCoset)

Return whether the coset c is a left coset of its acting domain.

source
is_bicosetMethod
is_bicoset(C::GroupCoset)

Return whether C is simultaneously a right coset and a left coset for the same subgroup H. This is the case if and only if the coset representative normalizes the acting domain subgroup.

Examples

julia> G = symmetric_group(5)
Sym( [ 1 .. 5 ] )

julia> H = symmetric_group(4)
Sym( [ 1 .. 4 ] )

julia> g = perm(G,[3,4,1,5,2])
(1,3)(2,4,5)

julia> gH = left_coset(H,g)
Left coset   (1,3)(2,4,5) * Sym( [ 1 .. 4 ] )

julia> is_bicoset(gH)
false

julia> f = perm(G,[2,1,4,3,5])
(1,2)(3,4)

julia> fH = left_coset(H,f)
Left coset   (1,2)(3,4) * Sym( [ 1 .. 4 ] )

julia> is_bicoset(fH)
true
source
acting_domainMethod
acting_domain(C::GroupCoset)

If C = Hx or xH, return H.

Examples

julia> G = symmetric_group(5)
Sym( [ 1 .. 5 ] )

julia> g = perm(G,[3,4,1,5,2])
(1,3)(2,4,5)

julia> H = symmetric_group(3)
Sym( [ 1 .. 3 ] )

julia> gH = left_coset(H,g)
Left coset   (1,3)(2,4,5) * Sym( [ 1 .. 3 ] )

julia> acting_domain(gH)
Sym( [ 1 .. 3 ] )
source
representativeMethod
representative(C::GroupCoset)

If C = Hx or xH, return x.

Examples

julia> G = symmetric_group(5)
Sym( [ 1 .. 5 ] )

julia> g = perm(G,[3,4,1,5,2])
(1,3)(2,4,5)

julia> H = symmetric_group(3)
Sym( [ 1 .. 3 ] )

julia> gH = left_coset(H,g)
Left coset   (1,3)(2,4,5) * Sym( [ 1 .. 3 ] )

julia> representative(gH)
(1,3)(2,4,5)
source
right_cosetsMethod
right_cosets(G::Group, H::Group)

Return the vector of the right cosets of H in G.

Examples

julia> G = symmetric_group(4)
Sym( [ 1 .. 4 ] )

julia> H = symmetric_group(3)
Sym( [ 1 .. 3 ] )

julia> right_cosets(G,H)
4-element Vector{GroupCoset{PermGroup, PermGroupElem}}:
Right coset   Sym( [ 1 .. 3 ] ) * ()
Right coset   Sym( [ 1 .. 3 ] ) * (1,4)
Right coset   Sym( [ 1 .. 3 ] ) * (1,4,2)
Right coset   Sym( [ 1 .. 3 ] ) * (1,4,3)
source
left_cosetsMethod
left_cosets(G::Group, H::Group)

Return the vector of the left cosets of H in G.

Examples

julia> G = symmetric_group(4)
Sym( [ 1 .. 4 ] )

julia> H = symmetric_group(3)
Sym( [ 1 .. 3 ] )

julia> left_cosets(G,H)
4-element Vector{GroupCoset{PermGroup, PermGroupElem}}:
Left coset   () * Sym( [ 1 .. 3 ] )
Left coset   (1,4) * Sym( [ 1 .. 3 ] )
Left coset   (1,2,4) * Sym( [ 1 .. 3 ] )
Left coset   (1,3,4) * Sym( [ 1 .. 3 ] )
source
right_transversalMethod
right_transversal(G::T, H::T) where T<: Group

Return a vector containing a complete set of representatives for right cosets for H.

Examples

julia> G = symmetric_group(4)
Sym( [ 1 .. 4 ] )

julia> H = symmetric_group(3)
Sym( [ 1 .. 3 ] )

julia> right_transversal(G,H)
4-element Vector{PermGroupElem}:
()
(1,4)
(1,4,2)
(1,4,3)
source
left_transversalMethod
left_transversal(G::T, H::T) where T<: Group

Return a vector containing a complete set of representatives for left cosets for H.

Examples

julia> G = symmetric_group(4)
Sym( [ 1 .. 4 ] )

julia> H = symmetric_group(3)
Sym( [ 1 .. 3 ] )

julia> left_transversal(G,H)
4-element Vector{PermGroupElem}:
()
(1,4)
(1,2,4)
(1,3,4)
source
GroupDoubleCosetType
GroupDoubleCoset{T<: Group, S <: GAPGroupElem}

Group double coset. It is displayed as H * x * K, where H and K are subgroups of a group G and x is an element of G. Two double cosets are equal if, and only if, they contain the same elements.

source
double_cosetMethod
double_coset(H::Group, x::GAPGroupElem, K::Group)
*(H::Group, x::GAPGroupElem, K::Group)

returns the double coset HxK.

Examples

julia> G = symmetric_group(5)
Sym( [ 1 .. 5 ] )

julia> g = perm(G,[3,4,5,1,2])
(1,3,5,2,4)

julia> H = symmetric_group(3)
Sym( [ 1 .. 3 ] )

julia> K = symmetric_group(2)
Sym( [ 1 .. 2 ] )

julia> double_coset(H,g,K)
Sym( [ 1 .. 3 ] ) * (1,3,5,2,4) * Sym( [ 1 .. 2 ] )
source
double_cosetsMethod
double_cosets(G::T, H::T, K::T; check::Bool=true) where T<: GAPGroup

Return the vector of all the double cosets HxK for x in G. If check == false, do not check whether H and K are subgroups of G.

Examples

julia> G = symmetric_group(4)
Sym( [ 1 .. 4 ] )

julia> H = symmetric_group(3)
Sym( [ 1 .. 3 ] )

julia> K = symmetric_group(2)
Sym( [ 1 .. 2 ] )

julia> double_cosets(G,H,K)
3-element Vector{GroupDoubleCoset{PermGroup, PermGroupElem}}:
Sym( [ 1 .. 3 ] ) * () * Sym( [ 1 .. 2 ] )
Sym( [ 1 .. 3 ] ) * (1,4) * Sym( [ 1 .. 2 ] )
Sym( [ 1 .. 3 ] ) * (1,4,3) * Sym( [ 1 .. 2 ] )
source
representativeMethod
representative(C::GroupDoubleCoset)

if C = HxK, returns x.

source
orderMethod
order(C::Union{GroupCoset,GroupDoubleCoset})

Return the cardinality of the (double) coset C.

source
randMethod
rand(rng::Random.AbstractRNG = Random.GLOBAL_RNG, C::Union{GroupCoset,GroupDoubleCoset})

Return a random element of the (double) coset C, using the random number generator rng.

source
intersectMethod
intersect(V::AbstractVector{Union{T, GroupCoset, GroupDoubleCoset}}) where T <: GAPGroup

Return a vector containing all elements belonging to all groups and cosets in V.

source