Subgroups
The following functions are available in OSCAR for subgroup properties:
sub
— Methodsub(G::GAPGroup, gens::AbstractVector{<:GAPGroupElem}; check::Bool = true)
sub(gens::GAPGroupElem...)
Return 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
is_subset
— Methodis_subset(H::GAPGroup, G::GAPGroup)
Return true
if H
is a subset of G
, otherwise return false
.
Examples
julia> g = symmetric_group(300); h = derived_subgroup(g)[1];
julia> is_subset(h, g)
true
julia> is_subset(g, h)
false
is_subgroup
— Methodis_subgroup(H::GAPGroup, G::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
).
If you do not need the embedding then better call is_subset(H::GAPGroup, G::GAPGroup)
.
embedding
— Methodembedding(H::GAPGroup, G::GAPGroup)
Return the embedding morphism of H
into G
. An exception is thrown if H
is not a subgroup of G
.
index
— Methodindex(::Type{I} = ZZRingElem, G::GAPGroup, H::GAPGroup) where I <: IntegerUnion
index(::Type{I} = ZZRingElem, G::FinGenAbGroup, H::FinGenAbGroup) where I <: IntegerUnion
Return the index of H
in G
, as an instance of type I
.
Examples
julia> G = symmetric_group(5); H, _ = derived_subgroup(G);
julia> index(G,H)
2
is_maximal_subgroup
— Methodis_maximal_subgroup(H::GAPGroup, G::GAPGroup; check::Bool = true)
Return whether H
is a maximal subgroup of G
, i. e., whether H
is a proper subgroup of G
and there is no proper subgroup of G
that properly contains H
.
If check
is set to false
then it is not checked whether H
is a subgroup of G
. If check
is not set to false
then an exception is thrown if H
is not a subgroup of G
.
Examples
julia> G = symmetric_group(4);
julia> is_maximal_subgroup(sylow_subgroup(G, 2)[1], G)
true
julia> is_maximal_subgroup(sylow_subgroup(G, 3)[1], G)
false
julia> is_maximal_subgroup(sylow_subgroup(G, 3)[1], sylow_subgroup(G, 2)[1])
ERROR: ArgumentError: H is not a subgroup of G
is_normalized_by
— Methodis_normalized_by(H::GAPGroup, G::GAPGroup)
Return whether the group H
is normalized by G
, i.e., whether H
is invariant under conjugation with elements of G
.
Note that H
need not be a subgroup of G
. To test whether H
is a normal subgroup of G
, use is_normal_subgroup
.
Examples
julia> G = symmetric_group(4);
julia> is_normalized_by(sylow_subgroup(G, 2)[1], G)
false
julia> is_normalized_by(derived_subgroup(G)[1], G)
true
julia> is_normalized_by(derived_subgroup(G)[1], sylow_subgroup(G, 2)[1])
true
is_normal_subgroup
— Methodis_normal_subgroup(H::GAPGroup, G::GAPGroup)
Return whether the group H
is a normal subgroup of G
, i.e., whether H
is a subgroup of G
that is invariant under conjugation with elements of G
.
(See is_normalized_by
for an invariance check only.)
Examples
julia> G = symmetric_group(4);
julia> is_normal_subgroup(sylow_subgroup(G, 2)[1], G)
false
julia> is_normal_subgroup(derived_subgroup(G)[1], G)
true
julia> is_normal_subgroup(derived_subgroup(G)[1], sylow_subgroup(G, 2)[1])
false
is_characteristic_subgroup
— Methodis_characteristic_subgroup(H::GAPGroup, G::GAPGroup; check::Bool = true)
Return whether the subgroup H
of G
is characteristic in G
, i.e., H
is invariant under all automorphisms of G
.
If check
is set to false
then it is not checked whether H
is a subgroup of G
. If check
is not set to false
then an exception is thrown if H
is not a subgroup of G
.
Examples
julia> G = symmetric_group(4);
julia> is_characteristic_subgroup(derived_subgroup(G)[1], G)
true
julia> is_characteristic_subgroup(sylow_subgroup(G, 3)[1], G)
false
julia> is_characteristic_subgroup(sylow_subgroup(G, 3)[1], sylow_subgroup(G, 2)[1])
ERROR: ArgumentError: H is not a subgroup of G
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_subgroup
— Functiontrivial_subgroup(G::GAPGroup)
Return the trivial subgroup of G
, together with its embedding morphism into G
.
Examples
julia> trivial_subgroup(symmetric_group(5))
(Permutation group of degree 5 and order 1, Hom: permutation group -> Sym(5))
center
— Methodcenter(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
.
Examples
julia> center(symmetric_group(3))
(Permutation group of degree 3 and order 1, Hom: permutation group -> Sym(3))
julia> center(quaternion_group(8))
(Sub-pc group of order 2, Hom: sub-pc group -> pc group)
sylow_subgroup
— Methodsylow_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
derived_subgroup
— Functionderived_subgroup(G::GAPGroup)
Return the derived subgroup G'
of G
, i.e., the subgroup generated by all commutators of G
, together with an embedding G'
into G
.
Examples
julia> derived_subgroup(symmetric_group(5))
(Alt(5), Hom: Alt(5) -> Sym(5))
fitting_subgroup
— Functionfitting_subgroup(G::GAPGroup)
Return the Fitting subgroup of G
, i.e., the largest nilpotent normal subgroup of G
.
frattini_subgroup
— Functionfrattini_subgroup(G::GAPGroup)
Return the Frattini subgroup of G
, i.e., the intersection of all maximal subgroups of G
.
socle
— Functionsocle(G::GAPGroup)
Return the socle of G
, i.e., the subgroup generated by all minimal normal subgroups of G
, see minimal_normal_subgroups
.
solvable_radical
— Functionsolvable_radical(G::GAPGroup)
Return the solvable radical of G
, i.e., the largest solvable normal subgroup of G
.
pcore
— Methodpcore(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
.
intersect
— Methodintersect(V::T...) where T <: Group
intersect(V::AbstractVector{<:GAPGroup})
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$.
The following functions return a vector of subgroups.
normal_subgroups
— Functionnormal_subgroups(G::Group)
Return all normal subgroups of G
(see is_normal
).
Examples
julia> normal_subgroups(symmetric_group(5))
3-element Vector{PermGroup}:
Sym(5)
Alt(5)
Permutation group of degree 5 and order 1
julia> normal_subgroups(quaternion_group(8))
6-element Vector{SubPcGroup}:
Sub-pc group of order 8
Sub-pc group of order 4
Sub-pc group of order 4
Sub-pc group of order 4
Sub-pc group of order 2
Sub-pc group of order 1
maximal_normal_subgroups
— Functionmaximal_normal_subgroups(G::Group)
Return all maximal normal subgroups of G
, i.e., those proper normal subgroups of G
that are maximal among the proper normal subgroups.
Examples
julia> maximal_normal_subgroups(symmetric_group(4))
1-element Vector{PermGroup}:
Alt(4)
julia> maximal_normal_subgroups(quaternion_group(8))
3-element Vector{SubPcGroup}:
Sub-pc group of order 4
Sub-pc group of order 4
Sub-pc group of order 4
minimal_normal_subgroups
— Functionminimal_normal_subgroups(G::Group)
Return all minimal normal subgroups of G
, i.e., of those nontrivial normal subgroups of G
that are minimal among the nontrivial normal subgroups.
Examples
julia> minimal_normal_subgroups(symmetric_group(4))
1-element Vector{PermGroup}:
Permutation group of degree 4 and order 4
julia> minimal_normal_subgroups(quaternion_group(8))
1-element Vector{SubPcGroup}:
Sub-pc group of order 2
characteristic_subgroups
— Functioncharacteristic_subgroups(G::Group)
Return the list of characteristic subgroups of G
, i.e., those subgroups that are invariant under all automorphisms of G
.
Examples
julia> characteristic_subgroups(symmetric_group(3))
3-element Vector{PermGroup}:
Sym(3)
Permutation group of degree 3 and order 3
Permutation group of degree 3 and order 1
julia> characteristic_subgroups(quaternion_group(8))
3-element Vector{SubPcGroup}:
Sub-pc group of order 8
Sub-pc group of order 2
Sub-pc group of order 1
derived_series
— Methodderived_series(G::GAPGroup)
Return the vector $[ G_1, G_2, \ldots ]$, where $G_1 =$ G
and $G_{i+1} =$ derived_subgroup
$(G_i)$. See also derived_length
.
Examples
julia> G = derived_series(symmetric_group(4))
4-element Vector{PermGroup}:
Sym(4)
Alt(4)
Permutation group of degree 4 and order 4
Permutation group of degree 4 and order 1
julia> derived_series(symmetric_group(5))
2-element Vector{PermGroup}:
Sym(5)
Alt(5)
julia> derived_series(dihedral_group(8))
3-element Vector{SubPcGroup}:
Sub-pc group of order 8
Sub-pc group of order 2
Sub-pc group of order 1
sylow_system
— Functionsylow_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.
hall_system
— Functionhall_system(G::Group)
Return a vector of Hall $P$-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.
complement_system
— Functioncomplement_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.
chief_series
— Functionchief_series(G::GAPGroup)
Return a vector $[ G_1, G_2, \ldots ]$ of normal subgroups of G
such that $G_i > G_{i+1}$ and there is no normal subgroup N
of G
such that G_i > N > G_{i+1}
.
Note that in general there is more than one chief series, this function returns an arbitrary one.
Examples
julia> chief_series(alternating_group(4))
3-element Vector{PermGroup}:
Alt(4)
Permutation group of degree 4 and order 4
Permutation group of degree 4 and order 1
julia> chief_series(quaternion_group(8))
4-element Vector{SubPcGroup}:
Sub-pc group of order 8
Sub-pc group of order 4
Sub-pc group of order 2
Sub-pc group of order 1
composition_series
— Functioncomposition_series(M::ModAlgAss) -> Vector{MatElem}
Given a Fq[G]-module $M$, it returns a composition series for $M$, i.e. a sequence of submodules such that the quotient of two consecutive elements is irreducible.
composition_series(G::GAPGroup)
Return a vector $[ G_1, G_2, \ldots ]$ of subgroups forming a subnormal series which cannot be refined, i.e., $G_{i+1}$ is normal in $G_i$ and the quotient $G_i/G_{i+1}$ is simple.
Note that in general there is more than one composition series, this function returns an arbitrary one.
Examples
julia> composition_series(alternating_group(4))
4-element Vector{PermGroup}:
Permutation group of degree 4 and order 12
Permutation group of degree 4 and order 4
Permutation group of degree 4 and order 2
Permutation group of degree 4 and order 1
julia> composition_series(quaternion_group(8))
4-element Vector{SubPcGroup}:
Sub-pc group of order 8
Sub-pc group of order 4
Sub-pc group of order 2
Sub-pc group of order 1
jennings_series
— Functionjennings_series(G::GAPGroup)
Return for a $p$-group $G$ the vector $[ G_1, G_2, \ldots ]$ where $G_1 = G$ and beyond that $G_{i+1} := [G_i,G] G_j^p$ where $j$ is the smallest integer $> i/p$.
An exception is thrown if $G$ is not a $p$-group.
Examples
julia> jennings_series(dihedral_group(16))
5-element Vector{SubPcGroup}:
Sub-pc group of order 16
Sub-pc group of order 4
Sub-pc group of order 2
Sub-pc group of order 2
Sub-pc group of order 1
julia> jennings_series(dihedral_group(10))
ERROR: ArgumentError: group must be a p-group
p_central_series
— Functionp_central_series(G::GAPGroup, p::IntegerUnion)
Return the vector $[ G_1, G_2, \ldots ]$ where $G_1 = G$ and beyond that $G_{i+1} := [G, G_i] G_i^p$.
An exception is thrown if $p$ is not a prime.
Examples
julia> p_central_series(alternating_group(4), 2)
1-element Vector{PermGroup}:
Alt(4)
julia> p_central_series(alternating_group(4), 3)
2-element Vector{PermGroup}:
Alt(4)
Permutation group of degree 4 and order 4
julia> p_central_series(alternating_group(4), 4)
ERROR: ArgumentError: p must be a prime
lower_central_series
— Methodlower_central_series(G::GAPGroup)
Return the vector $[ G_1, G_2, \ldots ]$ where $G_1 = G$ and beyond that $G_{i+1} := [G, G_i]$. The series ends as soon as it is repeating (e.g. when the trivial subgroup is reached, which happens if and only if $G$ is nilpotent).
It is a central series of normal (and even characteristic) subgroups of $G$. The name derives from the fact that $G_i$ is contained in the $i$-th step subgroup of any central series.
See also upper_central_series
and nilpotency_class
.
Examples
julia> lower_central_series(dihedral_group(8))
3-element Vector{SubPcGroup}:
Sub-pc group of order 8
Sub-pc group of order 2
Sub-pc group of order 1
julia> lower_central_series(dihedral_group(12))
2-element Vector{SubPcGroup}:
Sub-pc group of order 12
Sub-pc group of order 3
julia> lower_central_series(symmetric_group(4))
2-element Vector{PermGroup}:
Sym(4)
Alt(4)
upper_central_series
— Functionupper_central_series(G::GAPGroup)
Return the vector $[ G_1, G_2, \ldots ]$ where the last entry is the trivial group, and $G_i$ is defined as the overgroup of $G_{i+1}$ satisfying $G_i / G_{i+1} = Z(G/G_{i+1})$. The series ends as soon as it is repeating (e.g. when the whole group $G$ is reached, which happens if and only if $G$ is nilpotent).
It is a central series of normal subgroups. The name derives from the fact that $G_i$ contains every $i$-th step subgroup of a central series.
See also lower_central_series
and nilpotency_class
.
Examples
julia> upper_central_series(dihedral_group(8))
3-element Vector{SubPcGroup}:
Sub-pc group of order 8
Sub-pc group of order 2
Sub-pc group of order 1
julia> upper_central_series(dihedral_group(12))
2-element Vector{SubPcGroup}:
Sub-pc group of order 2
Sub-pc group of order 1
julia> upper_central_series(symmetric_group(4))
1-element Vector{PermGroup}:
Permutation group of degree 4 and order 1
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(H, G)
.
The following functions return an iterator of subgroups. Usually it is more efficient to work with (representatives of) the underlying conjugacy classes of subgroups instead.
complements
— Methodcomplements(G::GAPGroup, N::GAPGroup)
Return an iterator over the complements of the normal subgroup N
in G
. Very likely it is better to use complement_classes
instead.
Examples
julia> G = symmetric_group(3);
julia> describe(first(complements(G, derived_subgroup(G)[1])))
"C2"
hall_subgroups
— Functionhall_subgroups(G::Group, P::AbstractVector{<:IntegerUnion})
Return an iterator over the Hall P
-subgroups in G
. Very likely it is better to use hall_subgroup_classes
instead.
Examples
julia> g = GL(3, 2);
julia> describe(first(hall_subgroups(g, [2, 3])))
"S4"
low_index_subgroups
— Functionlow_index_subgroups(G::Group, n::Int)
Return an iterator over the subgroups of index at most n
in G
. Very likely it is better to use low_index_subgroup_classes
instead.
Examples
julia> G = alternating_group(6);
julia> length(collect(low_index_subgroups(G, 6)))
13
maximal_subgroups
— Functionmaximal_subgroups(G::Group)
Return an iterator over the maximal subgroups in G
. Very likely it is better to use maximal_subgroup_classes
instead.
Examples
julia> println([order(H) for H in maximal_subgroups(symmetric_group(3))])
ZZRingElem[3, 2, 2, 2]
julia> println([order(H) for H in maximal_subgroups(quaternion_group(8))])
ZZRingElem[4, 4, 4]
subgroups
— Methodsubgroups(G::GAPGroup)
Return an iterator over all subgroups in G
. Very likely it is better to use subgroup_classes
instead.
Examples
julia> println([order(H) for H in subgroups(symmetric_group(3))])
ZZRingElem[1, 2, 2, 2, 3, 6]
julia> println([order(H) for H in subgroups(quaternion_group(8))])
ZZRingElem[1, 2, 4, 4, 4, 8]
Conjugation action of elements and subgroups
is_conjugate
— Methodis_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 inv(z)*x*z
equals y
. To also return the element z
, use is_conjugate_with_data(G::GAPGroup, x::GAPGroupElem, y::GAPGroupElem)
.
is_conjugate
— Methodis_conjugate(G::GAPGroup, H::GAPGroup, K::GAPGroup)
Return whether H
and K
are conjugate subgroups in G
, i.e., whether there exists an element z
in G
such that the conjugate group H^z
, which is defined as $\{ z^{-1} h z; h \in H \}$, equals K
. To also return the element z
, use is_conjugate_with_data(G::GAPGroup, H::GAPGroup, K::GAPGroup)
.
Examples
julia> G = symmetric_group(4);
julia> H = sub(G, [G([2, 1, 3, 4])])[1]
Permutation group of degree 4
julia> K = sub(G, [G([1, 2, 4, 3])])[1]
Permutation group of degree 4
julia> is_conjugate(G, H, K)
true
julia> K = sub(G, [G([2, 1, 4, 3])])[1]
Permutation group of degree 4
julia> is_conjugate(G, H, K)
false
is_conjugate_with_data
— Methodis_conjugate_with_data(G::Group, x::GAPGroupElem, y::GAPGroupElem)
If x
and y
are conjugate in G
, return (true, z)
, where inv(z)*x*z == y
holds; otherwise, return (false, nothing)
. If the conjugating element z
is not needed, use is_conjugate(G::GAPGroup, x::GAPGroupElem, y::GAPGroupElem)
.
is_conjugate_with_data
— Methodis_conjugate_with_data(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)
. The conjugate group H^z
is defined as $\{ z^{-1} h z; h \in H \}$. If the conjugating element z
is not needed, use is_conjugate(G::GAPGroup, H::GAPGroup, K::GAPGroup)
.
Examples
julia> G = symmetric_group(4);
julia> H = sub(G, [G([2, 1, 3, 4])])[1]
Permutation group of degree 4
julia> K = sub(G, [G([1, 2, 4, 3])])[1]
Permutation group of degree 4
julia> is_conjugate_with_data(G, H, K)
(true, (1,3)(2,4))
julia> K = sub(G, [G([2, 1, 4, 3])])[1]
Permutation group of degree 4
julia> is_conjugate_with_data(G, H, K)
(false, nothing)
centralizer
— Methodcentralizer(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
.
centralizer
— Methodcentralizer(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
.
normalizer
— Methodnormalizer(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
.
normalizer
— Methodnormalizer(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
.
core
— Methodcore(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
.
normal_closure
— Methodnormal_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
.
GroupConjClass
— TypeGroupConjClass{T, S}
It can be either the conjugacy class of an element or of a subgroup of type S
in a group G
of type T
.
representative
— Methodrepresentative(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]))
Conjugacy class of
(1,2) in
Sym(4)
julia> representative(C)
(1,2)
acting_group
— Methodacting_group(C::GroupConjClass)
Return the acting group of C
.
Examples
julia> G = symmetric_group(4);
julia> C = conjugacy_class(G, G([2, 1, 3, 4]))
Conjugacy class of
(1,2) in
Sym(4)
julia> acting_group(C) === G
true
number_of_conjugacy_classes
— Methodnumber_of_conjugacy_classes(G::GAPGroup)
Return the number of conjugacy classes of elements in G
.
conjugacy_class
— Methodconjugacy_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]))
Conjugacy class of
(1,2) in
Sym(4)
conjugacy_class
— Methodconjugacy_class(G::Group, H::Group) -> GroupConjClass
Return the subgroup conjugacy class cc
of H
in G
, where H
= representative
(cc
).
conjugacy_classes
— Methodconjugacy_classes(G::Group)
Return a vector of all conjugacy classes of elements in G
. It is guaranteed that the class of the identity is in the first position.
complement_classes
— Functioncomplement_classes(G::GAPGroup, N::GAPGroup)
Return a vector of the conjugacy classes of complements of the normal subgroup N
in G
. This function may throw 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_classes(G, derived_subgroup(G)[1])
1-element Vector{GAPGroupConjClass{PermGroup, PermGroup}}:
Conjugacy class of permutation group in G
julia> G = dihedral_group(8)
Pc group of order 8
julia> complement_classes(G, center(G)[1])
GAPGroupConjClass{PcGroup, SubPcGroup}[]
hall_subgroup_classes
— Functionhall_subgroup_classes(G::Group, P::AbstractVector{<:IntegerUnion})
Return a vector that contains the 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_classes(g, [2, 3]);
julia> (length(h), order(representative(h[1])))
(1, 6)
julia> g = GL(3, 2)
GL(3,2)
julia> h = hall_subgroup_classes(g, [2, 3]);
julia> (length(h), order(representative(h[1])))
(2, 24)
julia> h = hall_subgroup_classes(g, [2, 7]); length(h)
0
low_index_subgroup_classes
— Functionlow_index_subgroup_classes(G::GAPGroup, n::Int)
Return a vector of conjugacy classes of subgroups of index at most n
in G
.
Examples
julia> G = symmetric_group(5);
julia> low_index_subgroup_classes(G, 5)
3-element Vector{GAPGroupConjClass{PermGroup, PermGroup}}:
Conjugacy class of Sym(5) in G
Conjugacy class of permutation group in G
Conjugacy class of Alt(5) in G
maximal_subgroup_classes
— Methodmaximal_subgroup_classes(G::Group)
Return a vector of all conjugacy classes of maximal subgroups of G
.
Examples
julia> G = symmetric_group(3);
julia> maximal_subgroup_classes(G)
2-element Vector{GAPGroupConjClass{PermGroup, PermGroup}}:
Conjugacy class of permutation group in G
Conjugacy class of permutation group in G
subgroup_classes
— Methodsubgroup_classes(G::GAPGroup; order::T = ZZRingElem(-1)) where T <: IntegerUnion
Return a vector of all conjugacy classes of subgroups of G
or, if order
is positive, the classes of subgroups of this order.
Examples
julia> G = symmetric_group(3)
Sym(3)
julia> subgroup_classes(G)
4-element Vector{GAPGroupConjClass{PermGroup, PermGroup}}:
Conjugacy class of permutation group in G
Conjugacy class of permutation group in G
Conjugacy class of permutation group in G
Conjugacy class of permutation group in G
julia> subgroup_classes(G, order = ZZRingElem(2))
1-element Vector{GAPGroupConjClass{PermGroup, PermGroup}}:
Conjugacy class of permutation group in G
Cosets (left/right/double)
GroupCoset
— TypeGroupCoset{TG <: GAPGroup, TH <: GAPGroup, S <: GAPGroupElem}
Type of right and left cosets of subgroups in groups.
For an element $g$ in a group $G$, and a subgroup $H$ of $G$, the set $Hg = \{ hg; h \in H \}$ is a right coset of $H$ in $G$, and the set $gH = \{ gh; h \in H \}$ is a left coset of $H$ in $G$.
group(C::GroupCoset)
returns $G$.acting_group(C::GroupCoset)
returns $H$.representative(C::GroupCoset)
returns an element (the same element for each call) ofC
.is_right(C::GroupCoset)
andis_left(C::GroupCoset)
return whetherC
is a right or left coset, respectively.
Two cosets are equal if and only if they are both left or right, respectively, and they contain the same elements.
group
— Methodgroup(C::GroupCoset)
Return the group G
that is the parent of all elements in C
. That is, C
is a left or right coset of a subgroup of G
in G
.
Examples
julia> G = symmetric_group(5)
Sym(5)
julia> H = sylow_subgroup(G, 2)[1]
Permutation group of degree 5 and order 8
julia> C = right_coset(H, gen(G, 1))
Right coset of permutation group of degree 5 and order 8
with representative (1,2,3,4,5)
in Sym(5)
julia> group(C) == G
true
acting_group
— Methodacting_group(C::GroupCoset)
Return the group H
such that C
is Hx
(if C
is a right coset) or xH
(if C
is a left coset), for an element x
in C
.
Examples
julia> G = symmetric_group(5)
Sym(5)
julia> H = symmetric_group(3)
Sym(3)
julia> C = right_coset(H, gen(G, 1))
Right coset of Sym(3)
with representative (1,2,3,4,5)
in Sym(5)
julia> acting_group(C) == H
true
representative
— Methodrepresentative(C::GroupCoset)
Return an element x
in group(C)
such that C
= Hx
(if C
is a right coset) or xH
(if C
is a left coset).
Examples
julia> G = symmetric_group(5)
Sym(5)
julia> g = perm(G,[3,4,1,5,2])
(1,3)(2,4,5)
julia> H = symmetric_group(3)
Sym(3)
julia> Hg = right_coset(H, g)
Right coset of Sym(3)
with representative (1,3)(2,4,5)
in Sym(5)
julia> representative(Hg)
(1,3)(2,4,5)
right_coset
— Methodright_coset(H::Group, g::GAPGroupElem)
*(H::Group, g::GAPGroupElem)
Return the coset Hg
.
Examples
julia> G = symmetric_group(5)
Sym(5)
julia> g = perm(G,[3,4,1,5,2])
(1,3)(2,4,5)
julia> H = symmetric_group(3)
Sym(3)
julia> right_coset(H, g)
Right coset of Sym(3)
with representative (1,3)(2,4,5)
in Sym(5)
left_coset
— Methodleft_coset(H::Group, g::GAPGroupElem)
*(g::GAPGroupElem, H::Group)
Return the coset gH
.
Since GAP supports right cosets only, the underlying GAP object of left_coset(H,g)
, if assigned, 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(3)
julia> gH = left_coset(H, g)
Left coset of Sym(3)
with representative (1,3)(2,4,5)
in Sym(5)
is_right
— Methodis_right(c::GroupCoset)
Return whether the coset c
is a right coset of its acting domain.
is_left
— Methodis_left(c::GroupCoset)
Return whether the coset c
is a left coset of its acting domain.
right_cosets
— Methodright_cosets(G::GAPGroup, H::GAPGroup; check::Bool=true)
Return the G-set that describes the right cosets of H
in G
.
If check == false
, do not check whether H
is a subgroup of G
.
Use right_transversal
to compute the vector of coset representatives.
Examples
julia> G = symmetric_group(4)
Sym(4)
julia> H = symmetric_group(3)
Sym(3)
julia> rc = right_cosets(G, H)
Right cosets of
Sym(3) in
Sym(4)
julia> collect(rc)
4-element Vector{GroupCoset{PermGroup, PermGroup, PermGroupElem}}:
Right coset of H with representative ()
Right coset of H with representative (1,4)
Right coset of H with representative (1,4,2)
Right coset of H with representative (1,4,3)
left_cosets
— Methodleft_cosets(G::GAPGroup, H::GAPGroup; check::Bool=true)
Return the G-set that describes the left cosets of H
in G
.
If check == false
, do not check whether H
is a subgroup of G
.
Use left_transversal
to compute the vector of coset representatives.
Examples
julia> G = symmetric_group(4)
Sym(4)
julia> H = symmetric_group(3)
Sym(3)
julia> left_cosets(G, H)
Left cosets of
Sym(3) in
Sym(4)
right_transversal
— Methodright_transversal(G::GAPGroup, H::GAPGroup; check::Bool=true)
Return a vector containing a complete set of representatives for the right cosets of H
in G
. This vector is not mutable, and it does not store its entries explicitly, they are created anew with each access to the transversal.
If check == false
, do not check whether H
is a subgroup of G
.
Use right_cosets
to compute the G-set of right cosets.
Examples
julia> G = symmetric_group(4)
Sym(4)
julia> H = symmetric_group(3)
Sym(3)
julia> T = right_transversal(G, H)
Right transversal of length 4 of
Sym(3) in
Sym(4)
julia> collect(T)
4-element Vector{PermGroupElem}:
()
(1,4)
(1,4,2)
(1,4,3)
left_transversal
— Methodleft_transversal(G::GAPGroup, H::GAPGroup; check::Bool=true)
Return a vector containing a complete set of representatives for the left cosets for H
in G
. This vector is not mutable, and it does not store its entries explicitly, they are created anew with each access to the transversal.
If check == false
, do not check whether H
is a subgroup of G
.
Use left_cosets
to compute the G-set of left cosets.
Examples
julia> G = symmetric_group(4)
Sym(4)
julia> H = symmetric_group(3)
Sym(3)
julia> T = left_transversal(G, H)
Left transversal of length 4 of
Sym(3) in
Sym(4)
julia> collect(T)
4-element Vector{PermGroupElem}:
()
(1,4)
(1,2,4)
(1,3,4)
is_bicoset
— Methodis_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 acting_group(C)
.
Examples
julia> G = symmetric_group(5)
Sym(5)
julia> H = symmetric_group(4)
Sym(4)
julia> g = perm(G,[3,4,1,5,2])
(1,3)(2,4,5)
julia> gH = left_coset(H, g)
Left coset of Sym(4)
with representative (1,3)(2,4,5)
in Sym(5)
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 of Sym(4)
with representative (1,2)(3,4)
in Sym(5)
julia> is_bicoset(fH)
true
GroupDoubleCoset
— TypeGroupDoubleCoset{T<: Group, S <: GAPGroupElem}
Type of double cosets of subgroups in groups.
For an element $g$ in a group $G$, and two subgroups $H$, $K$ of $G$, the set $HgK = \{ hgk; h \in H, k \in K \}$ is a $H-K$-double coset in $G$.
group(C::GroupDoubleCoset)
returns $G$.left_acting_group(C::GroupDoubleCoset)
returns $H$.right_acting_group(C::GroupDoubleCoset)
returns $H$.representative(C::GroupDoubleCoset)
returns an element (the same element for each call) ofC
.
Two double cosets are equal if and only if they contain the same elements.
group
— Methodgroup(C::GroupDoubleCoset)
Return the group G
that is the parent of all elements in C
. That is, C
is a double coset of two subgroups of G
in G
.
Examples
julia> G = symmetric_group(5)
Sym(5)
julia> H = symmetric_group(3); K = symmetric_group(2);
julia> HgK = double_coset(H, gen(G, 1), K)
Double coset of Sym(3)
and Sym(2)
with representative (1,2,3,4,5)
in Sym(5)
julia> group(HgK) == G
true
left_acting_group
— Methodleft_acting_group(C::GroupDoubleCoset)
Return H
if C
= HxK
.
Examples
julia> G = symmetric_group(5)
Sym(5)
julia> H = symmetric_group(3); K = symmetric_group(2);
julia> HgK = double_coset(H, gen(G, 1), K)
Double coset of Sym(3)
and Sym(2)
with representative (1,2,3,4,5)
in Sym(5)
julia> left_acting_group(HgK) == H
true
right_acting_group
— Methodright_acting_group(C::GroupDoubleCoset)
Return K
if C
= HxK
.
Examples
julia> G = symmetric_group(5)
Sym(5)
julia> H = symmetric_group(3); K = symmetric_group(2);
julia> HgK = double_coset(H, gen(G, 1), K)
Double coset of Sym(3)
and Sym(2)
with representative (1,2,3,4,5)
in Sym(5)
julia> right_acting_group(HgK) == K
true
representative
— Methodrepresentative(C::GroupDoubleCoset)
Return an element x
of the double coset C
= HxK
.
Examples
julia> G = symmetric_group(5)
Sym(5)
julia> H = symmetric_group(3); K = symmetric_group(2);
julia> HgK = double_coset(H, gen(G, 1), K)
Double coset of Sym(3)
and Sym(2)
with representative (1,2,3,4,5)
in Sym(5)
julia> representative(HgK)
(1,2,3,4,5)
double_coset
— Methoddouble_coset(H::Group, x::GAPGroupElem, K::Group)
*(H::Group, x::GAPGroupElem, K::Group)
Return the double coset HxK
.
Examples
julia> G = symmetric_group(5)
Sym(5)
julia> g = perm(G,[3,4,5,1,2])
(1,3,5,2,4)
julia> H = symmetric_group(3)
Sym(3)
julia> K = symmetric_group(2)
Sym(2)
julia> double_coset(H,g,K)
Double coset of Sym(3)
and Sym(2)
with representative (1,3,5,2,4)
in Sym(5)
double_cosets
— Methoddouble_cosets(G::GAPGroup, H::GAPGroup, K::GAPGroup; check::Bool=true)
Return a 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(4)
julia> H = symmetric_group(3)
Sym(3)
julia> K = symmetric_group(2)
Sym(2)
julia> double_cosets(G,H,K)
3-element Vector{GroupDoubleCoset{PermGroup, PermGroupElem}}:
Double coset of H and K with representative ()
Double coset of H and K with representative (1,4)
Double coset of H and K with representative (1,4,3)
order
— Methodorder(::Type{T} = ZZRingElem, C::Union{GroupCoset,GroupDoubleCoset})
Return the cardinality of the (double) coset C
, as an instance of the type T
.
rand
— Methodrand(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
.