Orders
Orders, that is, unitary subrings that are free $\mathbf{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 $\mathbf{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 $\mathbf{Z}$ in the number field and can also be interpreted as a normalization of any other order.
Creation and basic properties
order — Method
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) -> AbsSimpleNumFieldOrderReturns 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 $\mathbf{Z}$-basis. If cached is set, then the constructed order is cached for future use.
order — Method
order(K::AbsSimpleNumField, A::QQMatrix; check::Bool = true) -> AbsSimpleNumFieldOrderReturns 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.
order(K::AbsSimpleNumField, A::QQMatrix; check::Bool = true) -> AbsSimpleNumFieldOrderReturns 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.
equation_order — Method
equation_order(K::number_field) -> NumFieldOrder
equation_order(K::number_field) -> NumFieldOrderReturns the equation order of the number field $K$.
maximal_order — Method
maximal_order(K::NumField{QQFieldElem}; discriminant::ZZRingElem, ramified_primes::Vector{ZZRingElem}) -> AbsNumFieldOrderReturns 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> Qx, x = QQ["x"];
julia> K, a = number_field(x^3 + 2, "a");
julia> O = maximal_order(K);maximal_order — Method
maximal_order(O::AbsNumFieldOrder; index_divisors::Vector{ZZRingElem}, discriminant::ZZRingElem, ramified_primes::Vector{ZZRingElem}) -> AbsNumFieldOrderReturns 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.
maximal_order(O::AlgAssAbsOrd)Given an order $O$, this function returns a maximal order containing $O$.
maximal_order(A::AbstractAssociativeAlgebra{QQFieldElem}) -> AlgAssAbsOrdReturns a maximal order of $A$.
maximal_order(O::AlgAssRelOrd) -> AlgAssRelOrdReturns a maximal order of the algebra of $O$ containing itself.
Example
julia> Qx, x = polynomial_ring(QQ, :x);
julia> K, a = number_field(x^2 - 2, :a);
julia> O = equation_order(K)
Maximal order
of number field with defining polynomial x^2 - 2
over rational field
with Z-basis [1, a]basis — Method
basis(O::AbsNumFieldOrder) -> Vector{AbsNumFieldOrderElem}Returns the $\mathbf Z$-basis of $\mathcal O$.
basis(I::AbsNumFieldOrderFractionalIdeal) -> Vector{AbsSimpleNumFieldElem}Returns the $\mathbf Z$-basis of $I$.
Return the default basis.
If (xᵢ)ᵢ is the basis of the distinguished cyclic subfield, and π the generating element, this basis is colex ordered (xᵢ⋅πʲ)ᵢⱼ.
pseudo_basis — Method
pseudo_basis(O::RelNumFieldOrder{T, S}) -> Vector{Tuple{NumFieldElem{T}, S}}Returns the pseudo-basis of $\mathcal O$.
basis_pmatrix — Method
basis_pmatrix(O::RelNumFieldOrder) -> PMatReturns the basis pseudo-matrix of $\mathcal O$ with respect to the power basis of the ambient number field.
inv_coeff_ideals — Method
inv_coeff_ideals(O::RelNumFieldOrder{T, S}) -> Vector{S}Returns the inverses of the coefficient ideals of the pseudo basis of $O$.
basis_matrix — Method
basis_matrix(O::AbsNumFieldOrder) -> QQMatrixReturns the basis matrix of $\mathcal O$ with respect to the basis of the ambient number field.
basis_mat_inv — Method
basis_mat_inv(A::GenOrdIdl) -> FakeFracFldMatReturn the inverse of the basis matrix of $A$.
is_index_divisor — Method
is_index_divisor(O::AbsSimpleNumFieldOrder, d::ZZRingElem) -> Bool
is_index_divisor(O::AbsSimpleNumFieldOrder, d::Int) -> BoolReturns whether $d$ is a divisor of the index of $\mathcal O$. It is assumed that $\mathcal O$ contains the equation order of the ambient number field.
minkowski_matrix — Method
minkowski_matrix(O::AbsNumFieldOrder, abs_tol::Int = 64) -> ArbMatrixReturns the Minkowski matrix of $\mathcal O$. Thus if $\mathcal O$ has degree $d$, then the result is a matrix in $\operatorname{Mat}_{d\times d}(\mathbf R)$. The entries of the matrix are real balls of type ArbFieldElem with radius less then 2^-abs_tol.
norm_change_const — Method
norm_change_const(O::AbsSimpleNumFieldOrder) -> (Float64, Float64)Returns $(c_1, c_2) \in \mathbf R_{>0}^2$ such that for all $x = \sum_{i=1}^d x_i \omega_i \in \mathcal O$ we have $T_2(x) \leq c_1 \cdot \sum_i^d x_i^2$ and $\sum_i^d x_i^2 \leq c_2 \cdot T_2(x)$, where $(\omega_i)_i$ is the $\mathbf Z$-basis of $\mathcal O$.
trace_matrix — Method
trace_matrix(O::AbsNumFieldOrder) -> ZZMatrixReturns the trace matrix of $\mathcal O$, that is, the matrix $(\operatorname{tr}_{K/\mathbf Q}(b_i \cdot b_j))_{1 \leq i, j \leq d}$.
poverorder — Method
poverorder(O::AbsSimpleNumFieldOrder, p::ZZRingElem) -> AbsSimpleNumFieldOrder
poverorder(O::AbsSimpleNumFieldOrder, p::Integer) -> AbsSimpleNumFieldOrderThis function tries to find an order that is locally larger than $\mathcal O$ at the prime $p$: If $p$ divides the index $[ \mathcal O_K : \mathcal O]$, this function will return an order $R$ such that $v_p([ \mathcal O_K : R]) < v_p([ \mathcal O_K : \mathcal O])$. Otherwise $\mathcal O$ is returned.
poverorders — Method
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.
pmaximal_overorder — Method
pmaximal_overorder(O::AbsSimpleNumFieldOrder, p::ZZRingElem) -> AbsSimpleNumFieldOrder
pmaximal_overorder(O::AbsSimpleNumFieldOrder, p::Integer) -> AbsSimpleNumFieldOrderThis function finds a $p$-maximal order $R$ containing $\mathcal O$. That is, the index $[ \mathcal O_K : R]$ is not divisible by $p$.
pradical — Method
pradical(O::AbsSimpleNumFieldOrder, p::{ZZRingElem|Integer}) -> AbsNumFieldOrderIdealGiven a prime number $p$, this function returns the $p$-radical $\sqrt{p\mathcal O}$ of $\mathcal O$, which is just $\{ x \in \mathcal O \mid \exists k \in \mathbf Z_{\geq 0} \colon x^k \in p\mathcal O \}$. It is not checked that $p$ is prime.
pradical — Method
pradical(O::RelNumFieldOrder, P::AbsNumFieldOrderIdeal{AbsSimpleNumField, AbsSimpleNumFieldElem}) -> RelNumFieldOrderIdealGiven a prime ideal $P$, this function returns the $P$-radical $\sqrt{P\mathcal O}$ of $\mathcal O$, which is just $\{ x \in \mathcal O \mid \exists k \in \mathbf Z_{\geq 0} \colon x^k \in P\mathcal O \}$. It is not checked that $P$ is prime.
ring_of_multipliers — Method
ring_of_multipliers(I::AbsNumFieldOrderIdeal) -> AbsNumFieldOrderComputes the order $(I : I)$, which is the set of all $x \in K$ with $xI \subseteq I$.
Invariants
discriminant — Method
discriminant(O::AbsSimpleNumFieldOrder) -> ZZRingElemReturns the discriminant of $\mathcal O$.
reduced_discriminant — Method
reduced_discriminant(O::AbsSimpleNumFieldOrder) -> ZZRingElemReturns the reduced discriminant, that is, the largest elementary divisor of the trace matrix of $\mathcal O$.
codifferent — Method
codifferent(R::AbsNumFieldOrder) -> AbsNumFieldOrderIdeal{AbsSimpleNumField, AbsSimpleNumFieldElem}The codifferent ideal of $R$, i.e. the trace-dual of $R$.
is_gorenstein — Method
is_gorenstein(O::AbsSimpleNumFieldOrder) -> BoolReturn whether the order \mathcal{O} is Gorenstein.
is_equation_order — Method
is_equation_order(O::NumFieldOrder) -> BoolReturns whether $\mathcal O$ is the equation order of the ambient number field $K$.
zeta_log_residue — Method
zeta_log_residue(O::AbsSimpleNumFieldOrder, error::Float64) -> ArbFieldElemComputes the residue of the zeta function of $\mathcal O$ at $1$. The output will be an element of type ArbFieldElem with radius less then error.
ramified_primes — Method
ramified_primes(O::AbsNumFieldOrder) -> Vector{ZZRingElem}Returns the list of prime numbers that divide $\operatorname{disc}(\mathcal O)$.
Arithmetic
Progress and intermediate results of the functions mentioned here can be obtained via verbose_level, supported are
ClassGroupUnitGroup
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 groups, see here, for ideals, here.
torsion_unit_group(::AbsSimpleNumFieldOrder)unit_group(::AbsSimpleNumFieldOrder)unit_group_fac_elem(::AbsSimpleNumFieldOrder)sunit_group(::Vector{AbsNumFieldOrderIdeal{AbsSimpleNumField, AbsSimpleNumFieldElem}})sunit_group_fac_elem(::Vector{AbsNumFieldOrderIdeal{AbsSimpleNumField, AbsSimpleNumFieldElem}})sunit_mod_units_group_fac_elem(::Vector{AbsNumFieldOrderIdeal{AbsSimpleNumField, AbsSimpleNumFieldElem}})class_group(::AbsSimpleNumFieldOrder)picard_group(::AbsSimpleNumFieldOrder)narrow_class_group(::AbsSimpleNumFieldOrder)
For the processing of units, there are a couple of helper functions also available:
is_independent — Function
is_independent{T}(x::Vector{T})Given an array of non-zero units in a number field, returns whether they are multiplicatively independent.
Predicates
is_contained — Method
is_contained(R::AbsNumFieldOrder, S::AbsNumFieldOrder) -> BoolChecks if $R$ is contained in $S$.
is_maximal — Method
is_maximal(R::AbsNumFieldOrder) -> BoolTests if the order $R$ is maximal. This might trigger the computation of the maximal order.