{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Hilibert Class Polynomial\n", "Yasuaki Honda at gmail dot com\n", "\n", "Hilbert Class Polynomial \\\\(P_D(x)\\\\)of determinant \\\\(D\\\\) is defined as follows:\n", "$$ P_{D}(x)=\\prod_{i=1}^{h_{D}}{\\left(x-j\\left(a_{i}\\right)\\right)} $$\n", "where \\\\(h_D\\\\) is the class number of the determinant \\\\(D\\\\).\n", "\n", "The fact that \\\\(P_D(x) \\in Z[x]\\\\), meaning that all the coefficients of \\\\(P_D(x)\\\\) are integers. This fact can be used to determine the exact value of \\\\(j(x)\\\\) for \\\\(x\\\\) a quadratic irrational.\n", "\n", "Note that all the tools to compute the Hilbert Class Polynomial is already defined:\n", "\n", "- \\\\(D\\\\) can be computed using **FindDetIrr(p)** where p is a quadratic irrational.\n", "- \\\\(a_{i}\\\\) can be computed using **FindReducedQuadIrrD(D)**.\n", "- \\\\(h_D\\\\) can be computed using **FindClassNumberD(D)**.\n", "- \\\\(j(x)\\\\) can be computed numerically using **float_modular_j(x)** or **bfloat_modular_j(x)**." ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "install_github(\"YasuakiHonda\",\"modular_j\",\"main\")$" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "; processing (IN-PACKAGE :MAXIMA)\n", "; processing (LET NIL ...)\n", "; processing (DEFPROP |$InFD| ...)\n", "; processing (ADD2LNC (QUOTE |$InFD|) ...)\n", "; processing (DEFMTRFUN (|$InFD| $ANY ...) ...)\n", "; processing (DEFPROP |$Ta| ...)\n", "; processing (ADD2LNC (QUOTE |$Ta|) ...)\n", "; processing (DEFMTRFUN (|$Ta| $ANY ...) ...)\n", "; processing (DEFPROP |$FindInFD| ...)\n", "; processing (ADD2LNC (QUOTE |$FindInFD|) ...)\n", "; processing (DEFMTRFUN (|$FindInFD| $ANY ...) ...)\n", "; processing (LET NIL ...)\n", "; processing (DEFPROP $FLOAT_MODULAR_J ...)\n", "; processing (ADD2LNC (QUOTE $FLOAT_MODULAR_J) ...)\n", "; processing (DEFMTRFUN ($FLOAT_MODULAR_J $ANY ...) ...)\n", "; processing (DEFPROP $BFLOAT_MODULAR_J ...)\n", "; processing (ADD2LNC (QUOTE $BFLOAT_MODULAR_J) ...)\n", "; processing (DEFMTRFUN ($BFLOAT_MODULAR_J $ANY ...) ...)\n", "; processing (DEFPROP |$Checkabc| ...)\n", "; processing (ADD2LNC (QUOTE |$Checkabc|) ...)\n", "; processing (DEFMTRFUN (|$Checkabc| $ANY ...) ...)\n", "; processing (DEFPROP |$FindReducedQuadIrrD| ...)\n", "; processing (ADD2LNC (QUOTE |$FindReducedQuadIrrD|) ...)\n", "; processing (DEFMTRFUN (|$FindReducedQuadIrrD| $ANY ...) ...)\n", "; processing (DEFPROP |$FindClassNumberD| ...)\n", "; processing (ADD2LNC (QUOTE |$FindClassNumberD|) ...)\n", "; processing (DEFMTRFUN (|$FindClassNumberD| $FIXNUM ...) ...)\n", "; processing (DEFPROP |$FindClassPolyD| ...)\n", "; processing (ADD2LNC (QUOTE |$FindClassPolyD|) ...)\n", "; processing (DEFMTRFUN (|$FindClassPolyD| $ANY ...) ...)\n", "; processing (DEFPROP $IRR_NUMBER ...)\n", "; processing (ADD2LNC (QUOTE $IRR_NUMBER) ...)\n", "; processing (DEFMTRFUN ($IRR_NUMBER $ANY ...) ...)\n", "; processing (DEFPROP |$FindDetIrr| ...)\n", "; processing (ADD2LNC (QUOTE |$FindDetIrr|) ...)\n", "; processing (DEFMTRFUN (|$FindDetIrr| $ANY ...) ...)\n", "; processing (DEFPROP $EXACT_MODULAR_J ...)\n", "; processing (ADD2LNC (QUOTE $EXACT_MODULAR_J) ...)\n", "; processing (DEFMTRFUN ($EXACT_MODULAR_J $ANY ...) ...)[SB-KERNEL:REDEFINITION-WITH-DEFUN] redefining MAXIMA::|$InFD-IMPL| in DEFUN\n", "[SB-KERNEL:REDEFINITION-WITH-DEFUN] redefining MAXIMA::|$InFD| in DEFUN\n", "[SB-KERNEL:REDEFINITION-WITH-DEFUN] redefining MAXIMA::|$Ta-IMPL| in DEFUN\n", "[SB-KERNEL:REDEFINITION-WITH-DEFUN] redefining MAXIMA::|$Ta| in DEFUN\n", "[SB-KERNEL:REDEFINITION-WITH-DEFUN] redefining MAXIMA::|$FindInFD-IMPL| in DEFUN\n", "[SB-KERNEL:REDEFINITION-WITH-DEFUN] redefining MAXIMA::|$FindInFD| in DEFUN\n", "[SB-KERNEL:REDEFINITION-WITH-DEFUN] redefining MAXIMA::$FLOAT_MODULAR_J-IMPL in DEFUN\n", "[SB-KERNEL:REDEFINITION-WITH-DEFUN] redefining MAXIMA::$FLOAT_MODULAR_J in DEFUN\n", "[SB-KERNEL:REDEFINITION-WITH-DEFUN] redefining MAXIMA::$BFLOAT_MODULAR_J-IMPL in DEFUN\n", "[SB-KERNEL:REDEFINITION-WITH-DEFUN] redefining MAXIMA::$BFLOAT_MODULAR_J in DEFUN\n", "[SB-KERNEL:REDEFINITION-WITH-DEFUN] redefining MAXIMA::|$Checkabc-IMPL| in DEFUN\n", "[SB-KERNEL:REDEFINITION-WITH-DEFUN] redefining MAXIMA::|$Checkabc| in DEFUN\n", "[SB-KERNEL:REDEFINITION-WITH-DEFUN] redefining MAXIMA::|$FindReducedQuadIrrD-IMPL| in DEFUN\n", "[SB-KERNEL:REDEFINITION-WITH-DEFUN] redefining MAXIMA::|$FindReducedQuadIrrD| in DEFUN\n", "[SB-KERNEL:REDEFINITION-WITH-DEFUN] redefining MAXIMA::|$FindClassNumberD-IMPL| in DEFUN\n", "[SB-KERNEL:REDEFINITION-WITH-DEFUN] redefining MAXIMA::|$FindClassNumberD| in DEFUN\n", "[SB-KERNEL:REDEFINITION-WITH-DEFUN] redefining MAXIMA::|$FindClassPolyD-IMPL| in DEFUN\n", "[SB-KERNEL:REDEFINITION-WITH-DEFUN] redefining MAXIMA::|$FindClassPolyD| in DEFUN\n", "[SB-KERNEL:REDEFINITION-WITH-DEFUN] redefining MAXIMA::$IRR_NUMBER-IMPL in DEFUN\n", "[SB-KERNEL:REDEFINITION-WITH-DEFUN] redefining MAXIMA::$IRR_NUMBER in DEFUN\n", "[SB-KERNEL:REDEFINITION-WITH-DEFUN] redefining MAXIMA::|$FindDetIrr-IMPL| in DEFUN\n", "[SB-KERNEL:REDEFINITION-WITH-DEFUN] redefining MAXIMA::|$FindDetIrr| in DEFUN\n", "[SB-KERNEL:REDEFINITION-WITH-DEFUN] redefining MAXIMA::$EXACT_MODULAR_J-IMPL in DEFUN\n", "[SB-KERNEL:REDEFINITION-WITH-DEFUN] redefining MAXIMA::$EXACT_MODULAR_J in DEFUN\n" ] } ], "source": [ "asdf_load(\"modular_j\")$" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "data": { "text/latex": [ "\\[\\tag{${\\it \\%o}_{3}$}P_{D}(x)=\\prod_{i=1}^{h_{D}}{\\left(x-j\\left(a_{i}\\right)\\right)}\\]" ], "text/plain": [ " h\n", " D\n", " /===\\\n", " ! !\n", "(%o3) P (x) = ! ! (x - j(a ))\n", " D ! ! i\n", " i = 1" ], "text/x-maxima": [ "P[D](x) = 'product(x-j(a[i]),i,1,h[D])" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "P[D](x)=product(x-j(a[i]),i,1,h[D]);" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "data": { "text/latex": [ "\\[\\tag{${\\it \\%o}_{4}$}\\left[ \\frac{\\sqrt{15}\\,i-1}{4} , \\frac{\\sqrt{15}\\,i-1}{2} \\right] \\]" ], "text/plain": [ " sqrt(15) %i - 1 sqrt(15) %i - 1\n", "(%o4) [---------------, ---------------]\n", " 4 2" ], "text/x-maxima": [ "[(sqrt(15)*%i-1)/4,(sqrt(15)*%i-1)/2]" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "a:FindReducedQuadIrrD(-15);" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "data": { "text/latex": [ "\\[\\tag{${\\it \\%o}_{5}$}2\\]" ], "text/plain": [ "(%o5) 2" ], "text/x-maxima": [ "2" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "FindClassNumberD(-15);" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "data": { "text/latex": [ "\\[\\tag{${\\it \\%o}_{6}$}\\left(x+191657.8328625472\\right)\\,\\left(x-1.70530256582424 \\times 10^{-13}\\,i-632.8328625472075\\right)\\]" ], "text/plain": [ "(%o6) (x + 191657.8328625472) (x - 1.70530256582424e-13 %i - 632.8328625472075)" ], "text/x-maxima": [ "(x+191657.8328625472)*(x-1.70530256582424e-13*%i-632.8328625472075)" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "product(x-float_modular_j(a[i]),i,1,2);" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "data": { "text/latex": [ "\\[\\tag{${\\it \\%o}_{7}$}x^2-1.70530256582424 \\times 10^{-13}\\,i\\,x+191025.0\\,x-3.268345941408153 \\times 10^{-8}\\,i-1.21287375 \\times 10^{+8}\\]" ], "text/plain": [ " 2\n", "(%o7) x - 1.70530256582424e-13 %i x + 191025.0 x - 3.268345941408153e-8 %i\n", " - 1.21287375e+8" ], "text/x-maxima": [ "x^2-1.70530256582424e-13*%i*x+191025.0*x-3.268345941408153e-8*%i-1.21287375e+8" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "aproxpoly:expand(%);" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "data": { "text/latex": [ "\\[\\tag{${\\it \\%o}_{8}$}191025\\]" ], "text/plain": [ "(%o8) 191025" ], "text/x-maxima": [ "191025" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "(cround(z):=round(realpart(z))+round(imagpart(z)), cround(coeff(aproxpoly,x,1)));" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "data": { "text/latex": [ "\\[\\tag{${\\it \\%o}_{9}$}-121287375\\]" ], "text/plain": [ "(%o9) - 121287375" ], "text/x-maxima": [ "-121287375" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "cround(coeff(aproxpoly,x,0));" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "data": { "text/latex": [ "\\[\\tag{${\\it \\%o}_{10}$}x^2+191025\\,x-121287375\\]" ], "text/plain": [ " 2\n", "(%o10) x + 191025 x - 121287375" ], "text/x-maxima": [ "x^2+191025*x-121287375" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "x^2+%th(2)*x+%th(1);" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "data": { "text/latex": [ "\\[\\tag{${\\it \\%o}_{11}$}x^2+191025\\,x-121287375\\]" ], "text/plain": [ " 2\n", "(%o11) x + 191025 x - 121287375" ], "text/x-maxima": [ "x^2+191025*x-121287375" ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], "source": [ "FindClassPolyD(x,-15);" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Maxima", "language": "maxima", "name": "maxima" }, "language_info": { "codemirror_mode": "maxima", "file_extension": ".mac", "mimetype": "text/x-maxima", "name": "maxima", "pygments_lexer": "maxima", "version": "5.44.0" } }, "nbformat": 4, "nbformat_minor": 4 }