Structural Computations
Structural Computations
Abelian groups support a wide range of structural operations such as
- enumeration of subgroups
- (outer) direct products
- tensor and
homconstructions - free resolutions and general complexes
- (co)-homology and tensor and
hom-functors
#
snf — Method.
snf(A::GrpAbFinGen) -> GrpAbFinGen, GrpAbFinGenMap
Returns a pair , where is an abelian group in canonical Smith normal form isomorphic to and an isomorphism .
#
find_isomorphism — Method.
find_isomorphism(G, op, A::GrpAb) -> Dict, Dict
Given an abelian group and a collection which is an abelian group with the operation op, this functions returns isomorphisms and encoded as dictionaries.
It is assumed that and are isomorphic.
Subgroups and Quotients
#
torsion_subgroup — Method.
torsion_subgroup(G::GrpAbFinGen) -> GrpAbFinGen, Map
Returns the torsion subgroup of G.
#
sub — Method.
sub(G::GrpAbFinGen, s::Vector{GrpAbFinGenElem}) -> GrpAbFinGen, Map
Create the subgroup of generated by the elements in s together with the injection .
#
sub — Method.
sub(s::Vector{GrpAbFinGenElem}) -> GrpAbFinGen, Map
Assuming that the non-empty array s contains elements of an abelian group , this functions returns the subgroup of generated by the elements in s together with the injection .
sub(A::SMat, r::UnitRange, c::UnitRange) -> SMat
Return the submatrix of , where the rows correspond to and the columns correspond to .
#
sub — Method.
sub(G::GrpAbFinGen, M::fmpz_mat) -> GrpAbFinGen, Map
Create the subgroup of generated by the elements corresponding to the rows of together with the injection .
#
sub — Method.
sub(G::GrpAbFinGen, n::fmpz) -> GrpAbFinGen, Map
Create the subgroup of together with the injection .
#
sub — Method.
sub(G::GrpAbFinGen, n::Integer) -> GrpAbFinGen, Map
Create the subgroup of together with the injection .
#
psylow_subgroup — Method.
psylow_subgroup(G::GrpAbFinGen, p::IntegerUnion) -> GrpAbFinGen, Map
Returns the -Sylow subgroup of G.
#
has_quotient — Method.
has_quotient(G::GrpAbFinGen, invariant::Vector{Int}) -> Bool
Given an abelian group , returns true if it has a quotient with given elementary divisors and false otherwise.
#
has_complement — Method.
has_complement(f::GrpAbFinGenMap) -> Bool, GrpAbFinGenMap
has_complement(U::GrpAbFinGen, G::GrpAbFinGen) -> Bool, GrpAbFinGen
Given a map representing a subgroup of a group , or a subgroup U of a group G, returns either true and an injection of a complement in , or false.
See also: is_pure
#
is_pure — Method.
is_pure(U::GrpAbFinGen, G::GrpAbFinGen) -> Bool
A subgroup U of G is called pure iff for all n an element in U that is in the image of the multiplication by n map of G is also a multiple of an element in U.
For finite abelian groups this is equivalent to U having a complement in G. They are also know as isolated subgroups and serving subgroups.
See also: is_neat, has_complement
EXAMPLES
julia> G = abelian_group([2, 8]);
julia> U, _ = sub(G, [G[1]+2*G[2]]);
julia> is_pure(U, G)
false
julia> U, _ = sub(G, [G[1]+4*G[2]]);
julia> is_pure(U)
true
julia> has_complement(U, G)[1]
true
#
is_neat — Method.
is_neat(U::GrpAbFinGen, G::GrpAbFinGen) -> Bool
A subgroup U of G is called neat iff for all primes p an element in U that is in the image of the multiplication by p map of G is also a multiple of an element in U.
See also: is_pure
EXAMPLES
julia> G = abelian_group([2, 8]);
julia> U, _ = sub(G, [G[1] + 2*G[2]]);
julia> is_neat(U, G)
true
julia> is_pure(U, G)
false
#
saturate — Method.
saturate(U::GrpAbFinGen, G::GrpAbFinGen) -> GrpAbFinGen
For a subgroup U of G find a minimal overgroup that is pure, and thus has a complement.
See also: is_pure, has_complement
A sophisticated algorithm for the enumeration of all (or selected) subgroups of a finite abelian group is available.
#
psubgroups — Method.
psubgroups(g::GrpAbFinGen, p::Integer;
subtype = :all,
quotype = :all,
index = -1,
order = -1)
Return an iterator for the subgroups of of the specific form. Note that subtype (and quotype) is the type of the subgroup as an abelian -group.
julia> G = abelian_group([6, 12])
GrpAb: Z/6 x Z/12
julia> shapes = MSet{Vector{fmpz}}()
MSet{Vector{fmpz}}()
julia> for U = psubgroups(G, 2)
push!(shapes, elementary_divisors(U[1]))
end
julia> shapes
MSet(fmpz[4] : 2, fmpz[1], fmpz[2, 4], fmpz[2] : 3, fmpz[2, 2])
So there are subgroups isomorphic to (fmpz[4] : 2), isomorphic to , 1 trivial and
subgroups.
#
subgroups — Method.
subgroups(g::GrpAbFinGen;
subtype = :all ,
quotype = :all,
index = -1,
order = -1)
Return an iterator for the subgroups of of the specific form.
julia> for U = subgroups(G, subtype = [2])
@show U[1], map(U[2], gens(U[1]))
end
(U[1], map(U[2], gens(U[1]))) = (GrpAb: Z/2, GrpAbFinGenElem[Element of
GrpAb: Z/6 x Z/12
with components [0 6]])
(U[1], map(U[2], gens(U[1]))) = (GrpAb: Z/2, GrpAbFinGenElem[Element of
GrpAb: Z/6 x Z/12
with components [3 6]])
(U[1], map(U[2], gens(U[1]))) = (GrpAb: Z/2, GrpAbFinGenElem[Element of
GrpAb: Z/6 x Z/12
with components [3 0]])
julia> for U = subgroups(G, quotype = [2])
@show U[1], map(U[2], gens(U[1]))
end
(U[1], map(U[2], gens(U[1]))) = ((General) abelian group with relation matrix
[4 0 0; 0 3 0; 0 0 3], GrpAbFinGenElem[Element of
GrpAb: Z/6 x Z/12
with components [3 3], Element of
GrpAb: Z/6 x Z/12
with components [0 4], Element of
GrpAb: Z/6 x Z/12
with components [2 0]])
(U[1], map(U[2], gens(U[1]))) = ((General) abelian group with relation matrix
[4 0 0; 0 3 0; 0 0 3], GrpAbFinGenElem[Element of
GrpAb: Z/6 x Z/12
with components [0 3], Element of
GrpAb: Z/6 x Z/12
with components [0 4], Element of
GrpAb: Z/6 x Z/12
with components [2 0]])
(U[1], map(U[2], gens(U[1]))) = ((General) abelian group with relation matrix
[2 0 0 0; 0 2 0 0; 0 0 3 0; 0 0 0 3], GrpAbFinGenElem[Element of
GrpAb: Z/6 x Z/12
with components [3 6], Element of
GrpAb: Z/6 x Z/12
with components [0 6], Element of
GrpAb: Z/6 x Z/12
with components [0 4], Element of
GrpAb: Z/6 x Z/12
with components [2 0]])
#
quo — Method.
quo(G::GrpAbFinGen, s::Vector{GrpAbFinGenElem}) -> GrpAbFinGen, Map
Create the quotient of by the subgroup generated by the elements in , together with the projection .
#
quo — Method.
quo(G::GrpAbFinGen, M::fmpz_mat) -> GrpAbFinGen, Map
Create the quotient of by the subgroup generated by the elements corresponding to the rows of , together with the projection .
#
quo — Method.
quo(G::GrpAbFinGen, n::Integer}) -> GrpAbFinGen, Map
quo(G::GrpAbFinGen, n::fmpz}) -> GrpAbFinGen, Map
Returns the quotient together with the projection .
#
quo — Method.
quo(G::GrpAbFinGen, n::Integer}) -> GrpAbFinGen, Map
quo(G::GrpAbFinGen, n::fmpz}) -> GrpAbFinGen, Map
Returns the quotient together with the projection .
#
quo — Method.
quo(G::GrpAbFinGen, U::GrpAbFinGen) -> GrpAbFinGen, Map
Create the quotient of by , together with the projection .
For 2 subgroups U and V of the same group G, U+V returns the smallest subgroup of G containing both. Similarly, computes the intersection and U \subset V tests for inclusion. The difference between issubset = and is_subgroup is that the inclusion map is also returned in the 2nd call.
#
intersect — Method.
intersect(mG::GrpAbFinGenMap, mH::GrpAbFinGenMap) -> GrpAbFinGen, Map
Given two injective maps of abelian groups with the same codomain , return the intersection of the images as a subgroup of .
Direct Products
#
direct_product — Method.
direct_product(G::GrpAbFinGen...; task::Symbol = :prod) -> GrpAbFinGen, GrpAbFinGenMap, GrpAbFinGenMap
Returns the direct product of the abelian groups . task can be ":sum", ":prod", ":both" or ":none" and determines which canonical maps are computed as well: ":sum" for the injections, ":prod" for the projections.
#
canonical_injection — Method.
canonical_injection(G::GrpAbFinGen, i::Int) -> Map
Given a group that was created as a direct product, return the injection from the th component.
#
canonical_projection — Method.
canonical_projection(G::GrpAbFinGen, i::Int) -> Map
Given a group that was created as a direct product, return the projection onto the th component.
#
flat — Method.
flat(G::GrpAbFinGen) -> GrpAbFinGen, Map
Given a group that is created using (iterated) direct products, or (iterated) tensor product, return a group that is a flat product: is returned as , (resp. ) together with the isomorphism.
Tensor Producs
#
tensor_product — Method.
tensor_product(G::GrpAbFinGen...; task::Symbol = :map) -> GrpAbFinGen, Map
Given groups , compute the tensor product . If task is set to ":map", a map is returned that maps tuples in to pure tensors . The map admits a preimage as well.
<a id='hom-Tuple{GrpAbFinGen, GrpAbFinGen, Vector{<:Map{GrpAbFinGen, GrpAbFinGen}}}' href='#hom-Tuple{GrpAbFinGen, GrpAbFinGen, Vector{<:Map{GrpAbFinGen, GrpAbFinGen}}}'>#
hom — Method.
hom(G::GrpAbFinGen, H::GrpAbFinGen, A::Vector{ <: Map{GrpAbFinGen, GrpAbFinGen}}) -> Map
Given groups and as well as maps , compute the tensor product of the maps.
Hom-Group
#
hom — Method.
hom(G::GrpAbFinGen, H::GrpAbFinGen; task::Symbol = :map) -> GrpAbFinGen, Map
Computes the group of all homomorpisms from to as an abstract group. If task is ":map", then a map is computed that can be used to obtain actual homomorphisms. This map also allows preimages. Set task to ":none" to not compute the map.