Ideals
(Integral) ideals in orders are always free
For ideals in maximal orders
For efficiency, we will choose the 1st generator to be an integer.
Ideals here are of type AbsNumFieldOrderIdeal, which is, similar to the elements above, also indexed by the type of the field and their elements: AbsNumFieldOrderIdeal{AbsSimpleNumField,AbsSimpleNumFieldElem} for ideals in simple absolute fields.
Different to elements, the parentof an ideal is the set of all ideals in the ring, of type AbsNumFieldOrderIdealSet.
Creation
ideal(O::AbsSimpleNumFieldOrder, a::ZZRingElem) -> AbsNumFieldOrderIdeal
ideal(O::AbsSimpleNumFieldOrder, a::Integer) -> AbsNumFieldOrderIdealReturns the ideal of
ideal(O::AbsSimpleNumFieldOrder, M::ZZMatrix; check::Bool = false, M_in_hnf::Bool = false) -> AbsNumFieldOrderIdealCreates the ideal of check is set, then it is checked whether M_in_hnf is set, then it is assumed that
ideal(O::AbsSimpleNumFieldOrder, x::AbsSimpleNumFieldOrderElem) -> AbsNumFieldOrderIdealCreates the principal ideal
ideal(O::AbsSimpleNumFieldOrder, x::ZZRingElem, y::AbsSimpleNumFieldOrderElem) -> AbsNumFieldOrderIdeal
ideal(O::AbsSimpleNumFieldOrder, x::Integer, y::AbsSimpleNumFieldOrderElem) -> AbsNumFieldOrderIdealCreates the ideal
ideal(O::AbsSimpleNumFieldOrder, x::ZZRingElem, y::AbsSimpleNumFieldOrderElem) -> AbsNumFieldOrderIdeal
ideal(O::AbsSimpleNumFieldOrder, x::Integer, y::AbsSimpleNumFieldOrderElem) -> AbsNumFieldOrderIdealCreates the ideal
ideal(O::AbsSimpleNumFieldOrder, a::ZZRingElem) -> AbsNumFieldOrderIdeal
ideal(O::AbsSimpleNumFieldOrder, a::Integer) -> AbsNumFieldOrderIdealReturns the ideal of
ideal(O::AbsSimpleNumFieldOrder, x::AbsSimpleNumFieldOrderElem) -> AbsNumFieldOrderIdealCreates the principal ideal
*(O::AbsSimpleNumFieldOrder, x::AbsSimpleNumFieldOrderElem) -> AbsNumFieldOrderIdeal
*(x::AbsNumFieldOrderElem, O::AbsNumFieldOrder) -> AbsNumFieldOrderIdealReturns the principal ideal
factor(A::AbsNumFieldOrderIdeal{AbsSimpleNumField, AbsSimpleNumFieldElem}) -> Dict{AbsNumFieldOrderIdeal{AbsSimpleNumField, AbsSimpleNumFieldElem}, Int}Computes the prime ideal factorization lp = factor_dict(A), then keys(lp) are the prime ideal divisors of lp[P] is the keys(lp).
factor(I::AbsNumFieldOrderIdealSet{AbsSimpleNumField, AbsSimpleNumFieldElem}, a::AbsSimpleNumFieldElem) -> Dict{AbsNumFieldOrderIdeal{AbsSimpleNumField, AbsSimpleNumFieldElem}, ZZRingElem}Factors the principal ideal generated by
coprime_base(A::Vector{AbsNumFieldOrderIdeal{AbsSimpleNumField, AbsSimpleNumFieldElem}}) -> Vector{AbsNumFieldOrderIdeal{AbsSimpleNumField, AbsSimpleNumFieldElem}}
coprime_base(A::Vector{AbsSimpleNumFieldOrderElem}) -> Vector{AbsNumFieldOrderIdeal{AbsSimpleNumField, AbsSimpleNumFieldElem}}A coprime base for the (principal) ideals in
Arithmetic
All the usual operations are supported:
==,+,*divexact,divideslcm,gcdin
intersect(x::AbsNumFieldOrderIdeal{AbsSimpleNumField, AbsSimpleNumFieldElem}, y::AbsNumFieldOrderIdeal{AbsSimpleNumField, AbsSimpleNumFieldElem}) -> AbsNumFieldOrderIdeal{AbsSimpleNumField, AbsSimpleNumFieldElem}Returns
colon(a::AbsNumFieldOrderIdeal, b::AbsNumFieldOrderIdeal) -> AbsSimpleNumFieldOrderFractionalIdealThe ideal
in(x::NumFieldOrderElem, y::NumFieldOrderIdeal)
in(x::NumFieldElem, y::NumFieldOrderIdeal)
in(x::ZZRingElem, y::NumFieldOrderIdeal)Returns whether
is_power(A::AbsNumFieldOrderIdeal, n::Int) -> Bool, AbsNumFieldOrderIdeal
is_power(A::AbsSimpleNumFieldOrderFractionalIdeal, n::Int) -> Bool, AbsSimpleNumFieldOrderFractionalIdealComputes, if possible, an ideal true and
is_power(I::AbsNumFieldOrderIdeal) -> Int, AbsNumFieldOrderIdeal
is_power(a::AbsSimpleNumFieldOrderFractionalIdeal) -> Int, AbsSimpleNumFieldOrderFractionalIdealWrites
is_invertible(A::AbsNumFieldOrderIdeal) -> Bool, AbsSimpleNumFieldOrderFractionalIdealReturns true and an inverse of false and an ideal
isone(A::AbsNumFieldOrderIdeal) -> Bool
is_unit(A::AbsNumFieldOrderIdeal) -> BoolTests if
Class Group
The group of invertable ideals in any order forms a group and the principal ideals a subgroup. The finite quotient is called class group for maximal orders and Picard group or ring class group in general.
class_group(O::AbsSimpleNumFieldOrder; bound = -1,
redo = false,
GRH = true) -> FinGenAbGroup, MapReturns a group
By default, the correctness is guarenteed only assuming the Generalized Riemann Hypothesis (GRH).
Keyword arguments:
redo: Trigger a recomputation, thus avoiding the cache.bound: When specified, this is used for the bound for the factor base.GRH: Iffalse, the correctness of the result does not depend on GRH.
narrow_class_group(O::AbsSimpleNumFieldOrder) -> FinGenAbGroup, MapComputes the narrow (or strict) class group of
picard_group(O::AbsSimpleNumFieldOrder) -> FinGenAbGroup, MapClassGrpReturns the Picard group of
ring_class_group(O::AbsNumFieldOrder)The ring class group (Picard group) of
julia> k, a = wildanger_field(3, 13);
julia> zk = maximal_order(k);
julia> c, mc = class_group(zk)
(Z/9, ClassGroup map of
Set of ideals of Maximal order of Number field of degree 3 over QQ
with basis AbsSimpleNumFieldElem[1, _$, 1//2*_$^2 + 1//2])
julia> lp = prime_ideals_up_to(zk, 20);
julia> [ mc \ I for I = lp]
10-element Vector{FinGenAbGroupElem}:
[1]
[7]
[1]
[8]
[3]
[5]
[4]
[7]
[0]
[5]
julia> mc(c[1])
<2, 1//2*_$^2 + 5//2>
Norm: 2
Minimum: 2
two normal wrt: 2
julia> order(c[1])
9
julia> mc(c[1])^Int(order(c[1]))
<32, 1071973334414659//2*_$^2 - 531961920331023*_$ + 1160578209650381//2>
Norm: 512
Minimum: 32
two normal wrt: 2
julia> mc \ ans
Abelian group element [0]The class group, or more precisely the information used to compute it also allows for principal ideal testing and related tasks. In general, due to the size of the objects, the fac_elem versions are more efficient.
is_principal(A::AbsSimpleNumFieldOrderIdeal) -> Bool
is_principal(A::AbsSimpleNumFieldOrderFractionalIdeal) -> BoolTests if
is_principal_with_data(A::AbsSimpleNumFieldOrderIdeal) -> Bool, AbsSimpleNumFieldOrderElem
is_principal_with_data(A::AbsSimpleNumFieldOrderFractionalIdeal) -> Bool, AbsSimpleNumFieldElemTests if
is_principal_fac_elem(A::AbsNumFieldOrderIdeal{AbsSimpleNumField, AbsSimpleNumFieldElem}) -> Bool, FacElem{AbsSimpleNumFieldElem, number_field}Tests if
power_class(A::AbsNumFieldOrderIdeal{AbsSimpleNumField, AbsSimpleNumFieldElem}, e::ZZRingElem) -> AbsNumFieldOrderIdeal{AbsSimpleNumField, AbsSimpleNumFieldElem}Computes a (small) ideal in the same class as
power_product_class(A::Vector{AbsNumFieldOrderIdeal{AbsSimpleNumField, AbsSimpleNumFieldElem}}, e::Vector{ZZRingElem}) -> AbsNumFieldOrderIdeal{AbsSimpleNumField, AbsSimpleNumFieldElem}Computes a (small) ideal in the same class as
power_reduce(A::AbsNumFieldOrderIdeal{AbsSimpleNumField, AbsSimpleNumFieldElem}, e::ZZRingElem) -> AbsNumFieldOrderIdeal{AbsSimpleNumField, AbsSimpleNumFieldElem}, FacElem{AbsSimpleNumFieldElem}Computes
class_group_ideal_relation(I::AbsNumFieldOrderIdeal{AbsSimpleNumField, AbsSimpleNumFieldElem}, c::ClassGrpCtx) -> AbsSimpleNumFieldElem, SRow{ZZRingElem}Finds a number field element
factor_base_bound_grh(O::AbsSimpleNumFieldOrder) -> IntReturns an integer
factor_base_bound_bach(O::AbsSimpleNumFieldOrder) -> IntUse the theorem of Bach to find
prime_ideals_up_to(O::AbsSimpleNumFieldOrder,
B::Int;
degree_limit::Int = 0, index_divisors::Bool = true) -> Vector{AbsNumFieldOrderIdeal{AbsSimpleNumField, AbsSimpleNumFieldElem}}Computes the prime ideals
If degree_limit is a nonzero integer
prime_ideals_up_to(O::AbsSimpleNumFieldOrder,
B::Int;
complete::Bool = false,
degree_limit::Int = 0,
F::Function,
bad::ZZRingElem)Computes the prime ideals
If degree_limit is a nonzero integer
The function bad such that
julia> I = mc(c[1])
<2, 1//2*_$^2 + 5//2>
Norm: 2
Minimum: 2
two normal wrt: 2
julia> is_principal(I)
false
julia> I = I^Int(order(c[1]))
<32, 1071973334414659//2*_$^2 - 531961920331023*_$ + 1160578209650381//2>
Norm: 512
Minimum: 32
two normal wrt: 2
julia> is_principal(I)
true
julia> is_principal_fac_elem(I)
(true, 5^-3*(1//2*_$^2 - 6*_$ + 7//2)^4*(_$ - 3)^-1*(37//2*_$^2 - 217*_$ - 161//2)^4*(_$^2 + _$ + 2)^3*(_$ + 5)^-2*(_$^2 + 1)^-2*3^-2*(-21*_$^2 + 269*_$ - 80)^-4*11^-1*(_$ + 1)^3*2^4*(_$ + 2)^2*1^-1)The computation of
torsion_units(O::AbsSimpleNumFieldOrder) -> Vector{AbsSimpleNumFieldOrderElem}Given an order
torsion_unit_group(O::AbsSimpleNumFieldOrder) -> GrpAb, MapGiven an order
torsion_units_generator(O::AbsSimpleNumFieldOrder) -> AbsSimpleNumFieldOrderElemGiven an order
torsion_units_gen_order(O::AbsSimpleNumFieldOrder) -> AbsSimpleNumFieldOrderElemGiven an order
unit_group(O::AbsSimpleNumFieldOrder) -> FinGenAbGroup, MapReturns a group [ f(U[1+i]) for i in 1:unit_group_rank(O) ]. f(U[1]) will give a generator for the torsion subgroup.
unit_group_fac_elem(O::AbsSimpleNumFieldOrder) -> FinGenAbGroup, MapReturns a group [ f(U[1+i]) for i in 1:unit_group_rank(O) ]. f(U[1]) will give a generator for the torsion subgroup. All elements will be returned in factored form.
sunit_group(I::Vector{AbsNumFieldOrderIdeal{AbsSimpleNumField, AbsSimpleNumFieldElem}}) -> GrpAb, MapFor an array
sunit_group_fac_elem(I::Vector{AbsNumFieldOrderIdeal{AbsSimpleNumField, AbsSimpleNumFieldElem}}) -> GrpAb, MapFor an array
sunit_mod_units_group_fac_elem(I::Vector{AbsNumFieldOrderIdeal{AbsSimpleNumField, AbsSimpleNumFieldElem}}) -> GrpAb, MapFor an array
julia> u, mu = unit_group(zk)
(Z/2 x Z, UnitGroup map of Maximal order of Number field of degree 3 over QQ
with basis AbsSimpleNumFieldElem[1, _$, 1//2*_$^2 + 1//2]
)
julia> mu(u[2])
_$^2 - _$ + 1
julia> u, mu = unit_group_fac_elem(zk)
(Z/2 x Z, UnitGroup map of Factored elements over Number field of degree 3 over QQ
)
julia> mu(u[2])
5^-1*(_$^2 + _$ + 2)^1*(_$ + 5)^-1*(1//2*_$^2 - 6*_$ + 5//2)^-1*(_$ + 2)^1*(_$ + 1)^1
julia> evaluate(ans)
_$^2 - _$ + 1
julia> lp = factor(6*zk)
Dict{AbsSimpleNumFieldOrderIdeal, Int64} with 4 entries:
<3, _$ + 5> => 1
<3, _$^2 + 1> => 1
<2, 1//2*_$^2 + 1//2> => 2
<2, 3//2*_$^2 + 3*_$ + 7//2> => 1
julia> s, ms = Hecke.sunit_group(collect(keys(lp)))
(Z/2 x Z^(5), SUnits map of Number field of degree 3 over QQ for AbsSimpleNumFieldOrderIdeal[<3, _$ + 5>
Norm: 3
Minimum: 3
basis_matrix
[3 0 0; 2 1 0; 2 0 1]
two normal wrt: 3, <3, _$^2 + 1>
Norm: 9
Minimum: 3
basis_matrix
[3 0 0; 0 3 0; 0 0 1]
two normal wrt: 3, <2, 1//2*_$^2 + 1//2>
Norm: 2
Minimum: 2
basis_matrix
[2 0 0; 1 1 0; 0 0 1]
two normal wrt: 2, <2, 3//2*_$^2 + 3*_$ + 7//2>
Norm: 2
Minimum: 2
basis_matrix
[2 0 0; 1 1 0; 1 0 1]
two normal wrt: 2]
)
julia> ms(s[4])
-1//2*_$^2 + 6*_$ + 5//2
julia> norm(ans)
144
julia> factor(numerator(ans))
1 * 2^4 * 3^2Miscaellenous
order(a::AbsNumFieldOrderFractionalIdeal) -> AbsNumFieldOrderThe order that was used to define the ideal
order(a::RelNumFieldOrderFractionalIdeal) -> RelNumFieldOrderReturns the order of
nf(x::NumFieldOrderIdeal) -> AbsSimpleNumFieldReturns the number field, of which
basis(A::AbsNumFieldOrderIdeal) -> Vector{AbsSimpleNumFieldOrderElem}Returns the basis of
basis(I::AbsNumFieldOrderFractionalIdeal) -> Vector{AbsSimpleNumFieldElem}Returns the
lll_basis(I::NumFieldOrderIdeal) -> Vector{NumFieldElem}A basis for
basis_matrix(A::AbsNumFieldOrderIdeal) -> ZZMatrixReturns the basis matrix of
basis_mat_inv(A::GenOrdIdl) -> FakeFracFldMatReturn the inverse of the basis matrix of
has_princ_gen_special(A::AbsNumFieldOrderIdeal) -> BoolReturns whether
principal_generator(A::AbsNumFieldOrderIdeal{AbsSimpleNumField, AbsSimpleNumFieldElem}) -> AbsSimpleNumFieldOrderElemFor a principal ideal
principal_generator_fac_elem(A::AbsNumFieldOrderIdeal{AbsSimpleNumField, AbsSimpleNumFieldElem}) -> FacElem{AbsSimpleNumFieldElem, number_field}For a principal ideal
minimum(A::AbsNumFieldOrderIdeal) -> ZZRingElemReturns the smallest non-negative element in
minimum(A::RelNumFieldOrderIdeal) -> AbsNumFieldOrderIdeal{AbsSimpleNumField, AbsSimpleNumFieldElem}
minimum(A::RelNumFieldOrderIdeal) -> RelNumFieldOrderIdealReturns the ideal
minimum(A::RelNumFieldOrderIdeal) -> AbsNumFieldOrderIdeal{AbsSimpleNumField, AbsSimpleNumFieldElem}
minimum(A::RelNumFieldOrderIdeal) -> RelNumFieldOrderIdealReturns the ideal
minimum(A::AbsNumFieldOrderIdeal) -> ZZRingElemReturns the smallest non-negative element in
has_minimum(A::AbsNumFieldOrderIdeal) -> BoolReturns whether
norm(A::AbsNumFieldOrderIdeal) -> ZZRingElemReturns the norm of
norm(a::RelNumFieldOrderIdeal) -> AbsNumFieldOrderIdeal{AbsSimpleNumField, AbsSimpleNumFieldElem}Returns the norm of
norm(a::RelNumFieldOrderFractionalIdeal{T, S}) -> SReturns the norm of
norm(a::AlgAssAbsOrdIdl, O::AlgAssAbsOrd; copy::Bool = true) -> QQFieldElemReturns the norm of
norm(a::AlgAssRelOrdIdl{S, T, U}, O::AlgAssRelOrd{S, T, U}; copy::Bool = true)
where { S, T, U } -> TReturns the norm of
idempotents(x::AbsNumFieldOrderIdeal{AbsSimpleNumField, AbsSimpleNumFieldElem}, y::AbsNumFieldOrderIdeal{AbsSimpleNumField, AbsSimpleNumFieldElem}) -> AbsSimpleNumFieldOrderElem, AbsSimpleNumFieldOrderElemReturns a tuple (e, f) consisting of elements e in x, f in y such that 1 = e + f.
If the ideals are not coprime, an error is raised.
is_prime(A::AbsNumFieldOrderIdeal{AbsSimpleNumField, AbsSimpleNumFieldElem}) -> BoolReturns whether
is_prime_known(A::AbsNumFieldOrderIdeal{AbsSimpleNumField, AbsSimpleNumFieldElem}) -> BoolReturns whether
is_ramified(O::AbsSimpleNumFieldOrder, p::Int) -> BoolReturns whether the integer
ramification_index(P::AbsNumFieldOrderIdeal{AbsSimpleNumField, AbsSimpleNumFieldElem}) -> IntThe ramification index of the prime-ideal
degree(P::AbsNumFieldOrderIdeal{AbsSimpleNumField, AbsSimpleNumFieldElem}) -> IntThe inertia degree of the prime-ideal
valuation(a::NumFieldElem, p::AbsNumFieldOrderIdeal{AbsSimpleNumField, AbsSimpleNumFieldElem}) -> ZZRingElemComputes the
valuation(a::AbsSimpleNumFieldElem, p::AbsNumFieldOrderIdeal{AbsSimpleNumField, AbsSimpleNumFieldElem}) -> ZZRingElem
valuation(a::AbsSimpleNumFieldOrderElem, p::AbsNumFieldOrderIdeal{AbsSimpleNumField, AbsSimpleNumFieldElem}) -> ZZRingElem
valuation(a::ZZRingElem, p::AbsNumFieldOrderIdeal{AbsSimpleNumField, AbsSimpleNumFieldElem}) -> ZZRingElemComputes the
valuation(A::AbsNumFieldOrderIdeal{AbsSimpleNumField, AbsSimpleNumFieldElem}, p::AbsNumFieldOrderIdeal{AbsSimpleNumField, AbsSimpleNumFieldElem}) -> ZZRingElemComputes the
valuation(a::Integer, p::AbsNumFieldOrderIdeal{AbsSimpleNumField, AbsSimpleNumFieldElem}) -> ZZRingElemComputes the
valuation(a::AbsSimpleNumFieldElem, p::AbsNumFieldOrderIdeal{AbsSimpleNumField, AbsSimpleNumFieldElem}) -> ZZRingElem
valuation(a::AbsSimpleNumFieldOrderElem, p::AbsNumFieldOrderIdeal{AbsSimpleNumField, AbsSimpleNumFieldElem}) -> ZZRingElem
valuation(a::ZZRingElem, p::AbsNumFieldOrderIdeal{AbsSimpleNumField, AbsSimpleNumFieldElem}) -> ZZRingElemComputes the
valuation(A::AbsNumFieldOrderFractionalIdeal, p::AbsNumFieldOrderIdeal)The valuation of
idempotents(x::AbsNumFieldOrderIdeal{AbsSimpleNumField, AbsSimpleNumFieldElem}, y::AbsNumFieldOrderIdeal{AbsSimpleNumField, AbsSimpleNumFieldElem}) -> AbsSimpleNumFieldOrderElem, AbsSimpleNumFieldOrderElemReturns a tuple (e, f) consisting of elements e in x, f in y such that 1 = e + f.
If the ideals are not coprime, an error is raised.
Quotient Rings
quo(O::AbsSimpleNumFieldOrder, I::AbsNumFieldOrderIdeal{AbsSimpleNumField, AbsSimpleNumFieldElem}) -> AbsSimpleNumFieldOrderQuoRing, Map
quo(O::AlgAssAbsOrd, I::AlgAssAbsOrdIdl) -> AbsOrdQuoRing, MapThe quotient ring
residue_ring(O::AbsSimpleNumFieldOrder, I::AbsNumFieldOrderIdeal{AbsSimpleNumField, AbsSimpleNumFieldElem}) -> AbsSimpleNumFieldOrderQuoRing
residue_ring(O::AlgAssAbsOrd, I::AlgAssAbsOrdIdl) -> AbsOrdQuoRingThe quotient ring
residue_field(O::AbsSimpleNumFieldOrder, P::AbsNumFieldOrderIdeal{AbsSimpleNumField, AbsSimpleNumFieldElem}, check::Bool = true) -> Field, MapReturns the residue field of the prime ideal check is true, the ideal is checked for being prime.
mod(x::AbsSimpleNumFieldOrderElem, I::AbsNumFieldOrderIdeal)Returns the unique element
crt(r1::AbsSimpleNumFieldOrderElem, i1::AbsNumFieldOrderIdeal{AbsSimpleNumField, AbsSimpleNumFieldElem}, r2::AbsSimpleNumFieldOrderElem, i2::AbsNumFieldOrderIdeal{AbsSimpleNumField, AbsSimpleNumFieldElem}) -> AbsSimpleNumFieldOrderElemFind idempotents.
euler_phi(A::AbsNumFieldOrderIdeal{AbsSimpleNumField, AbsSimpleNumFieldElem}) -> ZZRingElemThe ideal version of the totient function returns the size of the unit group of the residue ring modulo the ideal.
multiplicative_group(Q::AbsSimpleNumFieldOrderQuoRing) -> FinGenAbGroup, Map{FinGenAbGroup, AbsSimpleNumFieldOrderQuoRing}
unit_group(Q::AbsSimpleNumFieldOrderQuoRing) -> FinGenAbGroup, Map{FinGenAbGroup, AbsSimpleNumFieldOrderQuoRing}Returns the unit group of
multiplicative_group_generators(Q::AbsSimpleNumFieldOrderQuoRing) -> Vector{AbsSimpleNumFieldOrderQuoRingElem}Return a set of generators for