この記事のコードをJupyter notebook形式で見るにはこちら。
共通の判別式\(D\)を持つ簡約虚2次無理数を全て求めることが出来れば、ヒルベルト類多項式を求めるのはあと一歩です。まずヒルベルト類多項式の定義を見てみましょう。
$$P_{D}(x)=\prod_{i=1}^{h_{D}}{\left(x-j\left(a_{i}\right)\right)}$$
\(a_i,\, i=1\cdots h_D\)は判別式Dを持つ全ての簡約虚2次無理数を表します。
見てすぐ分かることは、この多項式は次数が\(h_D\)で根が\(j(a_i)\)です。
また別途証明が必要なことですが、\(P_{D}(x)\)は係数が全て整数です。これ、超重要です。
判別式\(D\)が与えられた時に、対応する\(P_{D}(x)\)を近似的に計算するための道具は全て揃っています。
- \(a_i\)はFindReducedQuadIrrD(D)で計算できます。
- \(h_D\)はFindClassNumberD(D)で計算できます。
- \(j(x)\)は数値計算ではfloat_modularj(x)あるいはbfloat_modular_j(x)を使って計算出来ます。
やってみましょう。
(%i1) install_github("YasuakiHonda","modular_j","main")$
(%i2) asdf_load("modular_j")$
判別式として\(-15\)を選んでみます。
(%i6) a:FindReducedQuadIrrD(-15);
$$ \tag{${\it \%o}_{6}$}\left[ \frac{\sqrt{15}\,i-1}{4} , \frac{\sqrt{15}\,i-1}{2} \right] $$
2つの簡約虚2次無理数がもとまりました。
(%i7) FindClassNumberD(-15);
$$ \tag{${\it \%o}_{7}$}2 $$
類数は2です。
次にヒルベルト類多項式の定義式の各部分を計算に必要な値/式に置き換えます。
(%i8) aproxpoly:expand(product(x-float_modular_j(a[i]),i,1,2));
$$ \tag{${\it \%o}_{8}$}x^2-1.70530256582424 \times 10^{-13}\,i\,x+191025.0\,x-3.268345941408153 \times 10^{-8}\,i-1.21287375 \times 10^{+8} $$
近似的な多項式が求まりました。本来この多項式は整数のはずですから、各係数を最も近い整数点に丸めましょう。
(%i27) (cround(z):=round(realpart(z))+round(imagpart(z)), cround(coeff(aproxpoly,x,1)));
$$ \tag{${\it \%o}_{27}$}191025 $$
(%i28) cround(coeff(aproxpoly,x,0));
$$ \tag{${\it \%o}_{28}$}-121287375 $$
という訳で次の式が\(D=-15\)のヒルベルト類多項式です。
(%i29) x^2+%th(2)*x+%th(1);
$$ \tag{${\it \%o}_{29}$}x^2+191025\,x-121287375 $$
APIとして用意されている関数FindClassPolyD() を使って判別式が-15のヒルベルト類多項式を求めると次のようになります。
(%i30) FindClassPolyD(x,-15);
$$ \tag{${\it \%o}_{30}$}x^2+191025\,x-121287375 $$
当たり前ですが、(%o29)と(%o30)は一致しました。
数値計算による近似で多項式を近似的に求め、整数係数であることから正確な多項式を求める、というのは以前方程式のガロア群を求めた際にehitoさんから教えて頂いたやり方と同じです。
この近似計算も含めて上記の計算については
のp260〜p262に記載されており、参考にしました。
またtsujimotterさんのブログ記事:
の前半にもこの計算方法が掲載されています。こちらも分かりやすく参考になりました。