Skip to content

Orders

Orders, that is, unitary subrings that are free Z-modules of rank equal to the degree of the number field, are at the core of the arithmetic of number fields. In Hecke, orders are always represented using the module structure, be it the Z-module structure for orders of absolute numbers fields, or the structure as a module over the maximal order of the base field in the case of relative number fields. In this chapter we mainly deal with orders of absolute fields. However, many functions apply in same way to relative extensions. There are more general definitions of orders in number fields available, but those are (currently) not implemented in Hecke.

Among all orders in a fixed field, there is a unique maximal order, called the maximal order, or ring of integers of the number field. It is well known that this is the only order that is a Dedekind domain, hence has a rich ideal structure as well. The maximal order is also the integral closure of Z in the number field and can also be interpreted as a normalization of any other order.

Creation and basic properties

# OrderMethod.
julia
Order(a::Vector{AbsSimpleNumFieldElem}; check::Bool = true, cached::Bool = true, isbasis::Bool = false) -> AbsSimpleNumFieldOrder
Order(K::AbsSimpleNumField, a::Vector{AbsSimpleNumFieldElem}; check::Bool = true, cached::Bool = true, isbasis::Bool = false) -> AbsSimpleNumFieldOrder

Returns the order generated by a. If check is set, it is checked whether a defines an order, in particular the integrality of the elements is checked by computing minimal polynomials. If isbasis is set, then elements are assumed to form a Z-basis. If cached is set, then the constructed order is cached for future use.

source


# OrderMethod.
julia
Order(K::AbsSimpleNumField, A::QQMatrix; check::Bool = true) -> AbsSimpleNumFieldOrder

Returns the order which has basis matrix A with respect to the power basis of K. If check is set, it is checked whether A defines an order.

source

julia
Order(K::AbsSimpleNumField, A::QQMatrix; check::Bool = true) -> AbsSimpleNumFieldOrder

Returns the order which has basis matrix A with respect to the power basis of K. If check is set, it is checked whether A defines an order.

source


# OrderMethod.
julia
Order(K::AbsSimpleNumField, A::ZZMatrix, check::Bool = true) -> AbsSimpleNumFieldOrder

Returns the order which has basis matrix A with respect to the power basis of K. If check is set, it is checked whether A defines an order.

source

julia
Order(A::AbstractAssociativeAlgebra{<: NumFieldElem}, M::PMat{<: NumFieldElem, T})
  -> AlgAssRelOrd

Returns the order of A with basis pseudo-matrix M.

source


# EquationOrderMethod.
julia
EquationOrder(K::number_field) -> NumFieldOrder
equation_order(K::number_field) -> NumFieldOrder

Returns the equation order of the number field K.

source


# MaximalOrderMethod.
julia
MaximalOrder(K::NumField{QQFieldElem}; discriminant::ZZRingElem, ramified_primes::Vector{ZZRingElem}) -> AbsNumFieldOrder

Returns the maximal order of K. Additional information can be supplied if they are already known, as the ramified primes or the discriminant of the maximal order.

Example

julia
julia> Qx, x = FlintQQ["x"];
julia> K, a = number_field(x^3 + 2, "a");
julia> O = MaximalOrder(K);

source


# MaximalOrderMethod.
julia
MaximalOrder(O::AbsNumFieldOrder; index_divisors::Vector{ZZRingElem}, discriminant::ZZRingElem, ramified_primes::Vector{ZZRingElem}) -> AbsNumFieldOrder

Returns the maximal order of the number field that contains O. Additional information can be supplied if they are already known, as the ramified primes, the discriminant of the maximal order or a set of integers dividing the index of O in the maximal order.

source

julia
MaximalOrder(O::AlgAssAbsOrd)

Given an order O, this function returns a maximal order containing O.

source

julia
MaximalOrder(A::AbstractAssociativeAlgebra{QQFieldElem}) -> AlgAssAbsOrd

Returns a maximal order of A.

source


# lllMethod.
julia
lll(M::AbsNumFieldOrder) -> AbsNumFieldOrder

The same order, but with the basis now being LLL reduced wrt. the Minkowski metric.

source


# any_orderMethod.
julia
any_order(K::number_field)

Return some order in K. In case the defining polynomial for K is monic and integral, this just returns the equation order. In the other case Z[α]Z[1/α] is returned.

source


Example

julia

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

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

julia> O = EquationOrder(K)
Order of Number field of degree 2 over QQ
with Z-basis AbsSimpleNumFieldOrderElem[1, a]
# parentMethod.
julia
parent(O::AbsNumFieldOrder) -> AbsNumFieldOrderSet

Returns the parent of O, that is, the set of orders of the ambient number field.

source


# signatureMethod.
julia
signature(O::NumFieldOrder) -> Tuple{Int, Int}

Returns the signature of the ambient number field of O.

source


# nfMethod.
julia
nf(O::NumFieldOrder) -> NumField

Returns the ambient number field of O.

source


# basisMethod.
julia
basis(O::AbsNumFieldOrder) -> Vector{AbsNumFieldOrderElem}

Returns the Z-basis of O.

source

julia
basis(I::AbsNumFieldOrderFractionalIdeal) -> Vector{AbsSimpleNumFieldElem}

Returns the Z-basis of I.

source


# lll_basisMethod.
julia
lll_basis(M::NumFieldOrder) -> Vector{NumFieldElem}

A basis for M that is reduced using the LLL algorithm for the Minkowski metric.

source


# basisMethod.
julia
basis(O::AbsSimpleNumFieldOrder, K::AbsSimpleNumField) -> Vector{AbsSimpleNumFieldElem}

Returns the Z-basis elements of O as elements of the ambient number field.

source


# pseudo_basisMethod.
julia
  pseudo_basis(O::RelNumFieldOrder{T, S}) -> Vector{Tuple{NumFieldElem{T}, S}}

Returns the pseudo-basis of O.

source


# basis_pmatrixMethod.
julia
  basis_pmatrix(O::RelNumFieldOrder) -> PMat

Returns the basis pseudo-matrix of O with respect to the power basis of the ambient number field.

source


# basis_nfMethod.
julia
  basis_nf(O::RelNumFieldOrder) -> Vector{NumFieldElem}

Returns the elements of the pseudo-basis of O as elements of the ambient number field.

source


# inv_coeff_idealsMethod.
julia
  inv_coeff_ideals(O::RelNumFieldOrder{T, S}) -> Vector{S}

Returns the inverses of the coefficient ideals of the pseudo basis of O.

source


# basis_matrixMethod.
julia
basis_matrix(O::AbsNumFieldOrder) -> QQMatrix

Returns the basis matrix of O with respect to the basis of the ambient number field.

source


# basis_mat_invMethod.
julia
basis_mat_inv(A::GenOrdIdl) -> FakeFracFldMat

Return the inverse of the basis matrix of A.

source


# gen_indexMethod.
julia
gen_index(O::AbsSimpleNumFieldOrder) -> QQFieldElem

Returns the generalized index of O with respect to the equation order of the ambient number field.

source


# is_index_divisorMethod.
julia
is_index_divisor(O::AbsSimpleNumFieldOrder, d::ZZRingElem) -> Bool
is_index_divisor(O::AbsSimpleNumFieldOrder, d::Int) -> Bool

Returns whether d is a divisor of the index of O. It is assumed that O contains the equation order of the ambient number field.

source


# minkowski_matrixMethod.
julia
minkowski_matrix(O::AbsNumFieldOrder, abs_tol::Int = 64) -> ArbMatrix

Returns the Minkowski matrix of O. Thus if O has degree d, then the result is a matrix in Matd×d(R). The entries of the matrix are real balls of type ArbFieldElem with radius less then 2^-abs_tol.

source


# inMethod.
julia
in(a::NumFieldElem, O::NumFieldOrder) -> Bool

Checks whether a lies in O.

source


# norm_change_constMethod.
julia
norm_change_const(O::AbsSimpleNumFieldOrder) -> (Float64, Float64)

Returns (c1,c2)R>02 such that for all x=i=1dxiωiO we have T2(x)c1idxi2 and idxi2c2T2(x), where (ωi)i is the Z-basis of O.

source


# trace_matrixMethod.
julia
trace_matrix(O::AbsNumFieldOrder) -> ZZMatrix

Returns the trace matrix of O, that is, the matrix (trK/Q(bibj))1i,jd.

source


# +Method.
julia
+(R::AbsSimpleNumFieldOrder, S::AbsSimpleNumFieldOrder) -> AbsSimpleNumFieldOrder

Given two orders R, S of K, this function returns the smallest order containing both R and S. It is assumed that R, S contain the ambient equation order and have coprime index.

source


# poverorderMethod.
julia
poverorder(O::AbsSimpleNumFieldOrder, p::ZZRingElem) -> AbsSimpleNumFieldOrder
poverorder(O::AbsSimpleNumFieldOrder, p::Integer) -> AbsSimpleNumFieldOrder

This function tries to find an order that is locally larger than O at the prime p: If p divides the index [OK:O], this function will return an order R such that vp([OK:R])<vp([OK:O]). Otherwise O is returned.

source


# poverordersMethod.
julia
poverorders(O, p) -> Vector{Ord}

Returns all p-overorders of O, that is all overorders M, such that the index of O in M is a p-power.

source


# pmaximal_overorderMethod.
julia
pmaximal_overorder(O::AbsSimpleNumFieldOrder, p::ZZRingElem) -> AbsSimpleNumFieldOrder
pmaximal_overorder(O::AbsSimpleNumFieldOrder, p::Integer) -> AbsSimpleNumFieldOrder

This function finds a p-maximal order R containing O. That is, the index [OK:R] is not divisible by p.

source


# pradicalMethod.
julia
pradical(O::AbsSimpleNumFieldOrder, p::{ZZRingElem|Integer}) -> AbsNumFieldOrderIdeal

Given a prime number p, this function returns the p-radical pO of O, which is just {xOkZ0:xkpO}. It is not checked that p is prime.

source


# pradicalMethod.
julia
  pradical(O::RelNumFieldOrder, P::AbsNumFieldOrderIdeal{AbsSimpleNumField, AbsSimpleNumFieldElem}) -> RelNumFieldOrderIdeal

Given a prime ideal P, this function returns the P-radical PO of O, which is just {xOkZ0:xkPO}. It is not checked that P is prime.

source


# ring_of_multipliersMethod.
julia
ring_of_multipliers(I::AbsNumFieldOrderIdeal) -> AbsNumFieldOrder

Computes the order (I:I), which is the set of all xK with xII.

source


Invariants

# discriminantMethod.
julia
discriminant(O::AbsSimpleNumFieldOrder) -> ZZRingElem

Returns the discriminant of O.

source

julia
discriminant(E::EllipticCurve) -> FieldElem

Return the discriminant of E.

source

julia
discriminant(C::HypellCrv{T}) -> T

Compute the discriminant of C.

source

julia
discriminant(O::AlgssRelOrd)

Returns the discriminant of O.

source


# discriminantMethod.
julia
discriminant(O::AbsSimpleNumFieldOrder) -> ZZRingElem

Returns the discriminant of O.

source


# reduced_discriminantMethod.
julia
reduced_discriminant(O::AbsSimpleNumFieldOrder) -> ZZRingElem

Returns the reduced discriminant, that is, the largest elementary divisor of the trace matrix of O.

source


# degreeMethod.
julia
degree(O::NumFieldOrder) -> Int

Returns the degree of O.

source


# indexMethod.
julia
index(O::AbsSimpleNumFieldOrder) -> ZZRingElem

Assuming that the order O contains the equation order Z[α] of the ambient number field, this function returns the index [O:Z].

source


# differentMethod.
julia
different(R::AbsNumFieldOrder) -> AbsNumFieldOrderIdeal

The different ideal of R, that is, the ideal generated by all differents of elements in R. For Gorenstein orders, this is also the inverse ideal of the co-different.

source


# codifferentMethod.
julia
codifferent(R::AbsNumFieldOrder) -> AbsNumFieldOrderIdeal{AbsSimpleNumField, AbsSimpleNumFieldElem}

The codifferent ideal of R, i.e. the trace-dual of R.

source


# is_gorensteinMethod.
julia
is_gorenstein(O::AbsSimpleNumFieldOrder) -> Bool

Return whether the order \mathcal{O} is Gorenstein.

source


# is_bassMethod.
julia
is_bass(O::AbsSimpleNumFieldOrder) -> Bool

Return whether the order \mathcal{O} is Bass.

source


# is_equation_orderMethod.
julia
is_equation_order(O::NumFieldOrder) -> Bool

Returns whether O is the equation order of the ambient number field K.

source


# zeta_log_residueMethod.
julia
zeta_log_residue(O::AbsSimpleNumFieldOrder, error::Float64) -> ArbFieldElem

Computes the residue of the zeta function of O at 1. The output will be an element of type ArbFieldElem with radius less then error.

source


# ramified_primesMethod.
julia
ramified_primes(O::AbsNumFieldOrder) -> Vector{ZZRingElem}

Returns the list of prime numbers that divide disc(O).

source


Arithmetic

Progress and intermediate results of the functions mentioned here can be obtained via verbose_level, supported are

  • ClassGroup

  • UnitGroup

All of the functions have a very similar interface: they return an abelian group and a map converting elements of the group into the objects required. The maps also allow a point-wise inverse to server as the discrete logarithm map. For more information on abelian group, see here, for ideals, here.

For the processing of units, there are a couple of helper functions also available:

# is_independentFunction.
julia
is_independent{T}(x::Vector{T})

Given an array of non-zero units in a number field, returns whether they are multiplicatively independent.

source


Predicates

# is_containedMethod.
julia
is_contained(R::AbsNumFieldOrder, S::AbsNumFieldOrder) -> Bool

Checks if R is contained in S.

source


# is_maximalMethod.
julia
is_maximal(R::AbsNumFieldOrder) -> Bool

Tests if the order R is maximal. This might trigger the computation of the maximal order.

source