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)
trueis_subset — Methodis_subset(H::T, G::T) where T <: GAPGroupReturn 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)
falseis_subgroup — Methodis_subgroup(H::T, G::T) where T <: GAPGroupReturn (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::T, G::T) where T <: GAPGroup.
embedding — Methodembedding(H::T, G::T) where T <: GAPGroupReturn 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::T, H::T) where I <: IntegerUnion where T <: Union{GAPGroup, GrpAbFinGen}Return the index of H in G, as an instance of I.
is_maximal_subgroup — Methodis_maximal_subgroup(H::T, G::T; check::Bool = true) where T <: GAPGroupReturn 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 Gis_normalized_by — Methodis_normalized_by(H::T, G::T) where T <: GAPGroupReturn 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])
trueis_normal_subgroup — Methodis_normal_subgroup(H::T, G::T) where T <: GAPGroupReturn 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])
falseis_characteristic_subgroup — Methodis_characteristic_subgroup(H::T, G::T; check::Bool = true) where T <: GAPGroupReturn 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 GStandard 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.
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.
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 of G, i.e., the subgroup generated by all commutators of G.
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{T}) where T <: GroupIf 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.
subgroups — Methodsubgroups(G::Group)Return the vector of all subgroups of G.
normal_subgroups — Functionnormal_subgroups(G::Group)Return the vector of normal subgroups of G (see is_normal).
maximal_subgroups — Functionmaximal_subgroups(G::Group)Return the vector of maximal subgroups of G.
maximal_normal_subgroups — Functionmaximal_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.
minimal_normal_subgroups — Functionminimal_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.
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.
derived_series — Functionderived_series(G::GAPGroup)Return the vector $[ G_1, G_2, \ldots ]$, where $G_1 =$ G and $G_{i+1} =$ derived_subgroup$(G_i)$.
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_subgroup_reps — Functionhall_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
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_class_reps — Functioncomplement_class_reps(G::T, N::T) where T <: GAPGroupReturn a vector of representatives 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_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[]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.
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_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 x^$z$ equals y.
is_conjugate — Methodis_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
representative_action — Methodrepresentative_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).
representative_action — Methodrepresentative_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)
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. It is displayed as
cc = x ^ Gwhere G is a group and x = representative(cc) is either an element or a subgroup of G.
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]))
(1,2) ^ Sym( [ 1 .. 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]))
(1,2) ^ Sym( [ 1 .. 4 ] )
julia> acting_group(C) === G
true
number_conjugacy_classes — Methodnumber_conjugacy_classes(G::GAPGroup)Return the number of conjugacy classes of elements in G.
conjugacy_class — Methodconjugacy_class(G::Group, g::GAPGroupElem) -> GroupConjClassReturn 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 ] )
conjugacy_class — Methodconjugacy_class(G::T, H::T) where T<:Group -> GroupConjClassReturn the subgroup conjugacy class cc of H in G, where H = representative(cc).
conjugacy_classes — Methodconjugacy_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.
conjugacy_classes_subgroups — Methodconjugacy_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{GAPGroupConjClass{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 ] )
conjugacy_classes_maximal_subgroups — Methodconjugacy_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{GAPGroupConjClass{PermGroup, PermGroup}}:
Group([ (1,2,3) ]) ^ Sym( [ 1 .. 3 ] )
Group([ (2,3) ]) ^ Sym( [ 1 .. 3 ] )
Cosets (left/right/double)
GroupCoset — TypeGroupCoset{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.
right_coset — Methodright_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 ] )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) 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 ] )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.
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 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)
trueacting_domain — Methodacting_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 ] )representative — Methodrepresentative(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)right_cosets — Methodright_cosets(G::T, H::T; check::Bool=true) where T<: GAPGroupReturn the vector of the right cosets of H in G.
If check == false, do not check whether H is a subgroup of 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)left_cosets — Methodleft_cosets(G::T, H::T; check::Bool=true) where T<: GAPGroupReturn the vector of the left cosets of H in G.
If check == false, do not check whether H is a subgroup of 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 ] )right_transversal — Methodright_transversal(G::T, H::T; check::Bool=true) where T<: GAPGroupReturn a vector containing a complete set of representatives for the right cosets of H in G.
If check == false, do not check whether H is a subgroup of G.
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)left_transversal — Methodleft_transversal(G::T, H::T; check::Bool=true) where T<: GroupReturn a vector containing a complete set of representatives for the left cosets for H in G.
If check == false, do not check whether H is a subgroup of G.
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)GroupDoubleCoset — TypeGroupDoubleCoset{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.
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( [ 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 ] )double_cosets — Methoddouble_cosets(G::T, H::T, K::T; check::Bool=true) where T<: GAPGroupReturn 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 ] )left_acting_group — Methodleft_acting_group(C::GroupDoubleCoset)Given a double coset C = HxK, return H.
right_acting_group — Methodright_acting_group(C::GroupDoubleCoset)Given a double coset C = HxK, return K.
representative — Methodrepresentative(C::GroupDoubleCoset)Return a representative x of the double coset C = HxK.
order — Methodorder(C::Union{GroupCoset,GroupDoubleCoset})Return the cardinality of the (double) coset C.
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.
intersect — Methodintersect(V::AbstractVector{Union{T, GroupCoset, GroupDoubleCoset}}) where T <: GAPGroupReturn a vector containing all elements belonging to all groups and cosets in V.