Structural Computations
Abelian groups support a wide range of structural operations such as
enumeration of subgroups
(outer) direct products
tensor and
homconstructionsfree resolutions and general complexes
(co)-homology and tensor and
hom-functors
snf Method
snf(A::FinGenAbGroup) -> FinGenAbGroup, FinGenAbGroupHomReturn a pair
find_isomorphism Method
find_isomorphism(G, op, A::GrpAb) -> Dict, DictGiven an abelian group op, this functions returns isomorphisms
It is assumed that
Subgroups and Quotients
torsion_subgroup Method
torsion_subgroup(G::FinGenAbGroup) -> FinGenAbGroup, MapReturn the torsion subgroup of G.
sub Method
sub(G::FinGenAbGroup, s::Vector{FinGenAbGroupElem}) -> FinGenAbGroup, FinGenAbGroupHomCreate the subgroup s together with the injection
sub Method
sub(A::SMat, r::AbstractVector, c::AbstractVector) -> SMatReturn the submatrix of
sub(s::Vector{FinGenAbGroupElem}) -> FinGenAbGroup, FinGenAbGroupHomAssuming that the non-empty array s contains elements of an abelian group s together with the injection
sub Method
sub(G::FinGenAbGroup, M::ZZMatrix) -> FinGenAbGroup, FinGenAbGroupHomCreate the subgroup
sub Method
sub(G::FinGenAbGroup, n::ZZRingElem) -> FinGenAbGroup, FinGenAbGroupHomCreate the subgroup
sub Method
sub(G::FinGenAbGroup, n::Integer) -> FinGenAbGroup, MapCreate the subgroup
sylow_subgroup Method
sylow_subgroup(G::FinGenAbGroup, p::IntegerUnion) -> FinGenAbGroup, FinGenAbGroupHomReturn the Sylow G, for a prime p. This is the subgroup of p-power order in G whose index in G is coprime to p.
Examples
julia> A = abelian_group(ZZRingElem[2, 6, 30])
Z/2 x Z/6 x Z/30
julia> H, j = sylow_subgroup(A, 2);
julia> H
(Z/2)^3
julia> divexact(order(A), order(H))
45has_quotient Method
has_quotient(G::FinGenAbGroup, invariant::Vector{Int}) -> BoolGiven an abelian group
has_complement Method
has_complement(f::FinGenAbGroupHom) -> Bool, FinGenAbGroupHom
has_complement(U::FinGenAbGroup, G::FinGenAbGroup) -> Bool, FinGenAbGroupHomGiven a map representing a subgroup of a group U of a group G, return either true and an injection of a complement in
See also: is_pure
is_pure Method
is_pure(U::FinGenAbGroup, G::FinGenAbGroup) -> BoolA subgroup U of G is called pure if 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]
trueis_neat Method
is_neat(U::FinGenAbGroup, G::FinGenAbGroup) -> BoolA subgroup U of G is called neat if 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)
falsesaturate Method
saturate(U::FinGenAbGroup, G::FinGenAbGroup) -> FinGenAbGroupFor 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::FinGenAbGroup, p::Integer;
subtype = :all,
quotype = :all,
index = -1,
order = -1)Return an iterator for the subgroups of subtype (and quotype) is the type of the subgroup as an abelian
julia> G = abelian_group([6, 12])
Z/6 x Z/12
julia> shapes = MSet{Vector{ZZRingElem}}();
julia> for U = psubgroups(G, 2)
push!(shapes, elementary_divisors(U[1]))
end
julia> shapes
MSet{Vector{ZZRingElem}} with 8 elements:
ZZRingElem[]
ZZRingElem[2, 4]
ZZRingElem[4] : 2
ZZRingElem[2, 2]
ZZRingElem[2] : 3So there are ZZRingElem[4] : 2),
subgroups Method
subgroups(g::FinGenAbGroup;
subtype = :all ,
quotype = :all,
index = -1,
order = -1)Return an iterator for the subgroups of
julia> for U in subgroups(G, subtype = [2])
@show U[1], map(U[2], gens(U[1]))
end
(U[1], map(U[2], gens(U[1]))) = (Z/2, FinGenAbGroupElem[[0, 6]])
(U[1], map(U[2], gens(U[1]))) = (Z/2, FinGenAbGroupElem[[3, 6]])
(U[1], map(U[2], gens(U[1]))) = (Z/2, FinGenAbGroupElem[[3, 0]])
julia> for U in subgroups(G, quotype = [2])
@show U[1], map(U[2], gens(U[1]))
end
(U[1], map(U[2], gens(U[1]))) = (Finitely generated abelian group with 3 generators and 3 relations, FinGenAbGroupElem[[3, 3], [0, 4], [2, 0]])
(U[1], map(U[2], gens(U[1]))) = (Finitely generated abelian group with 3 generators and 3 relations, FinGenAbGroupElem[[0, 3], [0, 4], [2, 0]])
(U[1], map(U[2], gens(U[1]))) = (Finitely generated abelian group with 4 generators and 4 relations, FinGenAbGroupElem[[3, 6], [0, 6], [0, 4], [2, 0]])quo Method
quo(G::FinGenAbGroup, s::Vector{FinGenAbGroupElem}) -> FinGenAbGroup, GrpAbfinGemMapCreate the quotient
quo Method
quo(G::FinGenAbGroup, M::ZZMatrix) -> FinGenAbGroup, FinGenAbGroupHomCreate the quotient
quo Method
quo(G::FinGenAbGroup, n::Integer}) -> FinGenAbGroup, Map
quo(G::FinGenAbGroup, n::ZZRingElem}) -> FinGenAbGroup, MapReturns the quotient
quo Method
quo(G::FinGenAbGroup, n::Integer}) -> FinGenAbGroup, Map
quo(G::FinGenAbGroup, n::ZZRingElem}) -> FinGenAbGroup, MapReturns the quotient
quo Method
quo(G::FinGenAbGroup, U::FinGenAbGroup) -> FinGenAbGroup, MapCreate the quotient
For 2 subgroups U and V of the same group G, U+V returns the smallest subgroup of G containing both. Similarly, issubset = is_subgroup is that the inclusion map is also returned in the 2nd call.
intersect Method
intersect(mG::FinGenAbGroupHom, mH::FinGenAbGroupHom) -> FinGenAbGroup, MapGiven two injective maps of abelian groups with the same codomain
Direct Products
direct_product Method
direct_product(G::FinGenAbGroup...) -> FinGenAbGroup, Vector{FinGenAbGroupHom}Return the direct product
For finite abelian groups, finite direct sums and finite direct products agree and they are therefore called biproducts. If one wants to obtain direct_sum(G...). If one wants to obtain biproduct(G...).
Otherwise, one could also call canonical_injections(D) or canonical_projections(D) later on.
canonical_injection Method
canonical_injection(G::FinGenAbGroup, i::Int) -> FinGenAbGroupHomGiven a group
canonical_projection Method
canonical_projection(G::FinGenAbGroup, i::Int) -> FinGenAbGroupHomGiven a group
flat Method
flat(G::FinGenAbGroup) -> FinGenAbGroupHomGiven a group
Tensor Products
tensor_product Method
tensor_product(G::FinGenAbGroup...; task::Symbol = :map) -> FinGenAbGroup, MapGiven groups task is set to ":map", a map
hom_tensor Method
hom_tensor(G::FinGenAbGroup, H::FinGenAbGroup, A::Vector{ <: Map{FinGenAbGroup, FinGenAbGroup}}) -> MapGiven groups
Hom-Group
hom Method
hom(G::FinGenAbGroup, H::FinGenAbGroup; task::Symbol = :map) -> FinGenAbGroup, MapComputes the group of all homomorpisms from task is ":map", then a map task to ":none" to not compute the map.
