E8-格子にふれる
イントロ:E8-格子と約数関数
以前の記事で のルート系が2項正20面体群から得られることについて書いた.
その際, -格子に含まれる, 「長さの2乗」=「ノルム」*1が の点の総数 が以下の式で与えられるという事実 [Conway]を引用した.
不思議だ. なぜここに数論的な関数が…? なぜ3乗…?などなど.
「-格子に含まれる, ノルムがの点の総数」が次の8変数2次形式で表される方程式の解の個数に等しいことを踏まえるとより不思議さが際立つ.
\begin{gather}
x_1^2+x_2^2+x_3^2+x_4^2+x_5^2+x_6^2+x_7^2+x_8^2
-x_1x_2-x_2x_3-x_3x_4-x_4x_5-x_5x_6-x_7x_8-x_3x_8 = m,\\
x_1,x_2,x_3,x_4,x_5,x_6,x_7,x_8\in\mathbb{Z},\ m\in\mathbb{N}.
\end{gather}
ところで, 2次形式で表される方程式と言えば, 数論ではもう少し分かりやすいものが先に現れる. 2平方和定理と4平方和定理である[Koblitz, 志賀, Wiki1, Wiki2].
一見 -格子の場合より簡単そうな問題に見えるが, 約数全体の和にならないため解の個数の表式はやや複雑になっている.
なにが -格子の場合の簡潔さをもたらしているのだろう?
実はこのことは,「-格子のテータ関数がモジュラー形式であること」の直接的な帰結となっている.
格子
定義
格子に関するいくつかの術語の定義からはじめよう. における格子 とは, の基底 があって, それらの整数係数線形結合の全体である. つまり,
\begin{align}
\Lambda = \left\{\sum_{i=1}^n m_ia_i \,\middle|\, m_i\in\mathbb{Z},1\leq i \leq n\right\}.
\end{align}
の成分を縦ベクトルとして並べたものをとしよう. の-基底がもうひとつあって と表され, これを並べたものもまた とする. このとき, ある整数係数の 正方行列 があって とあらわされる. 基底同士の変換であるから は可逆でなくてはならず, さらに, 逆行列もまた全ての係数が整数でなくてはならない. すなわち, . ゆえに, . 「基底の成分を並べた行列」の行列式は, 基底のとりかたによらず一意に決まるということ.
この行列式は基本領域 の体積に一致する.
\begin{align}
{\rm Vol}({\mathbb R}^n/\Lambda) = |{\det(A)}|.
\end{align}
グラム行列
格子のグラム行列(Gram matrix, Gramian) は,
\begin{align}
G=A^TA
\end{align}
で定義される. 明らかに, . グラム行列の行列式の値もまたに対して一意に決まることから, 「格子の行列式」をと決める.
双対格子
格子があれば, その双対格子(dual lattice)が決まる. の双対格子 とは, の全ての元との内積が整数となるの元の全体である:
\begin{align}
\Lambda^* = \left\{ x\in\mathbb{R}^n\,\middle|\,(x,r)\in\mathbb{Z},\, \forall r \in \Lambda\right\}.
\end{align}
ここではの標準内積.
となる をとると, の基底になる. この成分を縦ベクトルとして並べると に一致する.
整格子・ユニモジュラー格子・偶格子・奇格子
格子の元同士の内積が全て整数であるとき, 整格子(integral lattice)という. 定義から, 整格子はその双対格子の部分格子になる: .
双対格子が元の格子に一致するとき, その格子は自己双対, また, ユニモジュラー(unimodular)であるという.
さらに, ノルムが全て偶数のとき, 偶格子(even lattice), そうでないとき奇格子(odd lattice)という.
テータ関数
定義
格子に対してそのテータ関数が定義できる.
格子 のテータ関数 は, を取ったとき,
と定義される. グラム行列を使うと,
とも書ける.
テータ関数は格子 に含まれる, ノルムが の元の総数 の母関数とみなせる.
グラム行列が正定値なら の項は零ベクトルに対応して係数1で, その他の項は自然数のみに渡る.
テータ関数の変換性
の変換で と写ることから,
従って, が偶格子のときに限り, が成り立つ.*2
双対格子のテータ関数について, 次の事実が知られている [Conway].
このテータ関数を用いて, 次のことが示されている.
そして, 偶ユニモジュラー格子の存在が許される最小次元 8 における唯一の偶ユニモジュラー格子こそが, -格子なのである.
E8-格子
-格子を定義しよう. -格子として, の部分集合で次の成分を持つものの全体をとることができる.
\begin{align}
\Lambda_8 =
\left\{(x_1,x_2,x_3,x_4,x_5,x_6,x_7,x_8) \in
{\mathbb Z}^8\cup\left(\mathbb{Z}+\frac{1}{2}\right)^8
\,\middle|\, \sum_{i=1}^8 x_i \in 2\mathbb{Z}
\right\}
\end{align}
つまり, 「8成分すべてが整数であるか半奇数であって, その和が偶数であるような点の全体」と言える.
自分はリー代数とルート系との関係からを知ったので, こんな風に簡潔な見た目をしているのを見るのはなんだか奇妙な気分になる. 以前に「六芒星から7次元クロス積と8次元の積が出てくる」ことについて書いた(過去記事参照).
あえて格子の言葉で表現するなら, 「六角格子と八元数の自己同型群であるがルート系を通して結びつく」ということであった. の場合にも, こんなきれいな見た目をした格子の中からノルム2の元240個を取って対応するリー代数を作ると, 「248次元の随伴表現が最小の忠実な既約表現となるリー代数」という化け物じみたものが出てくるというのはやはり不思議である.
閑話休題.
上のように表記したとき, が格子であることは簡単に分かる. ふたつの元を取ってその差がまた に含まれることをいえばよい.
偶格子であること・ユニモジュラー格子であることを示すために, 基底を取ろう. 単純ルートをとると都合がよい.
まず, ノルム2の元(明らかにノルム2未満の点は0を除いて存在しない)は次の形をしたものですべてであることが分かる.
- とその成分を入れ替えた点. 複号はすべての場合をとる.
個ある.
- の形をした点. 複号は, 偶数個だけを取る.
個ある.
あわせて個. これらを列挙して, に導入された次の全順序でソートする.
Numpyを使う.
import numpy as np
分数は少しやりづらいので, 2倍して のノルム8の元で考える.
R = [] #(±2,±2,0,0,0,0,0,0)型の点 for i in range(8): for j in range(i+1,8): for s in [(2,2),(2,-2),(-2,2),(-2,-2)]: v = np.zeros(8,dtype=int) v[i] = s[0] v[j] = s[1] R.append(v) #(±1,...,±1)型の点 for i in range(2**8): v = np.array([2*int(a)-1 for a in format(i,"08b")],dtype=int) #iを0埋めした2進法で表す > 配列に変換 > 2倍して1引く. if(sum(v)%4==0): R.append(v)
for i,r in enumerate(R): print(i,r)
出力.
0 [2 2 0 0 0 0 0 0] 1 [ 2 -2 0 0 0 0 0 0] 2 [-2 2 0 0 0 0 0 0] 3 [-2 -2 0 0 0 0 0 0] ・・・(中略)・・・ 236 [ 1 1 1 1 1 -1 -1 1] 237 [ 1 1 1 1 1 -1 1 -1] 238 [ 1 1 1 1 1 1 -1 -1] 239 [1 1 1 1 1 1 1 1]
これらの全成分に2を加えて成分を正にする. すると成分は全て0,1,2,3,4になるため, つなげて読めば10進法の数になる.
S = list(map(lambda x : int(''.join(np.array(x+2,dtype=str))), R)) print(S)
出力.
[44222222, 40222222, 4222222, 222222,・・・(中略)・・・33333113, 33333131, 33333311, 33333333]
これをソートすれば, 上で定義した全順序で並べ替えるのと同じことになる.
S = sorted(S) print(S)
出力.
[222222, 2022222, 2202222, 2220222,・・・(中略)・・・, 42224222, 42242222, 42422222, 44222222]
10進法から逆に8成分ベクトルに戻してやる.
R = list(map(lambda x:np.array(list(str(x).zfill(8)),dtype=int)-2,S)) for i,r in enumerate(R): print(i,r)
出力.
0 [-2 -2 0 0 0 0 0 0] 1 [-2 0 -2 0 0 0 0 0] 2 [-2 0 0 -2 0 0 0 0] 3 [-2 0 0 0 -2 0 0 0] ・・・(中略)・・・ 236 [2 0 0 0 2 0 0 0] 237 [2 0 0 2 0 0 0 0] 238 [2 0 2 0 0 0 0 0] 239 [2 2 0 0 0 0 0 0]
このうち, ちょうど半分の120本の「正」のものだけを取り出す.
P = R[120:] print(len(P))
120
これは正ルートにあたる.
この中から, 次の方法で基底を選び取る.
- まず最小のベクトルをとり, 部分格子の基底 に加える.
- 次のベクトル は明らかにの定数倍ではないため に加える.
- 次のベクトル が で張られないならに加える. 張られるなら加えずに次へ.
- 以下同様.
が によって張られるか張られないかは以下のように判定する.
と表されるとする. はの張る空間の直交補空間の元.
を の連立1次方程式と見て解くと が得られる. すると の張る空間への射影 が計算できて, これが0かそうでないかを見ればよい.
B = np.array([P[0],P[1]]) G = B@B.T #部分格子のグラム行列 G_inv = np.linalg.inv(G) #グラム行列の逆行列 print(B) for i,p in enumerate(P): q = (G_inv@(B@p.T))@B #部分格子への射影 r = np.linalg.norm(p-q) #射影と元のベクトルとの差の長さ if(r > 0.0001): #誤差で厳密に0にはならないため, 0.0001以上なら射影と元のベクトルが異なると判断. print(i,p) B = np.concatenate([B, np.array([p])],axis=0) #Bを拡大. G = B@B.T G_inv = np.linalg.inv(G)
出力
[[ 0 0 0 0 0 0 2 -2] [ 0 0 0 0 0 0 2 2]] 2 [ 0 0 0 0 0 2 -2 0] 6 [ 0 0 0 0 2 -2 0 0] 12 [ 0 0 0 2 -2 0 0 0] 20 [ 0 0 2 -2 0 0 0 0] 30 [ 0 2 -2 0 0 0 0 0] 42 [ 1 -1 -1 -1 -1 -1 -1 1]
ちょっとごまかしたのはこの方法で本当に格子の -基底が得られるのかどうかだが, 単純ルートを得る場合には保証されている. ちゃんと確かめるには上で使った成分 が整数であることを見ればよい(射影で表せない余分 が出たときだけ にする).
転置をとって以下の行列の縦ベクトルを左からとるとここで得た基底になる.
\begin{align}
\left(\begin{array}{rrrrrrrr}
0&0&0&0&0&0&0&1\\
0&0&0&0&0&0&2&-1\\
0&0&0&0&0&2&-2&-1\\
0&0&0&0&2&-2&0&-1\\
0&0&0&2&-2&0&0&-1\\
0&0&2&-2&0&0&0&-1\\
2&2&-2&0&0&0&0&-1\\
-2&2&0&0&0&0&0&1\\
\end{array}\right)
\end{align}
のグラム行列は,
print(G)
[[ 8 0 -4 0 0 0 0 -4] [ 0 8 -4 0 0 0 0 0] [-4 -4 8 -4 0 0 0 0] [ 0 0 -4 8 -4 0 0 0] [ 0 0 0 -4 8 -4 0 0] [ 0 0 0 0 -4 8 -4 0] [ 0 0 0 0 0 -4 8 0] [-4 0 0 0 0 0 0 8]]
4で割るとのグラム行列になる.
G=G//4 print(G)
[[ 2 0 -1 0 0 0 0 -1] [ 0 2 -1 0 0 0 0 0] [-1 -1 2 -1 0 0 0 0] [ 0 0 -1 2 -1 0 0 0] [ 0 0 0 -1 2 -1 0 0] [ 0 0 0 0 -1 2 -1 0] [ 0 0 0 0 0 -1 2 0] [-1 0 0 0 0 0 0 2]]
\begin{align}
G = \left(\begin{array}{rrrrrrrr}
2&0&-1&0&0&0&0&-1\\
0&2&-1&0&0&0&0&0\\
-1&-1&2&-1&0&0&0&0\\
0&0&-1&2&-1&0&0&0\\
0&0&0&-1&2&-1&0&0\\
0&0&0&0&-1&2&-1&0\\
0&0&0&0&0&-1&2&0\\
-1&0&0&0&0&0&0&2\\
\end{array}\right)
\end{align}
これはのカルタン行列に一致する(単純ルートをノルム2にとったため).
さて, グラム行列を使えばが偶格子であることは一目瞭然である. というのも, 成分の点について,
\begin{align}
{\bf x}^TG{\bf x} = 2(x_1^2&+x_2^x+x_3^2+x_4^2+x_5^2+x_6^2+x_7^2+x_8^2\\
&-x_1x_3-x_1x_8-x_2x_3-x_3x_4-x_4x_5-x_5x_6-x_6x_7)
\end{align}
となるため. また, を計算すると,
np.linalg.det(G)
1.0
から, ユニモジュラー性も分かる. これでが偶ユニモジュラー格子であることが確認できた.
E8-格子のテータ関数
偶ユニモジュラー性と保型性
-格子のテータ関数を調べよう.
偶ユニモジュラー性は非常に便利に使える. のテータ関数 について,
が分かる. これは,がウェイト4のモジュラー形式であるということに他ならない. 一般に, 次元の偶ユニモジュラー格子のテータ関数はウェイト のモジュラー形式である.
ここでモジュラー形式に関する次の性質を使う [Koblitz, 志賀].
ウェイト4のモジュラー形式は定数倍の違いを除いてひとつしかない.
とくに, 定数項が1であることから, 正規化されたアイゼンシュタイン級数 (normalized Eisenstein series)に一致する. すなわち,
ここで, 正規化されたアイゼンシュタイン級数は, 4以上の偶数に対して,
ただし, はゼータ関数. はベルヌーイ数. からの場合の表式が得られる.
...と, 偶ユニモジュラー性とモジュラー形式に関する性質からテータ関数が決まってしまったが, もうすこし「母関数らしい」方法でテータ関数は決められる.
テータ定数の3つ組
まず「テータ定数」*3を以下のように定義する.
最左列の表記は文献 [梅村]に準拠. 変数にあえて を取っているのもこのため. 第2列は文献 [Conway]のもの.
うまく組み合わせると(は省略),
が分かる. というのは以下の式変形から.
一方, テータ定数は以下の変換性を持つ.
このことから再び,
となることが確認できる. というか, この3つのテータ定数をうまく組み合わせてモジュラー形式をつくるためのもっとも簡単な方法のひとつがこの組合せなのだ. ウェイト4のモジュラー形式であることからアイゼンシュタイン級数と一致し, フーリエ展開を得るところは上でやったことと同様.
長い道のりだったが, これで「格子のノルムの点の個数は, の約数の3乗和の240倍に等しい」ことが分かる. 単にの係数を見ればよい.
まとめと展望
-格子 が偶ユニモジュラー格子であることを定義から確かめた. さらに, のテータ関数のモジュラー変換に対する保型性から, これが正規化されたアイゼンシュタイン級数に一致することを示し, ノルムに対する数え上げ公式を得た.
本記事で調べたことは, たぶん格子の理論の初歩の初歩に過ぎない. しかしやはり, 計算機を使って調べ上げると満足感がある.
実はNumpyによる計算は, について調べるより先にリーチ格子に対して行っていたものの流用. 何せ非零で最小ノルム4の点は196560個もあるので, 全順序の定義通りにソートすると数時間かかっても終わらない有様であった. 分かってみれば当たり前であったが, 数に変換してソートするという部分はそのとき思いついた.
次の記事ではリーチ格子について書きたい. 「ルートを持たない24次元偶ユニモジュラー格子」というリーチ格子の特徴付けとなる性質から, そのテータ関数が得られる.
つづき(2019/10/18更新)
shironetsu.hatenadiary.com
リファレンス
書籍
- [Conway] J. H. Conway, N. J. A. Sloane, Sphere Packings, Lattices and Groups, Springer-Verlag, 1999.
- [梅村] 梅村浩, 『楕円関数論―楕円曲線の解析学』, 東京大学出版会, 2000.
- [Koblitz] N. Koblitz, Introduction to Elliptic Curves and Modular Forms, Springer-Verlag, 1993.
オンライン
- [Brower] A.E. Brouwer, "Lattices", 2002. https://www.win.tue.nl/~aeb/latt/lattices.pdf
- [Wiki1] Jacobi's four-square theorem - Wikipedia
- [Wiki2] Sum of squares function - Wikipedia
- [Wiki3] E8 lattice - Wikipedia
- [Wiki4] Unimodular lattice - Wikipedia
- [Wiki5] Eisenstein series - Wikipedia
- Sphere Packing Sphere Packing
- "Out of a Magic Math Function, One Solution to Rule Them All" Quanta Magazine
- tsujimotter.hatenablog.com
- integers.hatenablog.com