Shironetsu Blog

@shironetsuのブログ

E8-格子にふれる

イントロ:E8-格子と約数関数

 以前の記事でE_8 のルート系が2項正20面体群から得られることについて書いた.

shironetsu.hatenadiary.com

 その際, \(E_8\)-格子に含まれる, 「長さの2乗」=「ノルム」*1が \(2m\ (m\in\mathbb{N})\) の点の総数 \(N_{2m}\) が以下の式で与えられるという事実 [Conway]を引用した.

\begin{align}
     N_{2m} = 240\,\sigma_3(m),\ \ \ \sigma_k(m):=\sum_{d|m}d^k.
 \end{align}

 不思議だ. なぜここに数論的な関数が…? なぜ3乗…?などなど.
「\(E_8\)-格子に含まれる, ノルムが\(2m\)の点の総数」が次の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].

2平方和定理
\begin{align}
    x_1^2+x_2^2=m\ \ \ x_1,x_2\in\mathbb{Z},\ m\in\mathbb{N}
\end{align}
の解の個数は,
\begin{align}
    r_2(m) = 4\sum_{2\not\:|d|m} (-1)^{\frac{d-1}{2}}
\end{align}
で与えられる. 和は2を割り切らない\(m\)の約数全体に対してとる.

4平方和定理
\begin{align}
    x_1^2+x_2^2+x_3^2+x_4^2=m\ \ \ x_1,x_2,x_3,x_4\in\mathbb{Z},\ m\in\mathbb{N}
\end{align}
の解の個数は,
\begin{align}
    r_4(m) = 8\sum_{4\not\:|d|m}d
\end{align}
で与えられる. 和は4を割り切らない\(m\)の約数全体に対してとる.

 一見 \(E_8\)-格子の場合より簡単そうな問題に見えるが, 約数全体の和にならないため解の個数の表式はやや複雑になっている.


 なにが \(E_8\)-格子の場合の簡潔さをもたらしているのだろう?


 実はこのことは,「\(E_8\)-格子のテータ関数がモジュラー形式であること」の直接的な帰結となっている.


格子

定義

 格子に関するいくつかの術語の定義からはじめよう. \(\mathbb{R}^n\) における格子 \(\Lambda\) とは, \(\mathbb{R}^n\) の基底 \(\langle a_1,a_2,\cdots,a_n\rangle\) があって, それらの整数係数線形結合の全体である. つまり,

\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}

 \(\langle a_1,a_2,\cdots,a_n\rangle\)の成分を縦ベクトルとして並べたものを\(A\)としよう. \(\Lambda\)の\(\mathbb{Z}\)-基底がもうひとつあって \(\langle b_1,b_2,\cdots,b_n\rangle\) と表され, これを並べたものもまた \(B\) とする. このとき, ある整数係数の \(n\times n\) 正方行列 \(M\) があって \(B=AM\) とあらわされる. 基底同士の変換であるから \(M\) は可逆でなくてはならず, さらに, 逆行列もまた全ての係数が整数でなくてはならない. すなわち, \(M\in GL(n,\mathbb{Z})\). ゆえに, \(|\det(A)|=|\det(B)|\). 「基底の成分を並べた行列」の行列式は, 基底のとりかたによらず一意に決まるということ.

この行列式基本領域 \({\mathbb R}^n/\Lambda\)の体積に一致する.

\begin{align}
{\rm Vol}({\mathbb R}^n/\Lambda) = |{\det(A)}|.
\end{align}

グラム行列

 格子のグラム行列(Gram matrix, Gramian) \(G\)は,

\begin{align}
G=A^TA
\end{align}

で定義される. 明らかに, \(|\det(A)|=\sqrt{\det(G)}\). グラム行列の行列式の値もまた\(\Lambda\)に対して一意に決まることから, 「格子の行列式」を\(\det(\Lambda)=\det(G)\)と決める.

双対格子

 格子があれば, その双対格子(dual lattice)が決まる. \(\Lambda\) の双対格子 \(\Lambda^*\) とは, \(\Lambda\)の全ての元との内積が整数となる\(\mathbb{R}^n\)の元の全体である:

\begin{align}
\Lambda^* = \left\{ x\in\mathbb{R}^n\,\middle|\,(x,r)\in\mathbb{Z},\, \forall r \in \Lambda\right\}.
\end{align}

 ここで\((\cdot,\cdot)\)は\(\mathbb{R}^n\)の標準内積.

 \((a_i^*,a_j)=\delta_{ij}\) となる \(\langle a_1^*,a_2^*,\cdots,a_n^*\rangle\) をとると, \(\Lambda^*\) の基底になる. この成分を縦ベクトルとして並べると \((A^{-1})^T\) に一致する.

整格子・ユニモジュラー格子・偶格子・奇格子

 格子の元同士の内積が全て整数であるとき, 整格子(integral lattice)という. 定義から, 整格子\(\Lambda\)はその双対格子の部分格子になる: \(\Lambda\subseteq\Lambda^*\).

 双対格子が元の格子に一致するとき, その格子は自己双対, また, ユニモジュラー(unimodular)であるという.

 さらに, ノルムが全て偶数のとき, 偶格子(even lattice), そうでないとき奇格子(odd lattice)という.


テータ関数

定義

 格子に対してそのテータ関数が定義できる.

 格子 \(\Lambda\) のテータ関数 \Theta_\Lambda(\tau) は,  q=\exp(\pi \sqrt{-1}\,\tau) を取ったとき,

\begin{align}
    \Theta_\Lambda(\tau) := \sum_{x \in \Lambda} q^{(x,x)}
\end{align}

と定義される. グラム行列を使うと,

\begin{align}
    \Theta_\Lambda(\tau) = \sum_{{\bf x}\in{\mathbb{Z}^n}} q^{{\bf x}^TG{\bf x}}
\end{align}

とも書ける.

 テータ関数は格子 \(\Lambda\) に含まれる, ノルムが \(m\) の元の総数 \(N_m\) の母関数とみなせる.

\begin{gather}
    \Theta_\Lambda(\tau) = \sum_{m\in \mathbb{Z}}N_m\,q^m\\
    N_m := \#\left\{x\in\Lambda \,\middle|\, (x,x)=m\right\}
\end{gather}

グラム行列が正定値なら \(q^0\) の項は零ベクトルに対応して係数1で, その他の項は自然数のみに渡る.

テータ関数の変換性

\tau\mapsto \tau+1 の変換で q\mapsto -q と写ることから,

\begin{align}
    \Theta_\Lambda(\tau+1)  = \Theta_\Lambda(\tau) = \sum_{m\in \mathbb{Z}}N(m)\,(-1)^mq^m\
\end{align}

従って, \(\Lambda\) が偶格子のときに限り, \Theta_\Lambda(\tau+1)=\Theta_\Lambda(\tau) が成り立つ.*2

 双対格子のテータ関数について, 次の事実が知られている [Conway].

双対格子のテータ関数
\begin{align}
    \Theta_{\Lambda^*}(\tau) = \det(\Lambda)^{1/2}\left(\frac{\sqrt{-1}}{\tau}\right)^{n/2}\Theta_\Lambda\left(\frac{-1}{\tau}\right)
\end{align}

 このテータ関数を用いて, 次のことが示されている.

偶ユニモジュラー格子の存在条件
 \(n\)次元空間に偶ユニモジュラー格子が存在するための必要十分条件は,
\begin{align}
  n\equiv 0 \mod 8\end{align}
となることである.


 そして, 偶ユニモジュラー格子の存在が許される最小次元 8 における唯一の偶ユニモジュラー格子こそが, \(E_8\)-格子なのである.


E8-格子

 \(E_8\)-格子を定義しよう. \(E_8\)-格子\(\Lambda_8\)として, \(\mathbb{R}^8\) の部分集合で次の成分を持つものの全体をとることができる.

\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成分すべてが整数であるか半奇数であって, その和が偶数であるような点の全体」と言える.

 自分はリー代数とルート系との関係から\(E_8\)を知ったので, こんな風に簡潔な見た目をしているのを見るのはなんだか奇妙な気分になる. 以前に「六芒星から7次元クロス積と8次元の積が出てくる」ことについて書いた(過去記事参照).

shironetsu.hatenadiary.com

 あえて格子の言葉で表現するなら, 「六角格子と八元数の自己同型群である\(G_2\)がルート系を通して結びつく」ということであった. \(E_8\)の場合にも, こんなきれいな見た目をした格子の中からノルム2の元240個を取って対応するリー代数を作ると, 「248次元の随伴表現が最小の忠実な既約表現となるリー代数」という化け物じみたものが出てくるというのはやはり不思議である.

 閑話休題.

 上のように表記したとき, \(\Lambda_8\) が格子であることは簡単に分かる. ふたつの元を取ってその差がまた \(\Lambda_8\) に含まれることをいえばよい.

 偶格子であること・ユニモジュラー格子であることを示すために, 基底を取ろう. 単純ルートをとると都合がよい.

 まず, ノルム2の元(明らかにノルム2未満の点は0を除いて存在しない)は次の形をしたものですべてであることが分かる.

  • \((\pm 1,\pm 1,0,0,0,0,0,0)\)とその成分を入れ替えた点. 複号はすべての場合をとる.

  \(4\cdot\binom{8}{2}=112\) 個ある.

  • \(\frac{1}{2}(\pm 1,\pm 1,\pm 1,\pm 1,\pm 1,\pm 1,\pm 1,\pm 1)\)の形をした点. 複号は, 偶数個だけ\(+\)を取る.

  \(\binom{8}{0}+\binom{8}{2}+\binom{8}{4}+\binom{8}{6}+\binom{8}{8}=2^7=128\) 個ある.

 あわせて\(112+128=240\)個. これらを列挙して, \(\mathbb{R}^n\)に導入された次の全順序でソートする.

定義 : \(\mathbb{R}^n\) の全順序\(u,v\in\mathbb{R}^n\)に対して, \(u-v\) の成分を左から数えたときに,最初の零でない成分が正なら \(u\) >\(v\), 負なら \(u\)< \(v\), 全ての成分が0なら \(u=v\).

 Numpyを使う.

import numpy as np

 分数は少しやりづらいので, 2倍して \(2\Lambda_8\) のノルム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. まず最小のベクトル\(P_0\)をとり, 部分格子の基底 \(B\)に加える.
  2. 次のベクトル \(P_1\) は明らかに\(P_0\)の定数倍ではないため \(B\) に加える.
  3. 次のベクトル \(P_2\) が \(B\) で張られないなら\(B\)に加える. 張られるなら加えずに次へ.
  4. 以下同様.

\(p\) が B=\langle b_0,b_1,\cdots, b_{k-1}\rangle によって張られるか張られないかは以下のように判定する.

\begin{align}
 p  = q_0b_0 + q_1b_1 + \cdots + q_{k-1}b_{k-1} +r
\end{align}

と表されるとする. \(r\)は\(B\)の張る空間の直交補空間の元.

\begin{align}
(b_0,p) &= (b_0,b_0)q_0 + (b_0,b_1)q_1 + \cdots (b_0,b_{k-1})q_{k-1}\\
 (b_1,p) &= (b_1,b_0)q_0 + (b_1,b_1)q_1 + \cdots (b_1,b_{k-1})q_{k-1}\\
 &\vdots\\
(b_{k-1,p}) &= (b_{k-1},b_0)q_0 + (b_0,b_1)q_1 + \cdots (b_{k-1},b_{k-1})q_{k-1}\\
\end{align}

q_0,q_1,\cdots,q_{k-1} の連立1次方程式と見て解くと q_0,q_1,\cdots,q_{k-1} が得られる. すると \(B\)の張る空間への射影 \(r\) が計算できて, これが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]

 ちょっとごまかしたのはこの方法で本当に格子の \(\mathbb{Z}\)-基底が得られるのかどうかだが, 単純ルートを得る場合には保証されている. ちゃんと確かめるには上で使った成分 \(q\) が整数であることを見ればよい(射影で表せない余分 \(r\)が出たときだけ \((0,\cdots,0,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}

\(2\Lambda_8\)のグラム行列は,

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で割ると\(\Lambda_8\)のグラム行列になる.

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}

 これは\(E_8\)のカルタン行列に一致する(単純ルートをノルム2にとったため).

 さて, グラム行列を使えば\(\Lambda_8\)が偶格子であることは一目瞭然である. というのも, 成分\(\bf x\in{\mathbb Z}^8\)の点について,

\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}

となるため. また, \(\det(G)\)を計算すると,

np.linalg.det(G)
1.0

から, ユニモジュラー性も分かる. これで\(\Lambda_8\)が偶ユニモジュラー格子であることが確認できた.

\(E_8\)-格子 \(\Lambda_8\) は偶ユニモジュラー格子である.


E8-格子のテータ関数

偶ユニモジュラー性と保型性

 \(E_8\)-格子のテータ関数を調べよう.

 偶ユニモジュラー性は非常に便利に使える. \(\Lambda_8\)のテータ関数 \Theta_{\Lambda_8}(\tau) について,

\begin{align}
    \Theta_{\Lambda_8}(\tau+1) &= \Theta_{\Lambda_8}(\tau),\\
    \Theta_{\Lambda_8}\left(\frac{-1}{\tau}\right)
    &=\tau^4 \Theta_{\Lambda_8}(\tau)
\end{align}

が分かる. これは,\Theta_{\Lambda_8}(\tau)ウェイト4のモジュラー形式であるということに他ならない. 一般に, \(8k\)次元の偶ユニモジュラー格子のテータ関数はウェイト \(4k\) のモジュラー形式である.

 ここでモジュラー形式に関する次の性質を使う [Koblitz, 志賀].

 ウェイト4のモジュラー形式は定数倍の違いを除いてひとつしかない.

 とくに, 定数項が1であることから, 正規化されたアイゼンシュタイン級数 (normalized Eisenstein series)に一致する. すなわち,

\begin{align}
    \Theta_{\Lambda_8}(\tau) = E_4(\tau) = 1+240\sum_{k=1}^\infty \sigma_3(k)\,q^{2k}.
\end{align}

 ここで, 正規化されたアイゼンシュタイン級数は, 4以上の偶数\(k\)に対して,

\begin{align}
    E_k(\tau) &:= \frac{1}{2}\sum_{m,n\in{\mathbb Z},\,(m,n)=1} \frac{1}{(m+n\tau)^k}\\
                 &=\frac{1}{2\zeta(k)}\sum_{m,n\in\mathbb{Z}} \frac{1}{(m+n\tau)^k}\\
                 &=1-\frac{2k}{B_k}\sum_{n=1}^\infty \sigma_{k-1}(n)\,q^{2k}.\ \ \ q=\exp(\pi\sqrt{-1}\,\tau).
\end{align}

 ただし, \zeta(n)ゼータ関数. B_n はベルヌーイ数. \(B_4=-1/30\)から\(k=4\)の場合の表式が得られる.

...と, 偶ユニモジュラー性とモジュラー形式に関する性質からテータ関数が決まってしまったが, もうすこし「母関数らしい」方法でテータ関数は決められる.

テータ定数の3つ組

 まず「テータ定数*3を以下のように定義する.

\begin{align}
    \theta_{00}(\tau) &= \theta_3(\tau) = \sum_{n\in\mathbb{Z}} q^{n^2},\\
    \theta_{01}(\tau) &= \theta_4(\tau) = \sum_{n\in\mathbb{Z}} (-1)^nq^{n^2},\\
    \theta_{10}(\tau) &= \theta_2(\tau) = \sum_{n\in\mathbb{Z}} q^{(n+1/2)^2}.
\end{align}

 最左列の表記は文献 [梅村]に準拠. 変数にあえて \tau を取っているのもこのため. 第2列は文献 [Conway]のもの.

 うまく組み合わせると(\tauは省略),

\begin{align}
    \Theta_{\Lambda_8}(\tau)
    = \frac{1}{2}(\theta_{00}^8 + \theta_{01}^8 + \theta_{10}^8)
\end{align}

が分かる. というのは以下の式変形から.

\begin{align}
    \Theta_{\Lambda_8}(\tau)
    &=\sum_{n_1,\cdots, n_8\in\mathbb{Z},\, \sum n_i \in 2\mathbb{Z}} q^{n_1^2+\cdots+n_8^2}
     +\sum_{n_1,\cdots, n_8\in\mathbb{Z},\, \sum (n_i+1/2) \in 2\mathbb{Z}} q^{(n_1+1/2)^2+\cdots+(n_8+1/2)^2}\\
    &=\sum_{n_1,\cdots,n_8\in\mathbb{Z}} \frac{1+(-1)^{n_1+\cdots+n_8}}{2}q^{n_1^2+\cdots+n_8^2}
      +\sum_{n_1,\cdots, n_8\in\mathbb{Z}} 
      \frac{1+(-1)^{n_1+\cdots+n_8}}{2} q^{(n_1+1/2)^2+\cdots+(n_8+1/2)^2}\\
     &=\frac{1}{2}\left(\sum_{n\in\mathbb{Z}}q^{n^2}\right)^8
       +\frac{1}{2}\left(\sum_{n\in\mathbb{Z}}(-1)^nq^{n^2}\right)^8
       +\frac{1}{2}\left(\sum_{n\in\mathbb{Z}}q^{(n+1/2)^2}\right)^8
       +\frac{1}{2}\left(\sum_{n\in\mathbb{Z}}(-1)^n q^{(n+1/2)^2}\right)^8\\
     &=\frac{1}{2}\theta_{00}^8 + \frac{1}{2}\theta_{01}^8 + \frac{1}{2}\theta_{10}^8 + \frac{1}{2}\cdot 0.
\end{align}

 一方, テータ定数は以下の変換性を持つ.

\tau\mapsto -1/\tau による変換性
\begin{align}
    \theta_{00}\left(\frac{-1}{\tau}\right)
    &=\varepsilon\tau^{1/2}\theta_{00}(\tau),\\
    \theta_{01}\left(\frac{-1}{\tau}\right)
    &=\varepsilon\tau^{1/2}\theta_{10}(\tau),\\
    \theta_{10}\left(\frac{-1}{\tau}\right)
    &=\varepsilon\tau^{1/2}\theta_{01}(\tau).
\end{align}

ただし,\(\varepsilon := e^{\sqrt{-1}\pi/4}\)は1の8乗根で,\tau^{1/2}は虚部が正となるようにとる.

\tau\mapsto \tau+1 による変換性
\begin{align}
    \theta_{00}(\tau+1)&=\theta_{01}(z,\tau),\\
    \theta_{01}(\tau+1)&=\theta_{00}(z,\tau),\\
    \theta_{10}(\tau+1)&=\varepsilon \theta_{10}(z,\tau).
\end{align}

 このことから再び,

\begin{align}
    \Theta_{\Lambda_8}(\tau+1) &= \Theta_{\Lambda_8}(\tau),\\
    \Theta_{\Lambda_8}\left(\frac{-1}{\tau}\right)
    &=\tau^4 \Theta_{\Lambda_8}(\tau)
\end{align}

となることが確認できる. というか, この3つのテータ定数をうまく組み合わせてモジュラー形式をつくるためのもっとも簡単な方法のひとつがこの組合せなのだ. ウェイト4のモジュラー形式であることからアイゼンシュタイン級数と一致し, フーリエ展開を得るところは上でやったことと同様.

 長い道のりだったが, これで「\(E_8\)格子のノルム\(2m\)の点の個数\(N_{2m}\)は, \(m\)の約数の3乗和の240倍に等しい」ことが分かる. 単に\(q^{2m}\)の係数を見ればよい.

\begin{align}
    N_{2m} = 240\,\sigma_3(m).
\end{align}


まとめと展望

 \(E_8\)-格子 \(\Lambda_8\) が偶ユニモジュラー格子であることを定義から確かめた. さらに, \(\Lambda_8\) のテータ関数のモジュラー変換に対する保型性から, これが正規化されたアイゼンシュタイン級数に一致することを示し, ノルムに対する数え上げ公式を得た.

 本記事で調べたことは, たぶん格子の理論の初歩の初歩に過ぎない. しかしやはり, 計算機を使って調べ上げると満足感がある.

 実はNumpyによる計算は, \(\Lambda_8\) について調べるより先にリーチ格子に対して行っていたものの流用. 何せ非零で最小ノルム4の点は196560個もあるので, 全順序の定義通りにソートすると数時間かかっても終わらない有様であった. 分かってみれば当たり前であったが, 数に変換してソートするという部分はそのとき思いついた.

 次の記事ではリーチ格子について書きたい. 「ルートを持たない24次元偶ユニモジュラー格子」というリーチ格子の特徴付けとなる性質から, そのテータ関数が得られる.

 つづき(2019/10/18更新)
shironetsu.hatenadiary.com

リファレンス

書籍

 (N. コブリッツ, 上田勝, 浜畑芳紀訳, 『楕円曲線と保型形式』, 丸善出版, 2016.)

*1:以下「ノルム」はこの意味でしか用いない. つまり, 平方根をとることを考えない.

*2:格子が偶であることがそのまま偶数次数の項しかないことと同値になるこの\(q\)の定義が一番良さそうに思われるが,  q=\exp(\pi\sqrt{-1} \tau) の代わりに q=\exp(2\pi\sqrt{-1} \tau) を使うほうが普通らしい. なんで.

*3:\tauの関数なのに「定数」と呼ぶのは, 「テータ関数」(「格子に対するテータ関数」とはまた違う意味)の2変数のうち, 片方を0にとった値であるため. またの名を「テータ零値」Thetanullwert (独)という.