enumerate_totallyreal_fields_rel(F,
m,
B,
a=[],
verbose=0,
return_seqs=False)
| source code
|
This function enumerates (primitive) totally real field extensions of
degree $m>1$ of the totally real field F with discriminant $d \leq B$;
optionally one can specify the first few coefficients, where the sequence $a$
corresponds to a polynomial by
$$ a[d]*x^n + ... + a[0]*x^(n-d) $$
if length(a) = d+1, so in particular always a[d] = 1.
If verbose == 1 (or 2), then print to the screen (really) verbosely; if
verbose is a string, then print verbosely to the file specified by verbose.
If return_seqs, then return the polynomials as sequences (for easier
exporting to a file).
NOTE:
This is guaranteed to give all primitive such fields, and
seems in practice to give many imprimitive ones.
INPUT:
F -- number field, the base field
m -- integer, the degree
B -- integer, the discriminant bound
a -- list (default: []), the coefficient list to begin with
verbose -- boolean or string (default: 0)
return_seqs -- boolean (default: False)
OUTPUT:
the list of fields with entries [d,fabs,f], where
d is the discriminant, fabs is an absolute defining polynomial,
and f is a defining polynomial relative to F,
sorted by discriminant.
EXAMPLES:
In this first simple example, we compute the totally real quadratic
fields of Q(sqrt(2)) of discriminant <= 2000.
sage: ZZx = ZZ['x']
sage: F.<t> = NumberField(x^2-2)
sage: enumerate_totallyreal_fields_rel(F, 2, 2000)
[[1600, x^4 - 6*x^2 + 4, xF^2 + xF - 1]]
There is indeed only one such extension, given by F(sqrt(5)).
Next, we list all totally real quadratic extensions of Q(sqrt(5))
with root discriminant <= 10.
sage: F.<t> = NumberField(x^2-5)
sage: ls = enumerate_totallyreal_fields_rel(F, 2, 10^4)
sage: ls # random (the second factor is platform-dependent)
[[725, x^4 - x^3 - 3*x^2 + x + 1, xF^2 + (-1/2*t - 7/2)*xF + 1],
[1125, x^4 - x^3 - 4*x^2 + 4*x + 1, xF^2 + (-1/2*t - 7/2)*xF + 1/2*t + 3/2],
[1600, x^4 - 6*x^2 + 4, xF^2 - 2],
[2000, x^4 - 5*x^2 + 5, xF^2 - 1/2*t - 5/2],
[2225, x^4 - x^3 - 5*x^2 + 2*x + 4, xF^2 + (-1/2*t + 1/2)*xF - 3/2*t - 7/2],
[2525, x^4 - 2*x^3 - 4*x^2 + 5*x + 5, xF^2 + (-1/2*t - 1/2)*xF - 1/2*t - 5/2],
[3600, x^4 - 2*x^3 - 7*x^2 + 8*x + 1, xF^2 - 3],
[4225, x^4 - 9*x^2 + 4, xF^2 + (-1/2*t - 1/2)*xF - 3/2*t - 9/2],
[4400, x^4 - 7*x^2 + 11, xF^2 - 1/2*t - 7/2],
[4525, x^4 - x^3 - 7*x^2 + 3*x + 9, xF^2 + (-1/2*t - 1/2)*xF - 3],
[5125, x^4 - 2*x^3 - 6*x^2 + 7*x + 11, xF^2 + (-1/2*t - 1/2)*xF - t - 4],
[5225, x^4 - x^3 - 8*x^2 + x + 11, xF^2 + (-1/2*t - 1/2)*xF - 1/2*t - 7/2],
[5725, x^4 - x^3 - 8*x^2 + 6*x + 11, xF^2 + (-1/2*t + 1/2)*xF - 1/2*t - 7/2],
[6125, x^4 - x^3 - 9*x^2 + 9*x + 11, xF^2 + (-1/2*t + 1/2)*xF - t - 4],
[7225, x^4 - 11*x^2 + 9, xF^2 + (-1)*xF - 4],
[7600, x^4 - 9*x^2 + 19, xF^2 - 1/2*t - 9/2],
[7625, x^4 - x^3 - 9*x^2 + 4*x + 16, xF^2 + (-1/2*t - 1/2)*xF - 4],
[8000, x^4 - 10*x^2 + 20, xF^2 - t - 5],
[8525, x^4 - 2*x^3 - 8*x^2 + 9*x + 19, xF^2 + (-1)*xF - 1/2*t - 9/2],
[8725, x^4 - x^3 - 10*x^2 + 2*x + 19, xF^2 + (-1/2*t - 1/2)*xF - 1/2*t - 9/2],
[9225, x^4 - x^3 - 10*x^2 + 7*x + 19, xF^2 + (-1/2*t + 1/2)*xF - 1/2*t - 9/2]]
sage: [ f[0] for f in ls ]
[725, 1125, 1600, 2000, 2225, 2525, 3600, 4225, 4400, 4525, 5125, 5225, 5725, 6125, 7225, 7600, 7625, 8000, 8525, 8725, 9225]
sage: [NumberField(ZZx(x[1]), 't').is_galois() for x in ls]
[False, True, True, True, False, False, True, True, False, False, False, False, False, True, True, False, False, True, False, False, False]
Eight out of 21 such fields are Galois (with Galois group Z/4Z
or Z/2Z + Z/2Z); the others have have Galois closure of degree 8
(with Galois group D_8).
Finally, we compute the cubic extensions of Q(zeta_7)^+ with
discriminant <= 17*10^9.
sage: F.<t> = NumberField(ZZx([1,-4,3,1]))
sage: F.disc()
49
sage: enumerate_totallyreal_fields_rel(F, 3, 17*10^9) # not tested
[[16240385609L, x^9 - x^8 - 9*x^7 + 4*x^6 + 26*x^5 - 2*x^4 - 25*x^3 - x^2 + 7*x + 1, xF^3 + (-t^2 - 4*t + 1)*xF^2 + (t^2 + 3*t - 5)*xF + 3*t^2 + 11*t - 5]] # 32 bit
[[16240385609, x^9 - x^8 - 9*x^7 + 4*x^6 + 26*x^5 - 2*x^4 - 25*x^3 - x^2 + 7*x + 1, xF^3 + (-t^2 - 4*t + 1)*xF^2 + (t^2 + 3*t - 5)*xF + 3*t^2 + 11*t - 5]] # 64 bit
NOTES:
We enumerate polynomials
f(x) = x^n + a[n-1]*x^(n-1) + ... + a[0].
A relative Hunter's theorem gives bounds on a[n-1] and a[n-2];
then given a[n-1] and a[n-2], one can recursively compute bounds on
a[n-3], ..., a[0] using the fact that the polynomial is totally real
by looking at the zeros of successive derivatives and applying
Rolle's theorem!
See references in totallyreal.py.
AUTHORS:
- John Voight (2007-11-01)
|