Testing latest pari + WASM + node.js... and it works?! Wow.
License: GPL3
ubuntu2004
Function: polclass Section: polynomials C-Name: polclass Prototype: GD0,L,Dn Help: polclass(D, {inv = 0}, {x = 'x}): return a polynomial generating the Hilbert class field of Q(sqrt(D)) for the discriminant D<0. Doc: Return a polynomial in $\Z[x]$ generating the Hilbert class field for the imaginary quadratic discriminant $D$. If $inv$ is 0 (the default), use the modular $j$-function and return the classical Hilbert polynomial, otherwise use a class invariant. The following invariants correspond to the different values of $inv$, where $f$ denotes Weber's function \kbd{weber}, and $w_{p,q}$ the double eta quotient given by $w_{p,q} = \dfrac{ \eta(x/p)\*\eta(x/q) }{ \eta(x)\*\eta(x/{pq}) }$ The invariants $w_{p,q}$ are not allowed unless they satisfy the following technical conditions ensuring they do generate the Hilbert class field and not a strict subfield: \item if $p\neq q$, we need them both noninert, prime to the conductor of $\Z[\sqrt{D}]$. Let $P, Q$ be prime ideals above $p$ and $q$; if both are unramified, we further require that $P^{\pm 1} Q^{\pm 1}$ be all distinct in the class group of $\Z[\sqrt{D}]$; if both are ramified, we require that $PQ \neq 1$ in the class group. \item if $p = q$, we want it split and prime to the conductor and the prime ideal above it must have order $\neq 1, 2, 4$ in the class group. \noindent Invariants are allowed under the additional conditions on $D$ listed below. \item 0 : $j$ \item 1 : $f$, $D = 1 \mod 8$ and $D = 1,2 \mod 3$; \item 2 : $f^2$, $D = 1 \mod 8$ and $D = 1,2 \mod 3$; \item 3 : $f^3$, $D = 1 \mod 8$; \item 4 : $f^4$, $D = 1 \mod 8$ and $D = 1,2 \mod 3$; \item 5 : $\gamma_2= j^{1/3}$, $D = 1,2 \mod 3$; \item 6 : $w_{2,3}$, $D = 1 \mod 8$ and $D = 1,2 \mod 3$; \item 8 : $f^8$, $D = 1 \mod 8$ and $D = 1,2 \mod 3$; \item 9 : $w_{3,3}$, $D = 1 \mod 2$ and $D = 1,2 \mod 3$; \item 10: $w_{2,5}$, $D \neq 60 \mod 80$ and $D = 1,2 \mod 3$; \item 14: $w_{2,7}$, $D = 1 \mod 8$; \item 15: $w_{3,5}$, $D = 1,2 \mod 3$; \item 21: $w_{3,7}$, $D = 1 \mod 2$ and $21$ does not divide $D$ \item 23: $w_{2,3}^2$, $D = 1,2 \mod 3$; \item 24: $w_{2,5}^2$, $D = 1,2 \mod 3$; \item 26: $w_{2,13}$, $D \neq 156 \mod 208$; \item 27: $w_{2,7}^2$, $D\neq 28 \mod 112$; \item 28: $w_{3,3}^2$, $D = 1,2 \mod 3$; \item 35: $w_{5,7}$, $D = 1,2 \mod 3$; \item 39: $w_{3,13}$, $D = 1 \mod 2$ and $D = 1,2 \mod 3$; The algorithm for computing the polynomial does not use the floating point approach, which would evaluate a precise modular function in a precise complex argument. Instead, it relies on a faster Chinese remainder based approach modulo small primes, in which the class invariant is only defined algebraically by the modular polynomial relating the modular function to $j$. So in fact, any of the several roots of the modular polynomial may actually be the class invariant, and more precise assertions cannot be made. For instance, while \kbd{polclass(D)} returns the minimal polynomial of $j(\tau)$ with $\tau$ (any) quadratic integer for the discriminant $D$, the polynomial returned by \kbd{polclass(D, 5)} can be the minimal polynomial of any of $\gamma_2 (\tau)$, $\zeta_3 \gamma_2 (\tau)$ or $\zeta_3^2 \gamma_2 (\tau)$, the three roots of the modular polynomial $j = \gamma_2^3$, in which $j$ has been specialised to $j (\tau)$. The modular polynomial is given by $j = {(f^{24}-16)^3 \over f^{24}}$ for Weber's function $f$. For the double eta quotients of level $N = p q$, all functions are covered such that the modular curve $X_0^+ (N)$, the function field of which is generated by the functions invariant under $\Gamma^0 (N)$ and the Fricke--Atkin--Lehner involution, is of genus $0$ with function field generated by (a power of) the double eta quotient $w$. This ensures that the full Hilbert class field (and not a proper subfield) is generated by class invariants from these double eta quotients. Then the modular polynomial is of degree $2$ in $j$, and of degree $\psi (N) = (p+1)(q+1)$ in $w$. \bprog ? polclass(-163) %1 = x + 262537412640768000 ? polclass(-51, , 'z) %2 = z^2 + 5541101568*z + 6262062317568 ? polclass(-151,1) x^7 - x^6 + x^5 + 3*x^3 - x^2 + 3*x + 1 @eprog