はじめに
超立方体は単なる2進数だった。この話は以下の記事で行っているので、この知識を前提に超立方体を展開していく。
準備
まずは準備
import random
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
def extension(dim):
""" 次元を拡張する関数
:param dim: 拡張する次元の配列
:returns: 拡張された配列
"""
return np.concatenate([np.array(dim) - 1, np.array(dim) + 1]).tolist()
dot = [[0], [0], [0], [0]]
直線
そしてこれが点から直線(1次元)への拡張だった。直線の数はわかりやすく 0 -> 1 の変化の数である(1 -> 0 も直線だが重複を許すことになるので、この変化は無視する)。当然のことで、以下の直線は1つである。
line = [extension(dot[0]), dot[1]*2, dot[2]*2, dot[3]*2]
for x, y, i in zip(line[0], line[1], range(len(line[0]))):
plt.scatter([x], [y], marker="o", linestyle='None', label=str(i)+' : '+format(i, '0'+str(1)+'b'))
plt.legend()
plt.show()
正方形
そしてこれが正方形(2次元)への拡張だった。
square = [line[0]*2, extension(line[1]), line[2]*2, line[3]*2]
for x, y, i in zip(square[0], square[1], range(len(square[0]))):
plt.scatter([x], [y], marker="o", linestyle='None', label=str(i)+' : '+format(i, '0'+str()+'b'))
plt.legend()
plt.show()
ここから直線は何個取れるだろう。取り方は、1つの次元を固定して、残りの次元で 0 -> 1 の変化になっている個数を数えればよい。つまりは1次元目を 0(赤枠) or 1(青枠) に固定して得られる 2個 と
2次元目を 0(赤枠) or 1(青枠) に固定して得られる 2個 である。(赤枠、青枠はラベル内の枠の事…伝わりにくかったらごめんなさい)
そして平面は 00 -> 01 -> 10 -> 11 の変化である。
立方体
そしてこれが立方体への拡張だった。
cube = [square[0]*2, square[1]*2, extension(square[2]), square[3]*2]
fig = plt.figure()
fig = plt.figure(figsize=(10.0, 8.0))
Axes3D(fig)
for x, y, z, i in zip(cube[0], cube[1], cube[2], range(len(cube[0]))):
plt.plot([x], [y], [z], marker="o", linestyle='None', label=str(i)+' : '+format(i, '0'+str(3)+'b'))
plt.legend()
plt.show()
ここから平面は何個取れるだろう。取り方は、1つの次元を固定して、残りの次元で 00 -> 01 -> 10 -> 11 の変化になっている個数を数えればよい。先ほどと同じように色分けしてもよいが、実は1次元目を 0 or 1 に固定して得られるのは2個であり、2次元目を固定しても2個、3次元目を固定しても2個である。つまり、平面が6個取れる。さらに言ってしまえば、何次元に拡張しても同じように取ることができ、つまりは N次元の超立方体 は N-1次元の超立方体 2N個 で構成されている。つまり、立方体から正八胞体に拡張すると、正八胞体は4次元の超立方体なので3次元の超立方体である立方体 2×4 = 8 個 で構成される。 可視化してもよいが、サイコロを展開しても分かるように、展開方法によって形状はまちまちになるためやめておこう(実際に展開した図はいっぱい転がってるしね)。
まとめ
これでよくある正八胞体を展開すると8個の立方体になるというのが納得できるかと思う。まぁそんなに難しくないってことですね。