Structural Computations
Abelian groups support a wide range of structural operations such as
enumeration of subgroups
(outer) direct products
tensor and
hom
constructionsfree resolutions and general complexes
(co)-homology and tensor and
hom
-functors
snf Method
snf(A::FinGenAbGroup) -> FinGenAbGroup, FinGenAbGroupHom
Return a pair
find_isomorphism Method
find_isomorphism(G, op, A::GrpAb) -> Dict, Dict
Given an abelian group op
, this functions returns isomorphisms
It is assumed that
Subgroups and Quotients
torsion_subgroup Method
torsion_subgroup(G::FinGenAbGroup) -> FinGenAbGroup, Map
Return the torsion subgroup of G
.
sub Method
sub(G::FinGenAbGroup, s::Vector{FinGenAbGroupElem}) -> FinGenAbGroup, FinGenAbGroupHom
Create the subgroup s
together with the injection
sub Method
sub(A::SMat, r::AbstractUnitRange, c::AbstractUnitRange) -> SMat
Return the submatrix of
sub(s::Vector{FinGenAbGroupElem}) -> FinGenAbGroup, FinGenAbGroupHom
Assuming 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, FinGenAbGroupHom
Create the subgroup
sub Method
sub(G::FinGenAbGroup, n::ZZRingElem) -> FinGenAbGroup, FinGenAbGroupHom
Create the subgroup
sub Method
sub(G::FinGenAbGroup, n::Integer) -> FinGenAbGroup, Map
Create the subgroup
sylow_subgroup Method
sylow_subgroup(G::FinGenAbGroup, p::IntegerUnion) -> FinGenAbGroup, FinGenAbGroupHom
Return 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))
45
has_quotient Method
has_quotient(G::FinGenAbGroup, invariant::Vector{Int}) -> Bool
Given an abelian group
has_complement Method
has_complement(f::FinGenAbGroupHom) -> Bool, FinGenAbGroupHom
has_complement(U::FinGenAbGroup, G::FinGenAbGroup) -> Bool, FinGenAbGroupHom
Given 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) -> Bool
A 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]
true
is_neat Method
is_neat(U::FinGenAbGroup, G::FinGenAbGroup) -> Bool
A 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)
false
saturate Method
saturate(U::FinGenAbGroup, G::FinGenAbGroup) -> FinGenAbGroup
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::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}}()
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[4] : 2
ZZRingElem[2, 4]
ZZRingElem[2] : 3
ZZRingElem[2, 2]
So 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 = 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 = 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, GrpAbfinGemMap
Create the quotient
quo Method
quo(G::FinGenAbGroup, M::ZZMatrix) -> FinGenAbGroup, FinGenAbGroupHom
Create the quotient
quo Method
quo(G::FinGenAbGroup, n::Integer}) -> FinGenAbGroup, Map
quo(G::FinGenAbGroup, n::ZZRingElem}) -> FinGenAbGroup, Map
Returns the quotient
quo Method
quo(G::FinGenAbGroup, n::Integer}) -> FinGenAbGroup, Map
quo(G::FinGenAbGroup, n::ZZRingElem}) -> FinGenAbGroup, Map
Returns the quotient
quo Method
quo(G::FinGenAbGroup, U::FinGenAbGroup) -> FinGenAbGroup, Map
Create 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, Map
Given 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) -> FinGenAbGroupHom
Given a group
canonical_projection Method
canonical_projection(G::FinGenAbGroup, i::Int) -> FinGenAbGroupHom
Given a group
flat Method
flat(G::FinGenAbGroup) -> FinGenAbGroupHom
Given a group
Tensor Producs
tensor_product Method
tensor_product(G::FinGenAbGroup...; task::Symbol = :map) -> FinGenAbGroup, Map
Given groups task
is set to ":map", a map
hom_tensor Method
hom_tensor(G::FinGenAbGroup, H::FinGenAbGroup, A::Vector{ <: Map{FinGenAbGroup, FinGenAbGroup}}) -> Map
Given groups
Hom-Group
hom Method
hom(G::FinGenAbGroup, H::FinGenAbGroup; task::Symbol = :map) -> FinGenAbGroup, Map
Computes the group of all homomorpisms from task
is ":map", then a map task
to ":none" to not compute the map.