Group homomorphisms
In OSCAR, a group homomorphism from G to H is an object of parametric type GAPGroupHomomorphism{S,T}, where S and T are the types of G and H respectively.
A homomorphism from G to H can be defined in two ways.
- Writing explicitly the images of the generators of
G:
f = hom(G,H,[x1,x2,...],[y1,y2,...])Here, [x1,x2,...] must be a generating set for G (not necessarily minimal) and [y1,y2,...] is a vector of elements of H of the same length of [x1,x2,...]. This assigns to f the value of the group homomorphism sending x_i into y_i.
An exception is thrown if such a homomorphism does not exist.
- Taking an existing function
gsatisfying the group homomorphism properties:
f = hom(G,H,g)An exception is thrown if the function g does not define a group homomorphism.
Example: The following procedures define the same homomorphism (conjugation by x) in the two ways explained above.
julia> S = symmetric_group(4)
Symmetric group of degree 4
julia> x = S[1]
(1,2,3,4)
julia> f = hom(S, S, [S[1]^x, S[2]^x])
Group homomorphism
from symmetric group of degree 4
to symmetric group of degree 4
julia> g = hom(S, S, y -> y^x)
Group homomorphism
from symmetric group of degree 4
to symmetric group of degree 4
julia> f == g
truehom — Method
hom(G::Group, H::Group, gensG::Vector = gens(G), imgs::Vector; check::Bool = true)Return the group homomorphism defined by gensG[i] -> imgs[i] for every i. In order to work, the elements of gensG must generate G.
If check is set to false then it is not checked whether the mapping defines a group homomorphism.
preimage — Method
preimage(f::GAPGroupHomomorphism, x::GAPGroupElem)Return an element y in the domain of f with the property f(y) == x. See has_preimage_with_preimage(f::GAPGroupHomomorphism, x::GAPGroupElem; check::Bool = true) for a check whether x has such a preimage.
restrict_homomorphism — Method
restrict_homomorphism(f::GAPGroupHomomorphism, H::Group)
restrict_homomorphism(f::GAPGroupElem{AutomorphismGroup{T}}, H::T) where T <: GroupReturn the restriction of f to H. An exception is thrown if H is not a subgroup of domain(f).
OSCAR has also the following standard homomorphism.
trivial_morphism — Function
trivial_morphism(G::GAPGroup, H::GAPGroup = G)Return the homomorphism from G to H sending every element of G into the identity of H.
To evaluate the homomorphism f in the element x of G, it is possible to use the instruction
image(f,x)or the more compact notations f(x) and x^f.
Example:
julia> S = symmetric_group(4)
Symmetric group of degree 4
julia> f = hom(S, S, x->x^S[1])
Group homomorphism
from symmetric group of degree 4
to symmetric group of degree 4
julia> x = cperm(S, [1,2])
(1,2)
julia> image(f, x)
(2,3)
julia> f(x)
(2,3)
julia> x^f
(2,3)A sort of "inverse" of the evaluation is the following
has_preimage_with_preimage — Method
has_preimage_with_preimage(f::GAPGroupHomomorphism, x::GAPGroupElem; check::Bool = true)Return (true, y) if there exists y in domain(f) such that f(y) = x holds; otherwise, return (false, o) where o is the identity of domain(f).
If check is set to false then the test whether x is an element of image(f) is omitted.
Example:
julia> S=symmetric_group(4);
julia> f=hom(S,S,x->x^S[1]);
julia> x=cperm(S,[1,2]);
julia> has_preimage_with_preimage(f,x)
(true, (1,4))Operations on homomorphisms
OSCAR supports the following operations on homomorphisms.
inv(f)= the inverse off. An exception is thrown iffis not bijective.f^n= the homomorphismfcomposedntimes with itself. An exception is thrown if the domain and the codomain offdo not coincide (unlessn=1). Ifnis negative, the result is the inverse offcomposedntimes with itself.compose(f, g)= composition offandg. This works only if the codomain offcoincides with the domain ofg. Shorter equivalent expressions aref*gandg(f).Example:
julia> S = symmetric_group(4)
Symmetric group of degree 4
julia> f = hom(S, S, x->x^S[1])
Group homomorphism
from symmetric group of degree 4
to symmetric group of degree 4
julia> g = hom(S, S, x->x^S[2])
Group homomorphism
from symmetric group of degree 4
to symmetric group of degree 4
julia> f*g == hom(S, S, x->x^(S[1]*S[2]))
true
julia> f == f^-3
trueThe composition operation * has to be read from the right to the left. So, (f*g)(x) is equivalent to g(f(x)).
Properties of homomorphisms
OSCAR implements the following attributes of homomorphisms, in addition to the usual domain and codomain.
is_injective — Method
is_surjective — Method
is_bijective — Method
is_invertible — Method
is_invariant — Method
is_invariant(f::GAPGroupHomomorphism, H::GAPGroup)Return whether f(H) == H holds. An exception is thrown if domain(f) and codomain(f) are not equal or if H is not contained in domain(f).
Subgroups described by homomorphisms
The following functions compute subgroups or quotients of either the domain or the codomain. Analogously to the functions described in Sections Subgroups and Quotients, the output consists of a pair (H, g), where H is a subgroup (resp. quotient) and g is its embedding (resp. projection) homomorphism.
Group isomorphisms
For all functions that return group isomorphisms, we have the following rule about the direction of the result.
If two groups are given as inputs then the domain of the returned isomorphism is the first given group and the codomain is the second.
If one group is given then the domain of the result is this group, and the codomain is some new group constructed by the function.
is_isomorphic — Method
is_isomorphic(G::Group, H::Group)Return true if G and H are isomorphic groups, and false otherwise.
Examples
julia> is_isomorphic(symmetric_group(3), dihedral_group(6))
truesourceis_isomorphic_with_map — Method
is_isomorphic_with_map(G::Group, H::Group)Return (true,f) if G and H are isomorphic groups, where f is a group isomorphism. Otherwise, return (false,f), where f is the trivial homomorphism.
Examples
julia> is_isomorphic_with_map(symmetric_group(3), dihedral_group(6))
(true, Hom: Sym(3) -> pc group)sourceisomorphism — Method
isomorphism(G::Group, H::Group)Return a group isomorphism between G and H if they are isomorphic groups. Otherwise throw an exception.
Examples
julia> isomorphism(symmetric_group(3), dihedral_group(6))
Group homomorphism
from symmetric group of degree 3
to pc group of order 6sourceisomorphic_subgroups — Method
isomorphic_subgroups(H::Group, G::Group)Return a vector of injective group homomorphism from H to G, where the images are representatives of those conjugacy classes of subgroups of G that are isomorphic with H.
Examples
julia> isomorphic_subgroups(alternating_group(5), alternating_group(6))
2-element Vector{GAPGroupHomomorphism{PermGroup, PermGroup}}:
Hom: Alt(5) -> Alt(6)
Hom: Alt(5) -> Alt(6)
julia> isomorphic_subgroups(symmetric_group(4), alternating_group(5))
GAPGroupHomomorphism{PermGroup, PermGroup}[]sourceisomorphism — Method
isomorphism(::Type{T}, G::Group; on_gens=false) where T <: GroupReturn an isomorphism from G to a group H of type T. An exception is thrown if no such isomorphism exists.
If on_gens is true then gens(G) is guaranteed to correspond to gens(H); an exception is thrown if this is not possible.
Isomorphisms are usually cached in G, subsequent calls of isomorphism with the same T (and the same value of on_gens) yield identical results.
If only the image of such an isomorphism is needed, use T(G); but this will assume on_gens=false.
isomorphism — Method
isomorphism(::Type{FinGenAbGroup}, G::GAPGroup)Return a map from G to an isomorphic (additive) group of type FinGenAbGroup. An exception is thrown if G is not abelian or not finite.