Maxima で綴る数学の旅

紙と鉛筆の代わりに、数式処理システムMaxima / Macsyma を使って、数学を楽しみましょう

-数学- 楕円モジュラー関数/j不変量 (5)  j(t)の特殊値の計算

f:id:jurupapa:20210118223616j:plain

この記事のコードをJupyter notebook形式で見るにはこちら。

 

このシリーズの目標は楕円モジュラー関数/j不変量の虚2次無理数での値を正確に求めることでした。そのために前回の記事:

 

maxima.hatenablog.jp

ではヒルベルト多項式を求めました。\(j(t)\)はヒルベルト多項式の解になっているのですから、多項式を解いて正しい解を選べば、それが正確な値となります。もう少しきちんと書くと、

  • \(t\)を与えられた虚2次無理数とします。
  • ヒルベルト多項式を代数的に解いて得られる厳密解(重根も含めて類数の個数だけ得られる)の中に\(j(t)\)の正確な値が含まれています。
  • 全ての厳密解から数値計算した値と\(j(t)\)を数値計算した値を比較して最も一致する厳密解が\(j(t)\)の正確な値になります。

やってみましょう。

(%i??) install_github("YasuakiHonda","modular_j","main")$

(%i??) asdf_load("modular_j")$

今回は例として判別式が-15であるような2次無理数を使います。

(%i3) irr_list:FindReducedQuadIrrD(-15);

$$ \tag{${\it \%o}_{3}$}\left[ \frac{\sqrt{15}\,i-1}{4} , \frac{\sqrt{15}\,i-1}{2} \right] $$

このリストの最初の2次無理数に対応するj関数の値\(j(\frac{\sqrt{15}\,i-1}{4})\)、2番目の2次無理数に対応するj関数の値\(j(\frac{\sqrt{15}\,i-1}{2})\)を正確に求めることが目標です。

 

まず判別式-15のヒルベルト多項式を求めます。
(%i4) cpoly:FindClassPolyD(x,-15);

$$ \tag{${\it \%o}_{4}$}x^2+191025\,x-121287375 $$

この類多項式を代数的に解いてみます。
(%i5) map(factor,solve(cpoly,x));

$$ \tag{${\it \%o}_{5}$}\left[ x=-\frac{135\,\left(637\,\sqrt{5}+1415\right)}{2} , x=\frac{135\,\left(637\,\sqrt{5}-1415\right)}{2} \right] $$

(%o5)のリストの2つの数が\(j(\frac{\sqrt{15}\,i-1}{4})\), \(j(\frac{\sqrt{15}\,i-1}{2})\)の値に対応します。どちらがどちらかは数値計算の値を比較すればすぐに分かります。まず(%o5)のリストを数値計算します。
(%i6) map(bfloat,%),fpprec:32;

$$ \tag{${\it \%o}_{6}$}\left[ x=-1.9165783286254720747135344482127_B \times 10^{5} , x=6.3283286254720747135344482127308_B \times 10^{2} \right] $$

一方、\(j(\frac{\sqrt{15}\,i-1}{4})\)の数値計算は次の式で求まります。
(%i7) bfloat_modular_j(irr_list[1]);

$$ \tag{${\it \%o}_{7}$}3.2325610906099284497791461659779_B \times 10^{-24}\,i+6.3283286254720747135344450544908_B \times 10^{2} $$

虚数部は無視できるほど小さいこと、実部は%o6の2番目の値と一致することから、%o5の2番目の値であることが分かります。

 

では\(j(\frac{\sqrt{15}\,i-1}{2})\)の数値計算の値は、
(%i8) bfloat_modular_j(irr_list[2]);

$$ \tag{${\it \%o}_{8}$}-1.9165783286254720747135344482127_B \times 10^{5} $$

と分かります。これは%o6の最初の値と一致しています。従って、\(j(\frac{\sqrt{15}\,i-1}{2})\)の正確な値は%o5の最初の値であることが分かります。APIとして実装されているexact_modular_j(t)関数を使って確かめておきましょう。
(%i9) factor(exact_modular_j(irr_list[2]));

$$ \tag{${\it \%o}_{9}$}-\frac{135\,\left(637\,\sqrt{5}+1415\right)}{2} $$