Base class of number fields

AUTHORS:

  • William Stein (2007-09-04): initial version

class sage.rings.number_field.number_field_base.NumberField[source]

Bases: Field

Base class for all number fields.

OK(*args, **kwds)[source]

Synonym for maximal_order().

EXAMPLES:

sage: x = polygen(ZZ)
sage: NumberField(x^3 - 2,'a').OK()
Maximal Order generated by a in Number Field in a with defining polynomial x^3 - 2
>>> from sage.all import *
>>> x = polygen(ZZ)
>>> NumberField(x**Integer(3) - Integer(2),'a').OK()
Maximal Order generated by a in Number Field in a with defining polynomial x^3 - 2
bach_bound()[source]

Return the Bach bound associated to this number field.

Assuming the General Riemann Hypothesis, this is a bound \(B\) so that every integral ideal is equivalent modulo principal fractional ideals to an integral ideal of norm at most \(B\).

OUTPUT: symbolic expression or the Integer 1

EXAMPLES:

We compute both the Minkowski and Bach bounds for a quadratic field, where the Minkowski bound is much better:

sage: # needs sage.symbolic
sage: K = QQ[sqrt(5)]
sage: K.minkowski_bound()
1/2*sqrt(5)
sage: K.minkowski_bound().n()
1.11803398874989
sage: K.bach_bound()
12*log(5)^2
sage: K.bach_bound().n()
31.0834847277628
>>> from sage.all import *
>>> # needs sage.symbolic
>>> K = QQ[sqrt(Integer(5))]
>>> K.minkowski_bound()
1/2*sqrt(5)
>>> K.minkowski_bound().n()
1.11803398874989
>>> K.bach_bound()
12*log(5)^2
>>> K.bach_bound().n()
31.0834847277628

We compute both the Minkowski and Bach bounds for a bigger degree field, where the Bach bound is much better:

sage: # needs sage.symbolic
sage: K = CyclotomicField(37)
sage: K.minkowski_bound().n()
7.50857335698544e14
sage: K.bach_bound().n()
191669.304126267
>>> from sage.all import *
>>> # needs sage.symbolic
>>> K = CyclotomicField(Integer(37))
>>> K.minkowski_bound().n()
7.50857335698544e14
>>> K.bach_bound().n()
191669.304126267

The bound of course also works for the rational numbers:

sage: QQ.bach_bound()                                                       # needs sage.symbolic
1
>>> from sage.all import *
>>> QQ.bach_bound()                                                       # needs sage.symbolic
1
degree()[source]

Return the degree of this number field.

EXAMPLES:

sage: x = polygen(ZZ)
sage: NumberField(x^3 + 9, 'a').degree()
3
>>> from sage.all import *
>>> x = polygen(ZZ)
>>> NumberField(x**Integer(3) + Integer(9), 'a').degree()
3
discriminant()[source]

Return the discriminant of this number field.

EXAMPLES:

sage: x = polygen(ZZ)
sage: NumberField(x^3 + 9, 'a').discriminant()
-243
>>> from sage.all import *
>>> x = polygen(ZZ)
>>> NumberField(x**Integer(3) + Integer(9), 'a').discriminant()
-243
is_absolute()[source]

Return True if self is viewed as a single extension over \(\QQ\).

EXAMPLES:

sage: x = polygen(ZZ)
sage: K.<a> = NumberField(x^3 + 2)
sage: K.is_absolute()
True
sage: y = polygen(K)
sage: L.<b> = NumberField(y^2 + 1)
sage: L.is_absolute()
False
sage: QQ.is_absolute()
True
>>> from sage.all import *
>>> x = polygen(ZZ)
>>> K = NumberField(x**Integer(3) + Integer(2), names=('a',)); (a,) = K._first_ngens(1)
>>> K.is_absolute()
True
>>> y = polygen(K)
>>> L = NumberField(y**Integer(2) + Integer(1), names=('b',)); (b,) = L._first_ngens(1)
>>> L.is_absolute()
False
>>> QQ.is_absolute()
True
maximal_order()[source]

Return the maximal order, i.e., the ring of integers of this number field.

EXAMPLES:

sage: x = polygen(ZZ)
sage: NumberField(x^3 - 2,'b').maximal_order()
Maximal Order generated by b in Number Field in b with defining polynomial x^3 - 2
>>> from sage.all import *
>>> x = polygen(ZZ)
>>> NumberField(x**Integer(3) - Integer(2),'b').maximal_order()
Maximal Order generated by b in Number Field in b with defining polynomial x^3 - 2
minkowski_bound()[source]

Return the Minkowski bound associated to this number field.

This is a bound \(B\) so that every integral ideal is equivalent modulo principal fractional ideals to an integral ideal of norm at most \(B\).

See also

bach_bound()

OUTPUT: symbolic expression or Rational

EXAMPLES:

The Minkowski bound for \(\QQ[i]\) tells us that the class number is 1:

sage: # needs sage.symbolic
sage: K = QQ[I]
sage: B = K.minkowski_bound(); B
4/pi
sage: B.n()
1.27323954473516
>>> from sage.all import *
>>> # needs sage.symbolic
>>> K = QQ[I]
>>> B = K.minkowski_bound(); B
4/pi
>>> B.n()
1.27323954473516

We compute the Minkowski bound for \(\QQ[\sqrt[3]{2}]\):

sage: # needs sage.symbolic
sage: K = QQ[2^(1/3)]
sage: B = K.minkowski_bound(); B
16/3*sqrt(3)/pi
sage: B.n()
2.94042077558289
sage: int(B)
2
>>> from sage.all import *
>>> # needs sage.symbolic
>>> K = QQ[Integer(2)**(Integer(1)/Integer(3))]
>>> B = K.minkowski_bound(); B
16/3*sqrt(3)/pi
>>> B.n()
2.94042077558289
>>> int(B)
2

We compute the Minkowski bound for \(\QQ[\sqrt{10}]\), which has class number 2:

sage: # needs sage.symbolic
sage: K = QQ[sqrt(10)]
sage: B = K.minkowski_bound(); B
sqrt(10)
sage: int(B)
3
sage: K.class_number()
2
>>> from sage.all import *
>>> # needs sage.symbolic
>>> K = QQ[sqrt(Integer(10))]
>>> B = K.minkowski_bound(); B
sqrt(10)
>>> int(B)
3
>>> K.class_number()
2

We compute the Minkowski bound for \(\QQ[\sqrt{2}+\sqrt{3}]\):

sage: # needs sage.symbolic
sage: x = polygen(ZZ)
sage: K.<y,z> = NumberField([x^2 - 2, x^2 - 3])
sage: L.<w> = QQ[sqrt(2) + sqrt(3)]
sage: B = K.minkowski_bound(); B
9/2
sage: int(B)
4
sage: B == L.minkowski_bound()
True
sage: K.class_number()
1
>>> from sage.all import *
>>> # needs sage.symbolic
>>> x = polygen(ZZ)
>>> K = NumberField([x**Integer(2) - Integer(2), x**Integer(2) - Integer(3)], names=('y', 'z',)); (y, z,) = K._first_ngens(2)
>>> L = QQ[sqrt(Integer(2)) + sqrt(Integer(3))]; (w,) = L._first_ngens(1)
>>> B = K.minkowski_bound(); B
9/2
>>> int(B)
4
>>> B == L.minkowski_bound()
True
>>> K.class_number()
1

The bound of course also works for the rational numbers:

sage: QQ.minkowski_bound()
1
>>> from sage.all import *
>>> QQ.minkowski_bound()
1
ring_of_integers(*args, **kwds)[source]

Synonym for maximal_order().

EXAMPLES:

sage: x = polygen(ZZ)
sage: K.<a> = NumberField(x^2 + 1)
sage: K.ring_of_integers()
Gaussian Integers generated by a in Number Field in a with defining polynomial x^2 + 1
>>> from sage.all import *
>>> x = polygen(ZZ)
>>> K = NumberField(x**Integer(2) + Integer(1), names=('a',)); (a,) = K._first_ngens(1)
>>> K.ring_of_integers()
Gaussian Integers generated by a in Number Field in a with defining polynomial x^2 + 1
signature()[source]

Return \((r_1, r_2)\), where \(r_1\) and \(r_2\) are the number of real embeddings and pairs of complex embeddings of this field, respectively.

EXAMPLES:

sage: x = polygen(ZZ)
sage: NumberField(x^3 - 2, 'a').signature()
(1, 1)
>>> from sage.all import *
>>> x = polygen(ZZ)
>>> NumberField(x**Integer(3) - Integer(2), 'a').signature()
(1, 1)
sage.rings.number_field.number_field_base.is_NumberField(x)[source]

Return True if x is of number field type.

This function is deprecated.

EXAMPLES:

sage: from sage.rings.number_field.number_field_base import is_NumberField
sage: x = polygen(ZZ)
sage: is_NumberField(NumberField(x^2 + 1, 'a'))
doctest:...: DeprecationWarning: the function is_NumberField is deprecated; use
isinstance(x, sage.rings.number_field.number_field_base.NumberField) instead
See https://github.com/sagemath/sage/issues/35283 for details.
True
sage: is_NumberField(QuadraticField(-97, 'theta'))
True
sage: is_NumberField(CyclotomicField(97))
True
>>> from sage.all import *
>>> from sage.rings.number_field.number_field_base import is_NumberField
>>> x = polygen(ZZ)
>>> is_NumberField(NumberField(x**Integer(2) + Integer(1), 'a'))
doctest:...: DeprecationWarning: the function is_NumberField is deprecated; use
isinstance(x, sage.rings.number_field.number_field_base.NumberField) instead
See https://github.com/sagemath/sage/issues/35283 for details.
True
>>> is_NumberField(QuadraticField(-Integer(97), 'theta'))
True
>>> is_NumberField(CyclotomicField(Integer(97)))
True

Note that the rational numbers QQ are a number field.:

sage: is_NumberField(QQ)
True
sage: is_NumberField(ZZ)
False
>>> from sage.all import *
>>> is_NumberField(QQ)
True
>>> is_NumberField(ZZ)
False