pari-gpで代数体の計算3

# pari-gpで代数体の計算3

今回は，2次体に限らない，一般の代数体の計算や相対代数体の計算例を紹介します．

## bnf一族

初回にも登場した``bnfinit()``をはじめとするbnf一族を使ってみます．まず，$p(x)=x^3-x+1$という多項式を考え（pari-gpでは慣習として``pol``を用います），その1つの根$\alpha$を有理数体$\mathbb{Q}$に添加して得られる代数体を$k$と（pari-gpでは``bnfk``と）しましょう．

```shell-session
gp> > pol
%27 = x^3 - x + 1
gp > bnfk=bnfinit(pol);
gp > nfgaloisconj(bnfk)
%29 = [x]~
```

``nfgaloisconj()``は初登場です．``nfinit()``もしくは``bnfinit()``の出力を取り，その代数体$k$の定義多項式（今の場合，上述の$p(x)$）の根で$k$内にあるものを出力します．上の例だと，3次多項式$p(x)$の根1つだけが出力されています．よって，$k=\mathbb{Q}(\alpha)$は$\mathbb{Q}$上Galois拡大ではないことが分かります．

$p(x)$を$k$上で因子分解してみましょう．代数体$k$係数の多項式を因子分解する``nffactor()``という関数を使います．この関数を使うために確認すべき事項があるので，先にそちらを解説します．

## pari-gpにおける変数の順序

pari-gpでは，代数体$K$は$K=\mathbb{Q}$上の多項式環の剰余環$\mathbb{Q}[y]/(f(y))$として実現されているのでした（$y$は変数）．相対代数体，すなわち代数体$K$上の代数拡大$L/K$も同様です，つまり$L=\mathbb{Q}[y]/(f(y))[x]/(g(x))$, $g(x)\in \mathbb{Q}[y]/(f(y))[x]$. pari-gpでは，変数に順序（priority）がつけられており，デフォルトでは``x``が最上位，あとはアルファベット順です．

相対拡大を扱うrnf一族では，基礎体の変数のpriorityが低く，拡大体の変数のpriorityが高くなることを要請します．上の例では，priorityが最上位の``x``を変数として代数体$k$（pari-gpの計算例では``bnfk``）を用意してしまいました．こんなときは，``subst()``という関数を使って，含んでいる変数を一斉に置換することができます．

```shell-session
gp> bnfky=subst(bnfk, x, y);
gp> nfgaloisconj(bnfky)
%56 = [y]~
```

考えている3次体で定義多項式を因数分解してみましょう：

```shell-session
gp> nffactor(bnfky, bnfk.pol)
time = 1 ms.
%57 = 
[                               x + Mod(-y, y^3 - y + 1) 1]

[x^2 + Mod(y, y^3 - y + 1)*x + Mod(y^2 - 1, y^3 - y + 1) 1]
```

$k$には ``pol``の根が1つ含まれていたので，2次の因子が出てきます．出力は2行2列の行列で，各行が既約因子とその次数です．上の場合，1次の因子が1乗で，2次の因子も1乗であることがわかります．

## 相対代数体の定義：rnf一族

この2次の因子で定義される相対代数体を定義しましょう．``rnfinit()``の第一引数が基礎体となる代数体$K$，第二引数が，拡大体$L$を定義する$K$係数の多項式です：

```shell-session
gp> rnf=rnfinit(bnfky, nffactor(bnfky,bnfk.pol)[2,1]);
time = 3 ms.
gp> polq = rnfequation(bnfky, rnf.pol)
%84 = x^6 - 6*x^4 + 9*x^2 + 23
gp> nfgaloisconj(polq)
time = 3 ms.
%124 = [-x, x, -1/6*x^4 + 5/6*x^2 - 1/2*x - 2/3, -1/6*x^4 + 5/6*x^2 + 1/2*x - 2/3, 1/6*x^4 - 5/6*x^2 - 1/2*x + 2/3, 1/6*x^4 - 5/6*x^2 + 1/2*x + 2/3]~
```

``rnfequation()``によって，$L$の$\mathbb{Q}$上の定義多項式が得られます．第一引数が基礎体（変数のpriorityに関する注意が上述の通りに必要です），第二引数が相対代数体の定義多項式．この例では，$x^3-x+1$が定義する体$K$上の2次式で定義される体が$L$で（pari-gpでは``rnf``という変数に格納されている），2次拡大なので$K$上Galois拡大です．$\mathbb{Q}$上で$L$がGalois拡大かをみるために，``nfgaloisconj()``を使います．$L$の$\mathbb{Q}$上の定義多項式``polq``を与えると，6つの根が与えられていることから，$L$は$K$の$\mathbb{Q}$上のGalois閉包だと言うことが分かりました． 

## Galois群の計算

$L/\mathbb{Q}$がGalois拡大だということで，そのGalois群が気になるところです．pari-gpには，**7次以下の**有理数係数の1変数多項式のGalois群を計算する``polgalois()``と言う関数があります．引数として有理数係数多項式をとり，Galois群を返します．群の記法はマニュアル（[``polgalois()``](https://pari.math.u-bordeaux.fr/dochtml/html/General_number_fields.html#polgalois) ）を見て下さい．今の場合は次のようになり，対称群$S_3$（正三角形の2面体群）と言うことが分かります：

```shell-session
gp> polgalois(polq)
time = 5 ms.
%188 = [6, -1, 2, "D_6(6) = [3]2"]
```

### optionのデータベースの利用

オプションとして配布されているデータベースを導入すると，さらに8〜11次の多項式についても計算できます．[ここ](http://pari.math.u-bordeaux.fr/packages.html)で配布されているgaldata.tgzを適切な場所に展開するだけです．Macで標準的にインストールしたpari-gpだと，次のようになります：

```shell-session
gp> default(datadir)
%186 = "/usr/local/share/pari"
```

pari-gpのいくつかの関数は，オプションとして配布されているデータベースを利用します．楕円曲線の$a_p$（いわゆるトレース）を計算する``ellap()``や，条件を満たす楕円曲線を探索する``ellsearch()``など．これらについては別項で触れる予定です．

## 相対代数体での計算例

いま得られた6次式を，$\mathbb{Q}(\sqrt{-207})$で因子分解してみましょう（$207=3^2\cdot 23$）．

```shell-session
gp> nffactor(y^2+207, polq)
time = 2 ms.
%119 = 
[x^3 - 3*x + Mod(-1/3*y, y^2 + 207) 1]

[ x^3 - 3*x + Mod(1/3*y, y^2 + 207) 1]
```

3次の因子が$\mathbb{Q}(\sqrt{-207})$上定義する3次拡大を，再び``rnfinit()``で計算させます．得られた相対3次拡大の$\mathbb{Q}$上の定義多項式を，再び``rnfequation()``で計算します：

```shell-session
gp> rcyc3=rnfinit(bnfinit(y^2+207), x^3 - 3*x + Mod(-1/3*y, y^2 + 207));
gp> rnfequation(bnfinit(y^2+207),rcyc3.pol)
time = 2 ms.
%121 = x^6 - 6*x^4 + 9*x^2 + 23
```

これは，$L$の定義多項式と同じです．つまり，$p(x)=x^3-x+1$が定義する3次体$K$の$\mathbb{Q}$上のGalois閉包$L$に，部分体として，$\mathbb{Q}(\sqrt{-207}) = \mathbb{Q}(\sqrt{-23})$が含まれているということが分かりました．このことは，より直接，``nfsubfields()``という関数でも確かめられます．$\mathbb{Q}$上の既約多項式$p(x)$を与えると，$p(x)$の根を一付け加えた体$K=\mathbb{Q}[x]/(p(x))$の部分体$k$の定義多項式$q(x)$と，$K$の生成元$\alpha = x + (p(x))$で表示した$k$の生成元$x+(q(x))$の組のベクトルが返ります：

```shell-session
gp> nfsubfields(polq)
time = 3 ms.
%130 = [[x, 0], [x^2 + 207, 3*x^3 - 9*x], [x^3 - 9*x - 27, -1/6*x^4 + 5/6*x^2 + 3/2*x - 2/3], [x^3 - 12*x^2 + 36*x + 184, 2*x^2], [x^3 - 9*x + 27, 1/6*x^4 - 5/6*x^2 + 3/2*x + 2/3], [x^6 - 6*x^4 + 9*x^2 + 23, x]]
```

2番目の要素の``[x^2 + 207, 3*x^3 - 9*x]``に，$M=\mathbb{Q}(\sqrt{-207})$があります．

## 代数体での素イデアル分解

$f(x)=x^6 - 6x^4 + 9x^2 + 23$が定義する6次の体$L$の判別式を見ておきましょう．``factor()``により整数の素因数分解が可能です：

```shell-session
gp> bnfq=bnfinit(polq);
time = 10 ms.
gp> factor(bnfq.disc)
%141 = 
[-1 1]

[23 3]
```

$M=\mathbb{Q}(\sqrt{-207})= \mathbb{Q}(\sqrt{-23})$の判別式が$-23$で，$L$の判別式が$-23^3$ということです．$L/\mathbb{Q}$は$23$でのみ分岐することが分かりました（判別式を割る素数のみが分岐する）．$23$を$L$で素イデアル分解すると次のように3つの素イデアルの積になり，分岐指数が2, 相対次数が1. つまり，$23$は$M/\mathbb{Q}$で分岐し（分岐指数は2），$L/M$では分岐しないと言うことです．

```shell-session
gp> idealprimedec(bnfq, 23)
%138 = [[23, [-7, 0, 0, 1, 2, 0]~, 2, 1, [6, 27, -19, -32, 37, -26; 5, 11, 11, 27, -19, 32; -5, -11, 12, 19, -27, 37; -8, 10, -13, 12, -11, 27; 8, 13, -10, 11, 11, 19; -11, 8, 8, 5, 5, 17]], [23, [0, 0, 0, 1, 2, 0]~, 2, 1, [11, 4, -8, -13, 18, -12; 9, 20, 6, 4, -2, 9; -5, -6, 12, 8, -4, 18; 4, 14, -5, 12, -6, 4; 2, 7, -14, 6, 20, 2; -6, 2, -4, 5, 9, 17]], [23, [7, 0, 0, 1, 2, 0]~, 2, 1, [11, 15, -19, -5, 10, 1; -10, 1, 11, 15, -7, 20; -5, -11, 17, 19, -15, 10; 4, -5, 14, 17, -11, 15; 8, 13, 5, 11, 1, 7; -11, 8, -4, 5, -10, 22]]]
```

まとめると，$L/\mathbb{Q}$のGalois群は$S_3$で，$M/\mathbb{Q}$は2次拡大（とくに$M/\mathbb{Q}$はGalois拡大．よって$\mathrm{Gal}(L/M)$は$S_3$の位数3の正規部分群，つまり交代群$A_3$, よって$L/M$は3次巡回拡大です．また，$L/\mathbb{Q}$は$23$以外では不分岐で，23は$M/\mathbb{Q}$で分岐し，23の上にある$M$の素イデアルは$L/M$で不分岐．ということは$L/M$は不分岐3次巡回拡大である，ところまで分かりました．

## 虚2次体のHilbert類体

類体論の一つの結果として，勝手な代数体$k$に対して，$k$の**Hilbert類体**と呼ばれるものが存在します．それを$L(k)$と書くことにすると，

1. $L(k)/k$は有限次不分岐Abel拡大（$k$のどの素イデアルも分岐しない有限次Galois拡大で，そのGalois群はAbel群）で，そのようなものの中で最大，
2. $\mathrm{Gal}(L(k)/k)$と，$k$のイデアル類群$C_k$はAbel群として同型で（とくに拡大次数$[L(k):k] = h_k$, $h_k$は$k$の類数），さらに同型写像が具体的に記述できる

といった条件を満たします（実素点も分岐しないことを要請しますが，いまは虚な体を考えているので言及しませんでした）．

[最初の投稿](https://qiita.com/iwaokimura/items/6877c8b01ace4e1d9dd4) で見たように，虚2次体$M=\mathbb{Q}(\sqrt{-23})$のイデアル類群は位数3の巡回群でした（つまり，$M$の類数$h_M=3$）．前節末尾で見たように，$x^6 - 6x^4 + 9x^2 + 23$が定義する代数体$L$は$M$上不分岐3次巡回拡大，この$3$が$h_M=3$と等しいです．つまり，$L$が$M$のHilbert類体$L(M)$と一致することが分かります．

pari-gpには，2次体のHilbert類体の定義多項式を計算する``quadhilbert()``という関数が用意されているので，それで答合わせをしてみましょう．基本判別式を与えると，その判別式の平方根を添加した2次体の類体を与える（考えている2次体上の）相対的な多項式を返します．

```shell-session
gp> quadhilbert(-23)
%191 = x^3 - x^2 + 1
gp> polredbest(%191)
time = 2 ms.
%192 = x^3 - x - 1
```

``quadhilbert()``の結果から，相対代数体を定義して，その$\mathbb{Q}$上の定義多項式を得ることは，本稿で説明した手続きを繰り返すことでできます．ここでは，``polredbest()``を適用することで，冒頭の多項式$p(x)$と同じものを得ました．

[``polredbest()``](https://pari.math.u-bordeaux.fr/dochtml/html-stable/General_number_fields.html#polredbest)は，与えられた$\mathbb{Q}$上の多項式から，「いい感じに」係数の小さい，同じ体を定義する多項式を求める関数です．

（ついでに，pari-gpでは，対話的に得られた計算結果を``%191``のように取得することができます）．

``quadhilbert()``がどのように2次体のHilbert類体を計算しているのかは面白い話題です．与えられた基本判別式が負なら（つまり，虚2次体のHilbert類体の計算は），虚数乗法論を使います．あるモジュラー形式の特殊値を数値計算し，それが満たす多項式を計算します．一方，与えられた基本判別式が正なら（つまり，実2次体のHilbert類体の計算は），Stark予想を使います．これは，考えている実2次体のDedekindゼータ関数の微分の特殊値がHilbert類体を生成する，という**予想**です．Stark予想は未解決ですが，特殊値を数値計算すること，それが満たす多項式を計算することは可能です．そして，その多項式の根が生成する体のGalois群が，考えている実2次体のイデアル類群と同型であれば，Hilbert類体の一意性から，得られた多項式が正解である事は確認できます．

こういった話題については，[拙稿](http://hdl.handle.net/10110/00019075)も参照して頂けると幸いです．

## まとめ

本稿では，2次とは限らない代数体での計算例，ならびに，相対代数体での計算や，類体の計算（これは虚2次体の場合のみ）を見ました．

pari-gpの代数的整数論に関する機能の目玉としては，より本格的な類体論の計算が挙げられます．いずれ，稿をあらためて解説したいと考えています．（あるいは，レファレンスマニュアルの[Class Field Theory](https://pari.math.u-bordeaux.fr/dochtml/html-stable/General_number_fields.html#Class_field_theory)をご覧ください）．