Enumeration of totally real fields: data#

AUTHORS:

  • John Voight (2007-09-01): Initial version

  • John Voight (2007-09-19): various optimization tweaks

  • John Voight (2007-10-09): improvements: Smyth bound, Lagrange multipliers for b

  • Craig Citro and John Voight (2007-11-04): type checking and other polishing

sage.rings.number_field.totallyreal_data.easy_is_irreducible_py(f)[source]#

Used solely for testing easy_is_irreducible.

EXAMPLES:

sage: sage.rings.number_field.totallyreal_data.easy_is_irreducible_py(pari('x^2+1'))
1
sage: sage.rings.number_field.totallyreal_data.easy_is_irreducible_py(pari('x^2-1'))
0
>>> from sage.all import *
>>> sage.rings.number_field.totallyreal_data.easy_is_irreducible_py(pari('x^2+1'))
1
>>> sage.rings.number_field.totallyreal_data.easy_is_irreducible_py(pari('x^2-1'))
0
sage.rings.number_field.totallyreal_data.hermite_constant(n)[source]#

Return the \(n\)-th Hermite constant.

The \(n\)-th Hermite constant (typically denoted \(\gamma_n\)), is defined to be

\[\max_L \min_{0 \neq x \in L} ||x||^2\]

where \(L\) runs over all lattices of dimension \(n\) and determinant \(1\).

For \(n \leq 8\) it returns the exact value of \(\gamma_n\), and for \(n > 9\) it returns an upper bound on \(\gamma_n\).

INPUT:

  • n – integer

OUTPUT:

(an upper bound for) the Hermite constant \(\gamma_n\)

EXAMPLES:

sage: hermite_constant(1) # trivial one-dimensional lattice
1.0
sage: hermite_constant(2) # Eisenstein lattice
1.1547005383792515
sage: 2/sqrt(3.)
1.15470053837925
sage: hermite_constant(8) # E_8
2.0
>>> from sage.all import *
>>> hermite_constant(Integer(1)) # trivial one-dimensional lattice
1.0
>>> hermite_constant(Integer(2)) # Eisenstein lattice
1.1547005383792515
>>> Integer(2)/sqrt(RealNumber('3.'))
1.15470053837925
>>> hermite_constant(Integer(8)) # E_8
2.0

Note

The upper bounds used can be found in [CS1999] and [CE2003].

AUTHORS:

  • John Voight (2007-09-03)

sage.rings.number_field.totallyreal_data.int_has_small_square_divisor(d)[source]#

Return the largest \(a\) such that \(a^2\) divides \(d\) and \(a\) has prime divisors \(< 200\).

EXAMPLES:

sage: from sage.rings.number_field.totallyreal_data import int_has_small_square_divisor
sage: int_has_small_square_divisor(500)
100
sage: is_prime(691)
True
sage: int_has_small_square_divisor(691)
1
sage: int_has_small_square_divisor(691^2)
1
>>> from sage.all import *
>>> from sage.rings.number_field.totallyreal_data import int_has_small_square_divisor
>>> int_has_small_square_divisor(Integer(500))
100
>>> is_prime(Integer(691))
True
>>> int_has_small_square_divisor(Integer(691))
1
>>> int_has_small_square_divisor(Integer(691)**Integer(2))
1
sage.rings.number_field.totallyreal_data.lagrange_degree_3(n, an1, an2, an3)[source]#

Private function. Solves the equations which arise in the Lagrange multiplier for degree 3: for each \(1 \leq r \leq n-2\), we solve

\[r*x^i + (n-1-r)\cdot y^i + z^i = s_i \quad (i = 1,2,3)\]

where the \(s_i\) are the power sums determined by the coefficients \(a\). We output the largest value of \(z\) which occurs. We use a precomputed elimination ideal.

EXAMPLES:

sage: ls = sage.rings.number_field.totallyreal_data.lagrange_degree_3(3,0,1,2)
sage: [RealField(10)(x) for x in ls]
[-1.0, -1.0]
sage: sage.rings.number_field.totallyreal_data.lagrange_degree_3(3,6,1,2) # random
[-5.8878, -5.8878]
>>> from sage.all import *
>>> ls = sage.rings.number_field.totallyreal_data.lagrange_degree_3(Integer(3),Integer(0),Integer(1),Integer(2))
>>> [RealField(Integer(10))(x) for x in ls]
[-1.0, -1.0]
>>> sage.rings.number_field.totallyreal_data.lagrange_degree_3(Integer(3),Integer(6),Integer(1),Integer(2)) # random
[-5.8878, -5.8878]
class sage.rings.number_field.totallyreal_data.tr_data[source]#

Bases: object

This class encodes the data used in the enumeration of totally real fields.

We do not give a complete description here. For more information, see the attached functions; all of these are used internally by the functions in totallyreal, so see that file for examples and further documentation.

increment(verbose=False, haltk=0, phc=False)[source]#

‘Increment’ the totally real data to the next value which satisfies the bounds essentially given by Rolle’s theorem, and return the next polynomial as a sequence of integers.

The default or usual case just increments the constant coefficient; then inductively, if this is outside of the bounds we increment the next higher coefficient, and so on.

If there are no more coefficients to be had, returns the zero polynomial.

INPUT:

  • verbose – boolean to print verbosely computational details

  • haltk – integer, the level at which to halt the inductive coefficient bounds

  • phc – boolean, if PHCPACK is available, use it when \(k = n-5\) to compute an improved Lagrange multiplier bound

OUTPUT:

The next polynomial, as a sequence of integers

EXAMPLES:

sage: T = sage.rings.number_field.totallyreal_data.tr_data(2,100)
sage: T.increment()
[-24, -1, 1]
sage: for i in range(19): _ = T.increment()
sage: T.increment()
[-3, -1, 1]
sage: T.increment()
[-25, 0, 1]
>>> from sage.all import *
>>> T = sage.rings.number_field.totallyreal_data.tr_data(Integer(2),Integer(100))
>>> T.increment()
[-24, -1, 1]
>>> for i in range(Integer(19)): _ = T.increment()
>>> T.increment()
[-3, -1, 1]
>>> T.increment()
[-25, 0, 1]
printa()[source]#

Print relevant data for self.

EXAMPLES:

sage: T = sage.rings.number_field.totallyreal_data.tr_data(3,2^10)
sage: T.printa()
k = 1
a = [0, 0, -1, 1]
amax = [0, 0, 0, 1]
beta =  [...]
gnk =  [...]
>>> from sage.all import *
>>> T = sage.rings.number_field.totallyreal_data.tr_data(Integer(3),Integer(2)**Integer(10))
>>> T.printa()
k = 1
a = [0, 0, -1, 1]
amax = [0, 0, 0, 1]
beta =  [...]
gnk =  [...]