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