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 $K$ be a number field. Given an integral ideal $m_0 \subseteq \mathcal{O}_K$ of the ring of integers $\mathcal{O}_K$, and a list of real places $m_\infty$, the ray class group modulo $m=(m_0, m_\infty)$ is defined as the group $Cl_m$ of fractional ideals coprime to $m_0$ modulo the principal ideals generated by elements $a\in K^*$ such that
\[v_p(a-1) \ge v_p(m_0) \mbox{ for all prime ideals } p \supseteq m_0.\]
and also
\[a^{(v)}>0 \mbox{ for al places } v\in m_\infty.\]
Here we write $a^{(v)}$ for the image of $a$ under embedding corresponding to the place $v$.
This is a finite abelian group, cf. [Mil20] (Theorem 1.7, Chapter V).
For $m_0 = \mathcal{O}_K$ and $m_\infty = \emptyset$ the empty list, we get a ray class group $Cl$ that is simply the class group of $K$. If $m_0=\mathcal{O}_K$ and $m_\infty$ contains all real places, we obtain the narrow class group, or strict class group, of $K$.
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 $m$ and a set of infinite places of $K$, this function returns the corresponding ray class group as an abstract group $\mathcal {Cl}_m$ and a map going from the group into the group of ideals of $K$ that are coprime to $m$. If n_quo is set, it will return the group modulo n_quo. The factorization of $m$ can be given with the keyword argument 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 $R$ given by the norm of the extension generated by a/the roots of $f$. If 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 $R$ given by the norm of the extension.
Ray Class Fields
Each quotient of a ray class group defines a ray class field $L/K$. The defining property of a ray class field $L/K$ is that the (relative over $K$) automorphism group is canonically isomorphic to the quotient of the ray class group via the Artin (or Frobenius) map.
Since, in Hecke, the ray class groups of $K$ have no link to the field $K$ itself, constructing ray class fields has to be specified using the associated maps.
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 $m: A \to I$ where $I$ is the set of ideals coprime to the modulus defining $m$ and $A$ is a quotient of the ray class group (or class group). The map $m$ must be the map returned from a call to {classgroup} or {rayclass_group}.
ray_class_field — Method
ray_class_field(m::Union{MapClassGrp, MapRayClassGrp}, quomap::FinGenAbGroupHom) -> ClassFieldFor $m$ a map computed by either {rayclassgroup} or {class_group} and $q$ a canonical projection (quotient map) as returned by {quo} for q quotient of the domain of $m$ and a subgroup of $m$, create the (formal) abelian extension where the (relative) automorphism group is canonically isomorphic to the codomain of $q$.
ray_class_field — Method
ray_class_field(I::AbsNumFieldOrderIdeal; n_quo = 0) -> ClassFieldThe ray class field modulo $I$. If n_quo is given, then the largest subfield of exponent $n$ is computed.
ray_class_field — Method
ray_class_field(I::AbsNumFieldOrderIdeal, inf::Vector{InfPlc}; n_quo = 0) -> ClassFieldThe ray class field modulo $I$ and the infinite places given. If n_quo is given, then the largest subfield of exponent $n$ is computed.
hilbert_class_field — Method
hilbert_class_field(k::AbsSimpleNumField) -> ClassFieldThe Hilbert class field of $k$ as a formal (ray-) class field.
ring_class_field — Method
ring_class_field(O::AbsNumFieldOrder) -> ClassFieldThe ring class field of $O$, i.e. the maximal abelian extension ramified only at primes dividing the conductor with the automorphism group isomorphic to the Picard group.
cyclotomic_field — Method
cyclotomic_field(::Type{ClassField}, n::Int) -> ClassFieldThe $n$-th cyclotomic field as a ray_class_field
Example
Here we give an example constructing the class field object of the number field $\mathbb{Q}(\sqrt{10})$.
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.
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.
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.
number_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.
number_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.
julia> 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))
trueThe 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 $0\le n\le 3$.
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.
genus_field — Method
genus_field(A::ClassField, k::AbsSimpleNumField) -> ClassFieldThe maximal extension contained in $A$ that is the compositum of $K$ with an abelian extension of $k$.
maximal_abelian_subfield — Method
maximal_abelian_subfield(A::ClassField, k::AbsSimpleNumField) -> ClassFieldThe maximal abelian extension of $k$ contained in $A$. $k$ must be a subfield of the base field of $A$.
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 $K$ over its base field. If of_closure is set to true, then the algorithm is applied to the normal closure of $K$ (without computing it).
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.
inertia_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.
fixed_field — Method
fixed_field(A::ClassField, U::FinGenAbGroup)For a subgroup $U$ of the norm group of $A$, return the class field fixed by $U$, ie. norm group the quotient by $U$.
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 $k(\zeta_n)$, as a class field, as an extension of the same base field.
cyclotomic_extension — Method
cyclotomic_extension(ClassField, k::AbsSimpleNumField, n::Int) -> ClassFieldComputes $k(\zeta_n)$, as a class field, as an extension of the same base field.
Invariants
base_field — Method
base_field(A::ClassField)The number field that $A$ is defined over.
discriminant — Method
discriminant(C::ClassField) -> AbsNumFieldOrderIdeal{AbsSimpleNumField, AbsSimpleNumFieldElem}Using the conductor-discriminant formula, compute the (relative) discriminant of $C$. This does not use the defining equations.
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.
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 $C$. If check is false, it assumes that the given modulus is a multiple of the conductor. This is usually faster than computing the conductor.
is_central — Method
is_central(C::ClassField) -> BoolFor a class field $C$ defined over a normal base field $k$, decide if $C$ is central over $Q$.
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.
absolute_automorphism_group — Method
absolute_automorphism_group(C::ClassField)Computes a generating set for the automorphisms of the number field corresponding to $C$. It assumes that the base field is normal. If "check" is true, the function checks if the extension is normal.
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.
frobenius_map — Method
frobenius_map(C::ClassField)
artin_map(C::ClassField)Compute the map linking unramified ideals onto the automorphisms under the Artin-Frobenius map.
complex_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
compositum — Method
compositum(a::ClassField, b::ClassField) -> ClassFieldThe compositum of $a$ and $b$ as a (formal) class field.
prime_decomposition_type — Method
prime_decomposition_type(C::ClassField, p::AbsNumFieldOrderIdeal) -> (Int, Int, Int)For a prime $p$ in the base ring of $r$, determine the splitting type of $p$ in $r$. ie. the tuple $(e, f, g)$ giving the ramification degree, the inertia and the number of primes above $p$.
is_subfield — Method
is_subfield(a::ClassField, b::ClassField) -> BoolDetermines if $a$ is a subfield of $b$.
is_local_norm — Method
is_local_norm(r::ClassField, a::AbsNumFieldOrderElem) -> BoolTests if $a$ is a local norm at all finite places in the extension implicitly given by $r$.
is_local_norm — Method
is_local_norm(r::ClassField, a::AbsNumFieldOrderElem, p::AbsNumFieldOrderIdeal) -> BoolTests if $a$ is a local norm at $p$ in the extension implicitly given by $r$. Currently the conductor cannot have infinite places.
normal_closure — Method
normal_closure(C::ClassField) -> ClassFieldFor a ray class field $C$ extending a normal base field $k$, compute the normal closure over $Q$.
subfields — Method
subfields(C::ClassField; degree::Int, is_normal, type) -> Vector{ClassField}Find all subfields of $C$ over the base field.
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.