ecpp_class_poly_tower, _ecpp_class_poly_tower
#include <flint/ecpp.h>int ecpp_class_poly_tower(fmpz_t j, slong D, flint_rand_t state, const fmpz_mod_ctx_t ctx)sourceint _ecpp_class_poly_tower(fmpz_t j, slong D, int flags, flint_rand_t state, const fmpz_mod_ctx_t ctx)sourceSet j to a root modulo the prime modulus n of ctx of the Hilbert class polynomial H_D, for a fundamental discriminant D such that n splits completely in the Hilbert class field (that is, 4n = t^2 + |D| v^2), through the class field tower of Enge and Morain [EngeMorain2003]. Return 1 on success and 0 on failure. The flags of the underscore version are ECPP_TOWER_KUMMER (compute the Kummer data, which ecpp_class_poly_tower does from ECPP_KUMMER_BITS bits) and ECPP_TOWER_J (use j rather than Weber's function).
A composition series of the class group with prime quotients p_i gives a tower of fields with relative polynomials, whose coefficients are stored in Hecke form (numerators over the derivative of the polynomial of the level below, so that all coefficients are integers) and computed numerically from the j-values ordered by cosets. Modulo n, a root is found level by level in degrees p_i instead of h. For even D, the values of Weber's function \mathfrak f (a class invariant whose class polynomial has height 72/e times smaller than that of j, with the normalisations of Enge's CM library [EngeCM; Schertz2002; YuiZagier1997]) are used instead of j, and j is recovered from the root modulo n by a closed formula. The Lagrange numerators are built by a subproduct tree, so that about 1.5 times the height of the class polynomial suffices as precision. For odd D the caller may pass 4D: the order of conductor 2 has the same class field (for D \equiv 1 \pmod 8; three times the class number for D \equiv 5 \pmod 8) and admits Weber's function, and its curves have the right order when v is even. Levels of prime degree p \ge 5 also carry Kummer data (the p-th power of the Lagrange resolvent and the ratios of the resolvents, as elements of the level below tensored with \mathbb{Q}(\zeta_p)), so that when p \mid n \pm 1 the level is descended with one p-th root instead of a root of a polynomial of degree p.
References#
- [EngeMorain2003] A. Enge and F. Morain, "Fast decomposition of polynomials with known Galois group", Applied Algebra, Algebraic Algorithms and Error-Correcting Codes (AAECC-15), LNCS 2643, Springer (2003), 254-264
- [EngeCM] A. Enge, CM - a library for the computation of class polynomials and elliptic curve primality proving, https://www.multiprecision.org/cm/
- [Schertz2002] R. Schertz, "Weber's class invariants revisited", Journal de Theorie des Nombres de Bordeaux 14 (2002), 325-343
- [YuiZagier1997] N. Yui and D. Zagier, "On the singular values of Weber modular functions", Mathematics of Computation 66 (1997), 1645-1662
The FLINT team, “ecpp_class_poly_tower, _ecpp_class_poly_tower (ecpp.h),” FLINT: Fast Library for Number Theory, documentation, version 3.7.0-dev, 2026. https://flintlib.org/doc/ecpp/ecpp_class_poly_tower.html (generated 2026-10-20).
@misc{flint-doc-ecpp-ecpp-class-poly-tower,
author = {{The FLINT team}},
title = {{ecpp\_class\_poly\_tower, \_ecpp\_class\_poly\_tower (ecpp.h)}},
howpublished = {FLINT: Fast Library for Number Theory, documentation, version 3.7.0-dev},
year = {2026},
url = {https://flintlib.org/doc/ecpp/ecpp_class_poly_tower.html},
note = {Generated 2026-10-20}
}