Class Field Theory
This section deals with abelian extensions of number fields and abelian extensions of the rational numbers in particular.
In Hecke, abelian extensions are parametrized by quotients of ray class groups. The use of ray class groups is particularly amenable to computational algorithms.
Ray Class Groups
Let
and also
Here we write
This is a finite abelian group, cf. [2] (Theorem 1.7, Chapter V).
For
ray_class_group Method
ray_class_group(m::AbsNumFieldOrderIdeal{AbsSimpleNumField, AbsSimpleNumFieldElem}, inf_plc::Vector{InfPlc}; n_quo::Int, lp::Dict{AbsNumFieldOrderIdeal{AbsSimpleNumField, AbsSimpleNumFieldElem}, Int}) -> FinGenAbGroup, MapRayClassGrpGiven an ideal n_quo is set, it will return the group modulo n_quo. The factorization of lp.
class_group Method
class_group(K::AbsSimpleNumField) -> FinGenAbGroup, MapShortcut for class_group(maximal_order(K)): returns the class group as an abelian group and a map from this group to the set of ideals of the maximal order.
norm_group Method
norm_group(f::Nemo.PolyRingElem, mR::Hecke.MapRayClassGrp, is_abelian::Bool = true; of_closure::Bool = false) -> Hecke.FinGenGrpAb, Hecke.FinGenGrpAbMap
norm_group(f::Array{PolyRingElem{AbsSimpleNumFieldElem}}, mR::Hecke.MapRayClassGrp, is_abelian::Bool = true; of_closure::Bool = false) -> Hecke.FinGenGrpAb, Hecke.FinGenGrpAbMapComputes the subgroup of the Ray Class Group is_abelian is set to true, then the code assumes the field to be abelian, hence the algorithm stops when the quotient by the norm group has the correct order. Even though the algorithm is probabilistic by nature, in this case the result is guaranteed. If of_closure is given, then the norm group of the splitting field of the polynomial(s) is computed. It is the callers responsibility to ensure that the ray class group passed in is large enough.
norm_group Method
norm_group(K::RelSimpleNumField{AbsSimpleNumFieldElem}, mR::Hecke.MapRayClassGrp) -> Hecke.FinGenGrpAb, Hecke.FinGenGrpAbMap
norm_group(K::RelNonSimpleNumField{AbsSimpleNumFieldElem}, mR::Hecke.MapRayClassGrp) -> Hecke.FinGenGrpAb, Hecke.FinGenGrpAbMapComputes the subgroup of the Ray Class Group
Ray Class Fields
Each quotient of a ray class group defines a ray class field
Since, in Hecke, the ray class groups of
Info
It should be noted that the following are lazy functions that return formal objects of type ClassField. Nothing is computed at this point.
ray_class_field Method
ray_class_field(m::MapClassGrp) -> ClassField
ray_class_field(m::MapRayClassGrp) -> ClassFieldCreates the (formal) abelian extension defined by the map
ray_class_field Method
ray_class_field(m::Union{MapClassGrp, MapRayClassGrp}, quomap::FinGenAbGroupHom) -> ClassFieldFor
ray_class_field Method
ray_class_field(I::AbsNumFieldOrderIdeal; n_quo = 0) -> ClassFieldThe ray class field modulo n_quo is given, then the largest subfield of exponent
ray_class_field Method
ray_class_field(I::AbsNumFieldOrderIdeal, inf::Vector{InfPlc}; n_quo = 0) -> ClassFieldThe ray class field modulo n_quo is given, then the largest subfield of exponent
hilbert_class_field Method
hilbert_class_field(k::AbsSimpleNumField) -> ClassFieldThe Hilbert class field of
ring_class_field Method
ring_class_field(O::AbsNumFieldOrder) -> ClassFieldThe ring class field of
cyclotomic_field Method
cyclotomic_field(::Type{ClassField}, n::Int) -> ClassFieldThe ray_class_field
Example
Here we give an example constructing the class field object of the number field
julia> Qx, x = polynomial_ring(QQ, :x);
julia> K, a = number_field(x^2 - 10, :a);
julia> c, mc = class_group(K)
(Z/2, Class group map of set of ideals of O_K)
julia> A = ray_class_field(mc)
Class field
over number field with defining polynomial x^2 - 10
over rational field
with modulus
finite part <1>
infinite part
[]
with structure
Z/2Conversions
Given a ray class field, it's possible to compute defining equation(s) for this field. The number field constructed this way will be non-simple and defined by one polynomial for each maximal cyclic quotient of prime power order in the defining group.
number_field Method
number_field(CF::ClassField) -> RelNonSimpleNumField{AbsSimpleNumFieldElem}Given a (formal) abelian extension, compute the class field by finding defining polynomials for all prime power cyclic subfields.
Note, the return type is always a non-simple extension.
sourcenumber_field(AbsSimpleNumField, CF::ClassField) -> RelNonSimpleNumField{AbsSimpleNumFieldElem}Given a (formal) abelian extension, compute the class field by finding an absolute primitive element thus return a simple extension of Q.
sourcenumber_field(SimpleNumField, CF::ClassField) -> RelNonSimpleNumField{AbsSimpleNumFieldElem}Given a (formal) abelian extension, compute the class field by finding an primitive element over the base field of the class field, thus return a simple extension of the base field.
sourcenumber_field Method
number_field(SimpleNumField, CF::ClassField) -> RelNonSimpleNumField{AbsSimpleNumFieldElem}Given a (formal) abelian extension, compute the class field by finding an primitive element over the base field of the class field, thus return a simple extension of the base field.
sourcenumber_field Method
number_field(AbsSimpleNumField, CF::ClassField) -> RelNonSimpleNumField{AbsSimpleNumFieldElem}Given a (formal) abelian extension, compute the class field by finding an absolute primitive element thus return a simple extension of Q.
sourcejulia> Qx, x = polynomial_ring(QQ, :x);
julia> k, a = number_field(x^2 - 10, :a);
julia> c, mc = class_group(k);
julia> A = ray_class_field(mc)
Class field
over number field with defining polynomial x^2 - 10
over rational field
with modulus
finite part <1>
infinite part
[]
with structure
Z/2
julia> K = number_field(A)
Relative non-simple number field with defining polynomials [x^2 - 2]
over number field with defining polynomial x^2 - 10
over rational field
julia> ZK = maximal_order(K)
Maximal order
of relative non-simple number field with defining polynomials [x^2 - 2]
over number field of degree 2 over QQ
with pseudo-basis
(1, <1, 1>//1)
(_$1 + a, <2, a>//4)
julia> isone(discriminant(ZK))
trueTip
The algorithm employed is based on Kummer-theory and requires the addition of a suitable root of unity.
Computation progress can be monitored by setting set_verbose_level(:ClassField, n) where
ray_class_field Method
ray_class_field(K::RelSimpleNumField{AbsSimpleNumFieldElem}) -> ClassField
ray_class_field(K::AbsSimpleNumField) -> ClassFieldFor a (relative) abelian extension, compute an abstract representation as a class field.
sourcegenus_field Method
genus_field(A::ClassField, k::AbsSimpleNumField) -> ClassFieldThe maximal extension contained in
maximal_abelian_subfield Method
maximal_abelian_subfield(A::ClassField, k::AbsSimpleNumField) -> ClassFieldThe maximal abelian extension of
maximal_abelian_subfield Method
maximal_abelian_subfield(K::RelSimpleNumField{AbsSimpleNumFieldElem}; of_closure::Bool = false) -> ClassFieldUsing a probabilistic algorithm for the norm group computation, determine the maximal abelian subfield in of_closure is set to true, then the algorithm is applied to the normal closure of
decomposition_field Method
decomposition_field(C::ClassField, p::[InfPlc | AbsNumFieldOrderIdeal{AbsSimpleNumField, AbsSimpleNumFieldElem}]) -> ClassFieldCompute the decomposition field, ie. the field fixed by the decomposition group as a class field.
sourceinertia_field Method
inertia_field(C::ClassField, p::AbsNumFieldOrderIdeal{AbsSimpleNumField, AbsSimpleNumFieldElem}) -> ClassFieldCompute the inertia field, ie. the field fixed by the decomposition group as a class field.
sourcefixed_field Method
fixed_field(A::ClassField, U::FinGenAbGroup)For a subgroup
grunwald_wang Method
grunwald_wang(dp::Dict{<:NumFieldOrderIdeal, Int})
grunwald_wang(dp::Dict{<:NumFieldOrderIdeal, Int}, di::Dict{<:NumFieldEmb, Int})For a collection of places given via ideals as keys of dp and embeddings given as keys of di find a cyclic extension where the completions at the places have the degrees as the values of the dictionaries.
The degree will be the lcm of the local degree (values), the extension will be unramified at the places in dp unless they involve primes above 2.
The field will be constructed as a ray_class_field.
EXAMPLES
julia> A = grunwald_wang(Dict(3*ZZ => 3, 5*ZZ => 2))
Class field defined mod (<13, 13>, InfPlc{AbsSimpleNumField, AbsSimpleNumFieldEmbedding}[]) of structure Abelian group with structure: Z/6
julia> K = absolute_simple_field(number_field(A))[1];
julia> prime_decomposition_type(maximal_order(K), 5)
3-element Vector{Tuple{Int64, Int64}}:
(2, 1)
(2, 1)
(2, 1)
julia> prime_decomposition_type(maximal_order(K), 3)
2-element Vector{Tuple{Int64, Int64}}:
(3, 1)
(3, 1)cyclotomic_extension Method
cyclotomic_extension(k::ClassField, n::Int) -> ClassFieldComputes
cyclotomic_extension Method
cyclotomic_extension(ClassField, k::AbsSimpleNumField, n::Int) -> ClassFieldComputes
Invariants
degree Method
degree(A::ClassField)The degree of
exponent Method
exponent(A::ClassField)The exponent of
base_ring Method
base_ring(A::ClassField)The maximal order of the field that
discriminant Method
discriminant(C::ClassField) -> AbsNumFieldOrderIdeal{AbsSimpleNumField, AbsSimpleNumFieldElem}Using the conductor-discriminant formula, compute the (relative) discriminant of
conductor Method
conductor(C::ClassField) -> AbsNumFieldOrderIdeal{AbsSimpleNumField, AbsSimpleNumFieldElem}, Vector{InfPlc}Return the conductor of the abelian extension corresponding to
signature Method
signature(C::ClassField) -> Int, IntReturn the signature of the number field defined by
defining_modulus Method
defining_modulus(CF::ClassField)The modulus, i.e. an ideal of the set of real places, used to create the class field.
sourceis_cyclic Method
is_cyclic(C::ClassField)Tests if the (relative) automorphism group of
is_conductor Method
is_conductor(C::Hecke.ClassField, m::AbsNumFieldOrderIdeal{AbsSimpleNumField, AbsSimpleNumFieldElem}, inf_plc::Vector{InfPlc}=InfPlc[]; check) -> AbsNumFieldOrderIdeal{AbsSimpleNumField, AbsSimpleNumFieldElem}, Vector{InfPlc}Checks if (m, inf_plc) is the conductor of the abelian extension corresponding to check is false, it assumes that the given modulus is a multiple of the conductor. This is usually faster than computing the conductor.
is_normal Method
is_normal(C::ClassField) -> BoolFor a class field
is_central Method
is_central(C::ClassField) -> BoolFor a class field
automorphism_group Method
automorphism_group(C::ClassField)The group of automorphisms fixing the base field, returned as an abstract abelian group and a map from the group into the automorphisms. This map admits a pointwise pre-image.
sourceabsolute_automorphism_group Method
absolute_automorphism_group(C::ClassField)Computes a generating set for the automorphisms of the number field corresponding to
decomposition_group Method
decomposition_group(C::ClassField, p::[InfPlc | AbsNumFieldOrderIdeal{AbsSimpleNumField, AbsSimpleNumFieldElem}]) -> FinGenAbGroupCompute the decomposition group of any infinite place or prime ideal of the base field (ring) as a subgroup of the norm group.
sourcefrobenius_map Method
frobenius_map(C::ClassField)
artin_map(C::ClassField)Compute the map linking unramified ideals onto the automorphisms under the Artin-Frobenius map.
sourcecomplex_conjugation Method
complex_conjugation(C::ClassField, p::InfPlc)Given an infinite place p ramifying in C, return the automorphism of number_field(C), which induces complex conjugation on the complex embeddings extending p.
julia> K, = quadratic_field(21);
julia> OK = maximal_order(K);
julia> C = ray_class_field(6 * OK, real_places(K));
julia> complex_conjugation(C, real_places(K)[1]);Operations
* Method
*(A::ClassField, B::ClassField) -> ClassFieldThe compositum of
compositum Method
compositum(a::ClassField, b::ClassField) -> ClassFieldThe compositum of
intersect Method
intersect(a::ClassField, b::ClassField) -> ClassFieldThe intersection of
prime_decomposition_type Method
prime_decomposition_type(C::ClassField, p::AbsNumFieldOrderIdeal) -> (Int, Int, Int)For a prime
is_subfield Method
is_subfield(a::ClassField, b::ClassField) -> BoolDetermines if
is_local_norm Method
is_local_norm(r::ClassField, a::AbsNumFieldOrderElem) -> BoolTests if
is_local_norm Method
is_local_norm(r::ClassField, a::AbsNumFieldOrderElem, p::AbsNumFieldOrderIdeal) -> BoolTests if
normal_closure Method
normal_closure(C::ClassField) -> ClassFieldFor a ray class field
subfields Method
subfields(C::ClassField; degree::Int, is_normal, type) -> Vector{ClassField}Find all subfields of
If the optional keyword argument degree is positive, then only those with prescribed degree will be returned.
If the optional keyword is_normal is given, then only those that are normal over the field fixed by the automorphisms is returned. For normal base fields, this amounts to extensions that are normal over Q.
If the optional keyword is_normal is set to a list of automorphisms, then only those wil be considered.
type can be set to the desired relative Galois group, given as a vector of integers describing the structure.
Note
This will not find all subfields over
