Skip to content

Class Field Theory

Introduction

This chapter deals with abelian extensions of number fields and the rational numbers.

Class Field Theory, here specifically, class field theory of global number fields, deals with abelian extension, ie. fields where the group of automorphisms is abelian. For extensions of Q, the famous Kronnecker-Weber theorem classifies all such fields: a field is abelian if and only if it is contained in some cyclotomic field. For general number fields this is more involved and even for extensions of Q is is not practical.

In Hecke, abelian extensions are parametrized by quotients of so called ray class groups. The language of ray class groups while dated is more applicable to algorithms than the modern language of idel class groups and quotients.

Ray Class Groups

Given an integral ideal m0ZK and a list of real places m, the ray class group modulo (m0,m), C(m) is defined as the group of ideals coprime to m0 modulo the elements aK s.th. vp(a1)vp(m0) and for all vm, a(v)>0. This is a finite abelian group. For m0=ZK and m={} we get C() is the class group, if m contains all real places, we obtain the narrow class group, or strict class group.

ray_class_group Method
julia
ray_class_group(m::AbsNumFieldOrderIdeal{AbsSimpleNumField, AbsSimpleNumFieldElem}, inf_plc::Vector{InfPlc}; n_quo::Int, lp::Dict{AbsNumFieldOrderIdeal{AbsSimpleNumField, AbsSimpleNumFieldElem}, Int}) -> FinGenAbGroup, MapRayClassGrp

Given an ideal m and a set of infinite places of K, this function returns the corresponding ray class group as an abstract group Clm 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.

source

class_group Method
julia
class_group(K::AbsSimpleNumField) -> FinGenAbGroup, Map

Shortcut 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.

source

norm_group Method
julia
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.FinGenGrpAbMap

Computes 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.

source

norm_group Method
julia
norm_group(K::RelSimpleNumField{AbsSimpleNumFieldElem}, mR::Hecke.MapRayClassGrp) -> Hecke.FinGenGrpAb, Hecke.FinGenGrpAbMap

norm_group(K::RelNonSimpleNumField{AbsSimpleNumFieldElem}, mR::Hecke.MapRayClassGrp) -> Hecke.FinGenGrpAb, Hecke.FinGenGrpAbMap

Computes the subgroup of the Ray Class Group R given by the norm of the extension.

source

Ray Class Fields

In general, the construction of a class field starts with a (ray) class group. Each quotient of a ray class group then defines a ray class field, the defining property is that the (relative) automorphism group is canonically isomorphic to the quotient of the ray class group where the isomorphism is given by the Artin (or Frobenius) map. Since, in Hecke, the (ray) class groups have no link to the field, actually this has to be specified using the maps.

It should be noted that this is a lazy construction: nothing is computed at this point.

ray_class_field Method
julia
ray_class_field(m::MapClassGrp) -> ClassField
ray_class_field(m::MapRayClassGrp) -> ClassField

Creates the (formal) abelian extension defined by the map m:AI 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 {class_group} or {ray_class_group}.

source

ray_class_field Method
julia
ray_class_field(m::Union{MapClassGrp, MapRayClassGrp}, quomap::FinGenAbGroupHom) -> ClassField

For m a map computed by either {ray_class_group} 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.

source

ray_class_field Method
julia
ray_class_field(I::AbsNumFieldOrderIdeal; n_quo = 0) -> ClassField

The ray class field modulo I. If n_quo is given, then the largest subfield of exponent n is computed.

source

ray_class_field Method
julia
ray_class_field(I::AbsNumFieldOrderIdeal, inf::Vector{InfPlc}; n_quo = 0) -> ClassField

The ray class field modulo I and the infinite places given. If n_quo is given, then the largest subfield of exponent n is computed.

source

hilbert_class_field Method
julia
hilbert_class_field(k::AbsSimpleNumField) -> ClassField

The Hilbert class field of k as a formal (ray-) class field.

source

ring_class_field Method
julia
ring_class_field(O::AbsNumFieldOrder) -> ClassField

The 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.

source

Example

julia

julia> Qx, x = polynomial_ring(QQ, "x");

julia> K, a = number_field(x^2 - 10, "a");

julia> c, mc = class_group(K)
(Z/2, ClassGroup map of
Set of ideals of Maximal order of Number field of degree 2 over QQ
with basis AbsSimpleNumFieldElem[1, a])

julia> A = ray_class_field(mc)
Class field defined mod (<1, 1>, InfPlc{AbsSimpleNumField, AbsSimpleNumFieldEmbedding}[]) of structure Z/2

Conversions

Given a ray class field, it is possible to actually compute defining equation(s) for this field. In general, the number field constructed this way will be non-simple by type and is defined by a polynomial for each maximal cyclic quotient of prime power order in the defining group.

The algorithm employed is based on Kummer-theory and requires the addition of a suitable root of unity. Progress can be monitored by setting set_verbose_level(:ClassField, n) where 0n3

number_field Method
julia
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.

source

julia

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 defined mod (<1, 1>, InfPlc{AbsSimpleNumField, AbsSimpleNumFieldEmbedding}[]) of structure Z/2

julia> K = number_field(A)
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)
Relative maximal order of Non-simple number field of degree 2 over number field
with pseudo-basis
(1, 1//1 * <1, 1>)
(_$1 + a, 1//4 * <2, a>)

julia> isone(discriminant(ZK))
true
ray_class_field Method
julia
ray_class_field(K::RelSimpleNumField{AbsSimpleNumFieldElem}) -> ClassField
ray_class_field(K::AbsSimpleNumField) -> ClassField

For a (relative) abelian extension, compute an abstract representation as a class field.

source

genus_field Method
julia
genus_field(A::ClassField, k::AbsSimpleNumField) -> ClassField

The maximal extension contained in A that is the compositum of K with an abelian extension of k.

source

maximal_abelian_subfield Method
julia
maximal_abelian_subfield(A::ClassField, k::AbsSimpleNumField) -> ClassField

The maximal abelian extension of k contained in A. k must be a subfield of the base field of A.

source

maximal_abelian_subfield Method
julia
maximal_abelian_subfield(K::RelSimpleNumField{AbsSimpleNumFieldElem}; of_closure::Bool = false) -> ClassField

Using 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).

source

Invariants

degree Method
julia
degree(A::ClassField)

The degree of A over its base field, i.e. the size of the defining ideal group.

source

base_ring Method
julia
base_ring(A::ClassField)

The maximal order of the field that A is defined over.

source

base_field Method
julia
base_field(A::ClassField)

The number field that A is defined over.

source

discriminant Method
julia
discriminant(C::ClassField) -> AbsNumFieldOrderIdeal{AbsSimpleNumField, AbsSimpleNumFieldElem}

Using the conductor-discriminant formula, compute the (relative) discriminant of C. This does not use the defining equations.

source

conductor Method
julia
conductor(C::ClassField) -> AbsNumFieldOrderIdeal{AbsSimpleNumField, AbsSimpleNumFieldElem}, Vector{InfPlc}

Return the conductor of the abelian extension corresponding to C.

source

defining_modulus Method
julia
defining_modulus(CF::ClassField)

The modulus, i.e. an ideal of the set of real places, used to create the class field.

source

is_cyclic Method
julia
is_cyclic(C::ClassField)

Tests if the (relative) automorphism group of C is cyclic (by checking the defining ideal group).

source

is_conductor Method
julia
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.

source

is_normal Method
julia
is_normal(C::ClassField) -> Bool

For a class field C defined over a normal base field k, decide if C is normal over Q.

source

is_central Method
julia
is_central(C::ClassField) -> Bool

For a class field C defined over a normal base field k, decide if C is central over Q.

source

Operations

* Method
julia
*(A::ClassField, B::ClassField) -> ClassField

The compositum of a and b as a (formal) class field.

source

compositum Method
julia
compositum(a::ClassField, b::ClassField) -> ClassField

The compositum of a and b as a (formal) class field.

source

== Method
julia
==(a::ClassField, b::ClassField)

Tests if a and b are equal.

source

intersect Method
julia
intersect(a::ClassField, b::ClassField) -> ClassField

The intersection of a and b as a class field.

source

prime_decomposition_type Method
julia
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.

source

is_subfield Method
julia
is_subfield(a::ClassField, b::ClassField) -> Bool

Determines if a is a subfield of b.

source

is_local_norm Method
julia
is_local_norm(r::ClassField, a::AbsNumFieldOrderElem) -> Bool

Tests if a is a local norm at all finite places in the extension implicitly given by r.

source

is_local_norm Method
julia
is_local_norm(r::ClassField, a::AbsNumFieldOrderElem, p::AbsNumFieldOrderIdeal) -> Bool

Tests if a is a local norm at p in the extension implicitly given by r. Currently the conductor cannot have infinite places.

source

normal_closure Method
julia
normal_closure(C::ClassField) -> ClassField

For a ray class field C extending a normal base field k, compute the normal closure over Q.

source

subfields Method
julia
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 descibing the structure.

Note

This will not find all subfields over Q, but only the ones sharing the same base field.

source