今週は、虚数乗法 をテーマとする記事を2本公開しました!
tsujimotter.hatenablog.com
tsujimotter.hatenablog.com
おかげさまでたくさんの方々に見ていただき、たくさん反響もありました。
虚数乗法は、tsujimotterがこれまで時間をかけて勉強してきたテーマの一つなので、その魅力を伝えることができて大変うれしく思います。
シリーズ前編・後編の記事を通して、
というただ1つの楕円曲線の例を扱ってきましたが、書き終わってみて もっとたくさんの具体例で計算してみたい と思うようになりました。欲張りですね。笑
そんなわけで、今回はたくさんの具体例を計算してみようという記事にしようと思います。
ところで、前回の記事では言及し忘れていたのですが、そもそも 虚数乗法を持つ楕円曲線はレア なのです。適当にやっても簡単には見つからないわけですね。
そこで、探し方も含めて紹介し、ほかの楕円曲線を計算し、それぞれのray類体を計算するところをやってみたいと思います。
なお、今回は虚2次体の類数が1の場合に限定して紹介したいと思います。2以上の類数のケースについては、また今度にしたいと思います。
目次:
虚2次体の類数が1の場合のリスト
実は、虚2次体 の類数が1の場合については、
に虚数乗法を持つ楕円曲線のリストがまとめられているのを見つけました。
虚2次体 に対応して、
に虚数乗法を持つ楕円曲線が1種類ずつ掲載されています。
類数が1の場合、実は本質的に1種類しか楕円曲線が存在しないことがわかります。同型な楕円曲線同士をひとまとめにすると、実質的に1種類になるという意味ですが、実はこの個数は の類数が 1 であることに関係しています!!
大変面白い話なので、またいずれ説明したいと思います。
一覧をこちらにも掲載しておきましょう:
虚2次体 | |
---|---|
類数1の虚2次体が上記の9個しか存在しない ことについては、以前紹介しましたね!
tsujimotter.hatenablog.com
今回は のケースについて、実際にSagemathを使って計算してみましょう。
① ℚ(√-3) の場合
まずは対応する楕円曲線 を定義して、グラフを表示してみましょう:
E = EllipticCurve([0,0,0,1,0]); E E.plot()

E[2] の計算
それではいつものように の2等分点
から計算してみましょう。等分多項式は
div_poly = E.division_polynomial(2); div_poly
f = div_poly.factor(); f
4*x^3 + 1 (4) * (x^3 + 1/4)
等分多項式の因数分解が
とかけるということですね。ということは、 の
座標のリストは
とかけるということです。ここで としています。
3つの 座標に対して、1個ずつの
座標が対応し、加えて無限遠点
を入れて4点になります。実際、各
座標を代入して
を解くと、解は となります。
よって、計算結果はこうなります:
さて、あとはこの 座標を添加した体を考えたいところですが・・・。ちょっと待ってください。ウェーバー関数の定義を再確認しましょう:
(前回の記事から再掲)
ウェーバー関数についてはまだ説明していませんでしたので、ここで説明しておきたいと思います。次のように定義されます。
まず、
に虚数乗法を持つ楕円曲線
として、係数体がそのヒルベルト類体
にあるモデルを取る必要があります。このようなモデルがとれることは、前節で述べました。その上で、
の定義方程式が
と表されるとします。もちろん
です。
このとき、点
に対して
を次のように定義します。
よくよく考えてみると、今回の定義方程式は
となっており、ウェーバー関数の適用できるモデルと異なりますね。というわけで、同型な別のモデルをとり直す必要があるわけです。
こういう問題は実際に具体例で確認してみないと、なかなか気づきませんよね。勉強になります。
さて、結論からいうと、我々の楕円曲線 に対して、変数変換
をすればよいです。 について「平方完成」するイメージですね。変換ルールを適用すると
ここで、 とおくと、この変数変換により同型写像
が得られました。
楕円曲線 の定義方程式はウェーバー関数における前提条件を満たすので、そのまま使えます。さらにいうと、
と
の
座標は変わらないので、
の
座標をそのまま使ってよいことになりますね。
ここで、 に対して
であることに注意すると
となりますが、 であるので
ということですね。
ここまできて非常に残念なことに気づいたのですが、 に
を添加しても非自明な拡大は引き起こさない です。。。
というわけで、 は計算しても、今回の目的では意味がないことが分かりました。。。
E[3] の計算
気を取り直して3等分点 を計算してみましょう。等分多項式は
div_poly = E.division_polynomial(3); div_poly
f = div_poly.factor(); f
3*x^4 + 3*x (3) * x * (x + 1) * (x^2 - x + 1)
等分多項式の因数分解が
とかけるということですね。ということは、 の
座標のリストは
ということになります。4つの 座標につき、2個ずつの
座標が対応し、加えて無限遠点
を入れて9点になります。ちゃんと
が成り立っていそうですね。
各 座標を代入して
を解けばいいですね。
実際、計算結果はこうなります:
しかしながら、このケースでも 座標を3乗したものは拡大を引き起こしません・・・。なかなか難しいですね。
E[4] の計算
最後に、 を計算しましょう。まずは等分多項式を計算します。
div_poly = E.division_polynomial(4); div_poly
f = div_poly.factor(); f
結果は次の通りです:
8*x^9 + 42*x^6 + 6*x^3 - 1 (8) * (x^3 + 1/4) * (x^6 + 5*x^3 - 1/2)
全体としては8次の多項式になり、「3次の既約多項式( のときに計算したもの)」と新しく登場した「6次の既約多項式」の積に分解されますね。
後者の方を と置き、6つの根を求めてみましょう。
g = f[1][0]; g # 多項式 g(x) = x^6 + 5*x^3 - 1/2 だけを取り出す solve(g(x), x)
結果はこちらです:
x^6 + 5*x^3 - 1/2 [x == 1/2*I*sqrt(3)*(3/2*sqrt(3) - 5/2)^(1/3) - 1/2*(3/2*sqrt(3) - 5/2)^(1/3), x == -1/2*I*sqrt(3)*(3/2*sqrt(3) - 5/2)^(1/3) - 1/2*(3/2*sqrt(3) - 5/2)^(1/3), x == (3/2*sqrt(3) - 5/2)^(1/3), x == 1/2*I*sqrt(3)*(-3/2*sqrt(3) - 5/2)^(1/3) - 1/2*(-3/2*sqrt(3) - 5/2)^(1/3), x == -1/2*I*sqrt(3)*(-3/2*sqrt(3) - 5/2)^(1/3) - 1/2*(-3/2*sqrt(3) - 5/2)^(1/3), x == (-3/2*sqrt(3) - 5/2)^(1/3)]
なるほど、ちょっと書き写すのが大変そうですね。
latex(solve(g(x), x))
とすると、結果がLaTeX化されるので、多少見やすくなります。少し手直ししてLaTeX化したものを画像にすると次のようになります:

うーん、ちょっとこれはしんどそうですね。。。
しかし、実は
と置くだけで、次のように綺麗に整理できます:
こんな風に計算できることは、@icqk3 さん、@jun2nosimobe さんに教えていただきました。ありがとうございます。
係数は単に1の3乗根なので、ウェーバー関数を通すと(3乗すると)
となります。
よって、 上の導手
のray類体
は
であることが計算できました!!! おめでとうございます!!!
「4等分点なのに が出てくるというのは、円のときと状況が違うな」と一瞬思ったのですが、
なので
としても良いわけです。そう考えると、 は1の原始4乗根なので、たしかに4等分っぽさが出てきますね。
ray類体が求まったので、素イデアルの分解法則を見てみましょう。
導手が なので、
と素な
の素イデアル
の中で、特に
を満たすものが において完全分解します。
の類数は1なので、すべてのイデアルが単項イデアルと仮定してよく、議論を楽にしてくれますね。
注意しなければならないのが、整数環 における 単数の取り扱い です。
の単数は
の6つあり、それぞれ にかけた
がすべて同じイデアルを生成します。
したがって、完全分解する条件としては
を満たすもの全てを考える必要があることに注意しましょう。
ここで、 を図示するとこうなりますね。

図の色のついた点が素元であれば、その素元 に対して
が
で完全分解することになります。
として実軸上のものだけに限定して考えるのであれば、単純に
だけを考えれば十分ですね。
以下では、 として
における素元であって
または
を満たすものを特別に考えることにしましょう。つまり、 の素元であって、(
を除く)素数に一致するものすべて、ということになりますね!
「 における素元」が「
の素数でもある」ということは、 つまり
において惰性する素数でなければなりません。そして、
において惰性する素数は、
で割って
あまる素数でした。
というわけで、 としてみましょう。
が
で完全分解することを確認します。
まずは、Sagemathで を定義します。
K.<a> = NumberField(x^2 + 3); K L.<b> = K.extension(x^2 - 3); L
この が
ですね。結果は次の通り:
Number Field in a with defining polynomial x^2 + 3 Number Field in b with defining polynomial x^2 - 3 over its base field
ここで、 の素イデアル分解を計算しましょう
K.factor(17) L.factor(17)
結果は以下の通り:
Fractional ideal (17) (Fractional ideal ((-1/6*a - 1/2)*b - 2*a + 2)) * (Fractional ideal ((1/6*a - 1/2)*b + 2*a + 2))
が
の素イデアルであり、
においては以下のように分解されることが確認できました:
2つの素イデアルの積に分解されていますが、 は2次拡大ですので、確かに完全分解していることがわかりますね。
であるような素数
について、
で完全分解するかどうかを確認しましょう。
K.<a> = NumberField(x^2 + 3); K L.<b> = K.extension(x^2 - 3); L P = Primes() p = P.first() while p < 300: if p % 3 == 2: pk = K.factor(p) pl = L.factor(p) print p, len(pk), len(pl) p = P.next(p)
以下が結果です。1列目が素数 、2列目が
での分解の個数、3列目が
での分解の個数を表します。
2 1 1 5 1 2 11 1 2 17 1 2 23 1 2 29 1 2 41 1 2 47 1 2 53 1 2 59 1 2 71 1 2 83 1 2 89 1 2 101 1 2 107 1 2 113 1 2 131 1 2 137 1 2 149 1 2 167 1 2 173 1 2 179 1 2 191 1 2 197 1 2 227 1 2 233 1 2 239 1 2 251 1 2 257 1 2 263 1 2 269 1 2 281 1 2 293 1 2
たしかに、 かつ
であるすべての素数
が
で2つの素イデアルの積に分解、すなわち完全分解していることがわかりますね!
「あれ?2は一体なぜ?」と思ったかもしれません。
素イデアル分解してみると
となるわけですが、 は
で分岐するということですね。
確かに、導手 の類体を考えていますので、
が分岐するのは問題ないですね。
というわけで、 についてはこの辺にしておきましょう。勉強になる事項がたくさん詰まった具体例でしたね。
② ℚ(√-7) の場合
続いては に虚数乗法を持つケースを考えましょう。
今度はあらかじめウェーバー関数が適用できる
という形の定義方程式に書き換えておきましょう。
まず の定義方程式の左辺に
が見えますが、これも平方完成によって
を消すことができます。両辺に
を加えて
ここで とおくと
が得られます。
次に の項を消すために、3次方程式のチルンハウス変換
を用います。
いやー、いろんなテクニックが出てきますね。
最終的に、右辺を整理すると
となります。
さて、これで同型な楕円曲線 が得られたわけですが、本当に合っているでしょうか?
前回説明したように、楕円曲線が同型であることはj不変量が等しいことと同値です。よって、j不変量を計算してみましょう。
E1 = EllipticCurve([1,-1,0,-2,-1]); E1 E1.j_invariant() E2 = EllipticCurve([0,0,0,-35/16,-49/32]); E2 E2.j_invariant()
結果は次の通りです:
Elliptic Curve defined by y^2 + x*y = x^3 - x^2 - 2*x - 1 over Rational Field -3375 Elliptic Curve defined by y^2 = x^3 - 35/16*x - 49/32 over Rational Field -3375
たしかに同型になっていますね!!! やったー!!!
さて、これで準備が完了しましたので、早速 の等分点を計算しましょう。
を計算することにします。
E = EllipticCurve([0, 0, 0, - 35/16, - 49/32]); E print "" f = E.division_polynomial(2); f f.factor() solve(f(x), x) print "" g = E.division_polynomial(3); g g.factor() solve(g(x), x)
結果は次の通りです:
Elliptic Curve defined by y^2 = x^3 - 35/16*x - 49/32 over Rational Field 4*x^3 - 35/4*x - 49/8 (4) * (x - 7/4) * (x^2 + 7/4*x + 7/8) [x == -1/8*I*sqrt(7) - 7/8, x == 1/8*I*sqrt(7) - 7/8, x == (7/4)] 3*x^4 - 105/8*x^2 - 147/8*x - 1225/256 (3) * (x^4 - 35/8*x^2 - 49/8*x - 1225/768) [x == -1/4*sqrt(21) - 1/2*sqrt(-7/6*sqrt(21) + 7/2), x == -1/4*sqrt(21) + 1/2*sqrt(-7/6*sqrt(21) + 7/2), x == 1/4*sqrt(21) - 1/2*sqrt(7/6*sqrt(21) + 7/2), x == 1/4*sqrt(21) + 1/2*sqrt(7/6*sqrt(21) + 7/2)]
すなわち、2次の等分多項式が
と表せて、その解が
であることがわかりました。
しかし、これは残念ながら に入っていますので、本質的な拡大を引き起こしませんね。というわけで、
はパスです。
一方、3次の等分多項式は
と表せて、その解が
であることがわかりました。
なかなか、いかつい形をしていますね。笑
今回のウェーバー関数は に対して
なので、
にそのまま
の値を添加した体が、
の導手
のray類体になります。
g = E.division_polynomial(3); g h = g.factor()[0][0]; h K.<a> = NumberField(x^2 + 7); K M.<b> = K.extension(h); M L.<c> = M.galois_closure(); L
先ほどの等分多項式の根から最小多項式を求めるのは大変なので、少し工夫しています。まず、等分多項式
の根の一つを に添加した拡大
を作ります。
このとき、 はガロア拡大ではないので、ガロア閉包をとって
としています。これで
が得られたことになります。
それでは、 の素イデアルを
に持ち上げたときの素イデアル分解について考えてみましょう。
の単数
を考慮すると、素元
であって
を満たす素元 によって生成される素イデアル
が、
で完全分解する素イデアルとなります。
例によって を図示すると、以下の赤色と青色の点が
の素元であれば完全分解することになります。

のときと同様、
ではない素数
であって
で惰性する素数(
)は、すべて
で完全分解することになります。
例として、 を素イデアル分解してみましょう。
K.factor(17) L.factor(17)
Fractional ideal (17) (Fractional ideal (17, c^2 - 5*c - 3)) * (Fractional ideal (17, c^2 - 7*c + 1)) * (Fractional ideal (17, c^2 - 4*c - 6)) * (Fractional ideal (17, c^2 - 4*c + 1))
は
で4つの素イデアルの積に分解しています。
実際、
L.absolute_vector_space()
とすると
(Vector space of dimension 8 over Rational Field, Isomorphism map: From: Vector space of dimension 8 over Rational Field To: Number Field in c with defining polynomial x^8 - 3*x^7 + 4*x^6 - 3*x^5 + 3*x^4 - 3*x^3 + 4*x^2 - 3*x + 1, Isomorphism map: From: Number Field in c with defining polynomial x^8 - 3*x^7 + 4*x^6 - 3*x^5 + 3*x^4 - 3*x^3 + 4*x^2 - 3*x + 1 To: Vector space of dimension 8 over Rational Field)
という結果が帰ってきますが、 は
上8次拡大です。
なので
となり、たしかに の素イデアル分解の個数と拡大次数が一致しています。すなわち、
が
で完全分解することが確認できました。
面白いですね!
③ ℚ(√-163) の場合
類数1の最後の例として、 の場合を考えましょう。対応する虚数乗法をもつ楕円曲線は
でした。
これも例によって、ウェーバー関数が適用できる形に変形したいと思います。この変形は見かけより簡単です。
まず、 とおいて
としておきます。左辺の の項を消したいので、平方完成を念頭に入れつつ
と変数変換すると
より
が得られます。
よって
ということですね。
念のため、j不変量を計算しましょう。
E1 = EllipticCurve([0, 0, 1, - 2174420, 1234136692]); E1 E1.j_invariant() E2 = EllipticCurve([0, 0, 0, - 2174420, 1234136692 + 1/4]); E2 E2.j_invariant()
Elliptic Curve defined by y^2 + y = x^3 - 2174420*x + 1234136692 over Rational Field -262537412640768000 Elliptic Curve defined by y^2 = x^3 - 2174420*x + 4936546769/4 over Rational Field -262537412640768000
たしかに一致していますね。問題なさそうです!
それでは、まずは2等分点 を計算しましょう。
E = EllipticCurve([0, 0, 0, - 2174420, 1234136692 + 1/4]); E f = E.division_polynomial(2); f f.factor() solve(f(x), x)
Elliptic Curve defined by y^2 = x^3 - 2174420*x + 4936546769/4 over Rational Field 4*x^3 - 8697680*x + 4936546769 (4) * (x^3 - 2174420*x + 4936546769/4) [x == -1/4*(163/9)^(1/3)*(sqrt(163)*sqrt(3) - 272570067)^(1/3)*(I*sqrt(3) + 1) - 40020*(163/9)^(2/3)*(-I*sqrt(3) + 1)/(sqrt(163)*sqrt(3) - 272570067)^(1/3), x == -1/4*(163/9)^(1/3)*(sqrt(163)*sqrt(3) - 272570067)^(1/3)*(-I*sqrt(3) + 1) - 40020*(163/9)^(2/3)*(I*sqrt(3) + 1)/(sqrt(163)*sqrt(3) - 272570067)^(1/3), x == 1/2*(163/9)^(1/3)*(sqrt(163)*sqrt(3) - 272570067)^(1/3) + 80040*(163/9)^(2/3)/(sqrt(163)*sqrt(3) - 272570067)^(1/3)]
LaTeXに変換すると
となりますが、もしかするといきなり当たりを引いたかもしれません。
この 座標をすべて
に添加すると、導手
のray類体が得られます。
f = E.division_polynomial(2); f K.<a> = NumberField(x^2 + 163); K M.<b> = K.extension(f); M L.<c> = M.galois_closure(); L print "" L.absolute_vector_space()
4*x^3 - 8697680*x + 4936546769 Number Field in a with defining polynomial x^2 + 163 Number Field in b with defining polynomial 4*x^3 - 8697680*x + 4936546769 over its base field Number Field in c with defining polynomial x^6 - 3*x^5 + 12*x^4 - 19*x^3 + 94*x^2 - 85*x + 227 (Vector space of dimension 6 over Rational Field, Isomorphism map: From: Vector space of dimension 6 over Rational Field To: Number Field in c with defining polynomial x^6 - 3*x^5 + 12*x^4 - 19*x^3 + 94*x^2 - 85*x + 227, Isomorphism map: From: Number Field in c with defining polynomial x^6 - 3*x^5 + 12*x^4 - 19*x^3 + 94*x^2 - 85*x + 227 To: Vector space of dimension 6 over Rational Field)
は
上の
次拡大となっていますので
ですね。
では、ray類体における素イデアルの分解法則を考えてみましょう。
のときと全く同じロジックで
であるような素元 によって生成される素イデアル
は、
で完全分解します。
ここで、 において惰性する素数が欲しいわけですが・・・。実は、これについては過去に調べています。ドカベン素数 です。
tsujimotter.hatenablog.com
まさか、この記事をもう一度引用することがあるとは思いませんでした。
やはり を考えると、これは サインプレイのサインはV?素数 になりますので、
で惰性します。よって条件に合致しますね。
K.factor(17) fac = L.factor(17); fac len(fac)
とすると、結果は
Fractional ideal (17) (Fractional ideal (17, c^2 - 2*c - 4)) * (Fractional ideal (17, c^2 - 5)) * (Fractional ideal (17, c^2 - c + 2)) 3
となり、3個の素イデアルに分解することがわかります。よって、 は
で完全分解することが確認できました!
最後に、 として、素イデアル分解を計算しましょう。
は なるか!里中パーフェクト素数 なので、
で惰性しますね。
K.factor(37) fac = L.factor(37); fac len(fac)
とすると、結果は
Fractional ideal (37) (Fractional ideal (37, c^2 + 17*c + 3)) * (Fractional ideal (37, c^2 - 19*c - 16)) * (Fractional ideal (37, c^2 - c + 13)) 3
となり、3個の素イデアルに分解することがわかります。よって、 は
で完全分解することが確認できました!
kronecker(p, -163)
で計算できますので、 で惰性する素数はSagamathでも計算できますね。
実際、300以下の素数について、計算するとこうなります。
P = Primes() p = P.first() while p < 300: if kronecker(p, -163) == -1: pk = K.factor(p) pl = L.factor(p) print p, len(pk), len(pl) p = P.next(p)
2 1 1 3 1 3 5 1 3 7 1 3 11 1 3 13 1 3 17 1 3 19 1 3 23 1 3 29 1 3 31 1 3 37 1 3 59 1 3 67 1 3 73 1 3 79 1 3 89 1 3 101 1 3 103 1 3 107 1 3 109 1 3 127 1 3 137 1 3 139 1 3 149 1 3 157 1 3 181 1 3 191 1 3 193 1 3 211 1 3 229 1 3 233 1 3 239 1 3 241 1 3 257 1 3 269 1 3 271 1 3 277 1 3 283 1 3 293 1 3
の場合は
で分岐する素イデアルなので例外として、それ以外の
で惰性する素イデアルはちゃんと完全分解することが確認できますね。
おわりに
長かったですが、お疲れ様でした!
今日は、虚2次体 の類数が1のケースに限定して、
の整数環
に虚数乗法を持つ楕円曲線について、
上のray類体を計算しました。
どの例でも、ちゃんと理論通り、素イデアルの分解法則が成立していて、気持ちよかったですね。
一方で、 とは違った事情も出てきて戸惑った部分も多々ありました。多くの具体例を計算してみないとわからないことというのは、あるものなのですね。その意味でとても勉強になりました。
さすがにそろそろ疲れてしまったので、類数が2以上のケースについては次に回したいと思います。今回は、ウェブ上にあった楕円曲線の具体例を使いましたが、そのようなことをしなくても、実は楕円曲線の例を体系的に構成することができます。
というわけで、次回は類数2のケース について計算してみることにしましょう。
それでは、今日はこの辺で!