sw1227’s diary

Visualization, GIS, Machine Learning, Generative Art, Simulation, Math

Calabi-Yau多様体をブラウザ上に可視化する(Three.js)

1. Calabi-Yau多様体とは

砂浜でカップルが追いかけっこをしてイチャついている描写をたまに見かけます。一方、蝶々のオスとメスは平面にとどまらず、 z軸も駆使して3次元的にイチャついています。これが限界である、すなわち空間は3次元である、という風に我々は認識しています。

ところが、「大栗先生超弦理論入門 (ブルーバックス)」という本によると、超弦理論においては空間の次元は9次元(時間も含めると時空間は10次元)に定まるというのです。そうすると当然、残りの6次元の空間はどうなったのかという疑問が生じます。実際、大栗先生の本にも以下のような記述があり、物理学においても重要な問題であったことが分かります。

超弦理論では空間の次元が九次元と一意的に決まりました。しかし素粒子標準模型は三次元の理論なので、超弦理論からそれを導出するには、六つの余剰次元をなんとかしなければならないという問題がありました。

大栗先生の超弦理論入門 (ブルーバックス)

プリンストン大学エドワード・ウィッテンらは、この9次元の空間を6次元のカラビ-ヤウ空間*1によって3次元にコンパクト化するというアイデアを提示しました。綱渡りをするピエロにとって一次元に見える綱も実は二次元的な表面を持っているように、我々が認識できない6次元空間も数学的に「存在する」というのです。

この記事では、そのようなCalabi-Yau多様体をブラウザ上でインタラクティブに操作できるような形式で可視化し、手法と結果を紹介したいと思います。

大栗先生の超弦理論入門 (ブルーバックス)

大栗先生の超弦理論入門 (ブルーバックス)

f:id:sw1227:20181117132205p:plain:w400

2. 可視化の方法

基本的には以下の記事(英語)を参考にしていますが、これだけだと実装まで進むには不十分なので、適宜補いつつ解説します。 Visualizing Calabi-Yau Manifolds

2.1. 方針

Calabi-Yau多様体を3Dで可視化するためには、以下の条件を満たす複素数 z_1, z_2の集合を3次元空間に投影すればいいようです。ただし、 n は任意の整数(これを変えていくと可視化結果も当然変わる)とします。

(私はCalabi-Yau多様体の数学的な詳細を理解しているわけではなく、「そもそもなぜこの数式なのか」という点に関してはまだよく分かりません。この数式を所与のものとして可視化を実装した記事であるという点をご留意ください。)

{ \displaystyle
z_1^{n} + z_2^{n}= 1 \;\;\;\;\; - (*)
}

 z_1, z_2 のそれぞれに実部と虚部があるため4次元空間上の領域を可視化することになりますが、投影(後述)によって3次元空間上の曲面とし、WebGLを使って可視化します。

2.2. 媒介変数表示

(*)を満たす z_1, z_2 は媒介変数 x, y を用いて以下のように表現することが可能です。

{\displaystyle 
\begin{eqnarray}
  \left\{
    \begin{array}{l}
     z_1 = e^{i \phi_1} \left[ cos(x+iy) \right]^{2/n} \\
     z_2 = e^{i \phi_2} \left[ sin(x+iy) \right]^{2/n}
    \end{array}
  \right.
\end{eqnarray}
}

媒介変数 x, y は以下の範囲を動かせば良いようです。 (あまり自信はありませんが、この範囲にすれば正しく描画されました。)

{\displaystyle
0 \leq  x  \lt \pi /2, \;\;\;-\pi/2 \leq y \lt \pi/2
}

 \phi_1, \phi_2 は以下のように表されます。

{\displaystyle 
\begin{eqnarray}
  \left\{
    \begin{array}{l}
      \phi_1 = \frac{2 \pi k_1}{n} \;\;\;(k_1 = 0, 1, ..., n-1) \\
      \phi_2 = \frac{2 \pi k_2}{n} \;\;\;(k_2 = 0, 1, ..., n-1)
    \end{array}
  \right.
\end{eqnarray}
}

 k_1, k_2 はそれぞれについて0から n-1 までの整数値を取るので、 n \times n = n^{2} パターンにそれぞれに対して x, y を動かして描画を行うことになります。

 z_1, z_2を元の式(*)に代入すると、コサインとサインの二乗和が1になるような形となり、等号が成立することが分かるはずです。

2.3. 3次元への射影

ここまでの流れを簡潔にまとめると、「Calabi-Yau多様体の可視化は式(*)を満たす z_1, z_2 の組を描画することであり、 z_1, z_2 は媒介変数 x, y と整数 k_1, k_2 を動かしていくことによって得ることができる」ということでした。

しかしながら、こうして得られた z_1, z_2 の組は実部と虚部を考えれば Re (z_1), Im (z_1), Re (z_2), Im (z_2) の4次元に広がっており、このままでは描画できません。 そこで、単純に Im (z_1), Im (z_2) たちの次元を一つ削減し、

{\displaystyle
(Re (z_1), \;Re (z_2),\; Im (z_1) cos (a) + Im (z_2) sin (a) )
}

という3次元空間上の点に投影します。 ここで a は射影の仕方に対応するパラメータで、三角関数の周期性から 0 \leq a \lt 2 \pi として一般性を失いません。このパラメータを変えると見え方は変わりますが、Calabi-Yau多様体自体が変形しているのではないことに注意しましょう。

このような投影により、式(*)を満たす複素数 z_1, z_2の集合を、3次元空間上の曲面として可視化することが可能になります。

3. 実装

3.1. 方針

0から n-1 までの整数値を取る k_1, k_2 それぞれ( n \times n = n^{2} パターン)に対して、媒介変数 x, y を動かして曲面の描画を行うことになります。

媒介変数 x, y によって定義される曲面を描画する方法

まずは x, y をそれぞれが取りうる値の範囲

{\displaystyle
0 \leq  x  \lt \pi /2, \;\;\;-\pi/2 \leq y \lt \pi/2
}

の中で細かく分割します。分割幅を dx, dyと表すことにすると、下限値である x = 0, \; y= - \pi / 2から始めて x, y dx, dy ずつ増加させる二重ループを回し、4点

{\displaystyle
(x,\;  y), \; (x+dx, \; y), \;  (x+dx, \;  y+dy), \;  (x, \; y+dy)
}

を頂点とする長方形*2を順次描画して行けば曲面が描画できます。

具体的な描画方法

以下のような手順を実行することになります。

  •  k_1, k_2 それぞれに対してループを回す
  • その中で、さらに x, y dx, dy ずつ増加させるループを回す
  • 多重ループのなかで、 (x,\;  y), \; (x+dx, \; y), \;  (x+dx, \;  y+dy), \;  (x, \; y+dy) の4点を頂点とする長方形を描画

これを実行するために、以下の2種類の関数を実装します。

  •  k_1, k_2, x, y に対して定まる z_1, z_2を3次元に投影した (x, y, z)を計算する関数
  • 4つの頂点座標から長方形を描画する関数

3.2. JavaScriptによる実装

完全な実装はユーティリティ関数と共にGitHubに公開しています。

ここでは本質的な処理のみ切り取って掲載します。JavaScriptを使用してブラウザ上で動かせるようにしており、複素数の計算にはmath.jsを、3次元の描画にはTHREE.jsを利用しています。

World.prototype.addCalabiYau = function(n, a) {
    function coordinate(x, y, n, k1, k2, a) {
        const z1 = math.multiply(
            math.exp(math.complex(0, 2*math.PI*k1/n)),
            math.pow(math.cos(math.complex(x, y)), 2/n)
        );
        const z2 = math.multiply(
            math.exp(math.complex(0, 2*math.PI*k2/n)),
            math.pow(math.sin(math.complex(x, y)), 2/n)
        );
        return new THREE.Vector3(z1.re, z2.re, z1.im*math.cos(a) + z2.im*math.sin(a));
    }

    const dx = math.PI/10;
    const dy = math.PI/10;
    d3.cross(d3.range(n), d3.range(n)).forEach(k => {
        d3.range(0, math.PI/2, dx).forEach(x => {
            d3.range(-math.PI/2, math.PI/2, dy).forEach(y => {
                const data = [
                    {"x": x,    "y": y   },
                    {"x": x+dx, "y": y   },
                    {"x": x+dx, "y": y+dy},
                    {"x": x,    "y": y+dy},
                ];
                this.addNormalRect(
                    ...data.map(d => coordinate(d.x, d.y, n, k[0], k[1], a))
                );
            });
        });
    })
};

4. ギャラリー

実装した三次元Visualizationは以下のリンクで動かすことができます。ドロップダウンから「EXPONENT」「PROJECTION」の値を変えることで、数式中  n, a の値を変えることが可能です。

Visualizations

実際に動かしてみた方が規則性はよく分かるとは思いますが、様々な n に対する可視化結果をスクリーンショットで紹介します。

n=2

n=2
n=2

n=3

n=3
n=3

n=4

n=4
n=4

n=5

n=5
n=5

n=6

n=6
n=6

n=7

n=7
n=7

n=8

n=8
n=8

5. まとめ・今後の展望

Calabi-Yau多様体の紹介から始め、四次元のCalabi-Yau多様体を媒介変数表示に基づいてJavaScript(+ Three.js)で可視化してみました。 今回は面の向きに応じて色分けしてありますが、他にも様々な塗り分けが考えられるため、時間があれば試してみたいと考えています。

冒頭で紹介した大栗先生の本は、素人でも非常に惹きつけられる楽しい本です。 また、読んではいませんが、この記事と(おそらく)同様の可視化が表紙になっているブルーバックスの書籍も以下に紹介しておきます。

大栗先生の超弦理論入門 (ブルーバックス)

大栗先生の超弦理論入門 (ブルーバックス)

以上

*1:栗先生の本ではこの表現が採用されています

*2:点同士が重なって三角形になる可能性もある