ルービックキューブ群論の核心:位数の導出とパリティ制約
ルービックキューブの全状態数――すなわちルービックキューブ群の位数――は約 4325 京()である。この巨大な数がどこから来るのか、3 つのパリティ制約とともに厳密に導出するのが本記事の目的だ。
制約なしの場合の数え上げ
前回の記事で、ルービックキューブの状態は 4 つ組 で記述されることを見た。もし何の制約もなければ、各成分の取りうる値の数は次の通りだ。
| 通り | |
| 通り | |
| 通り | |
| 通り |
制約なしの全組み合わせは
約 である。しかし、物理的に実現可能な状態はこのすべてではない。ルービックキューブを分解せずに到達できる状態には、3 つの独立な制約が課される。
第 1 の制約:コーナーツイストの保存
8 個のコーナーの向き について、
が常に成り立つ。
証明 各基本操作がこの制約を保存することを確認すればよい。U と D はコーナーの向きを一切変えないので、ツイスト総和は不変だ。R について確認しよう。R のツイスト変化は位置 1 に 、位置 4 に 、位置 8 に 、位置 5 に だった。変化量の総和は
である。L, F, B についても同様に計算すると、いずれもツイスト変化量の総和は となる。
| 操作 | ツイスト変化量 | 総和 |
|---|---|---|
| U | ||
| D | ||
| R | ||
| L | ||
| F | ||
| B |
完成状態ではツイスト総和は 0 であり、各操作で変化量の総和が なので、どんな操作列を施しても が保たれる。
この制約により、8 個のコーナーのうち 7 個の向きを自由に選べば、残り 1 個の向きは自動的に決まる。したがって、コーナーの向きの自由度は から に減る。
第 2 の制約:エッジフリップの保存
12 個のエッジの向き について、
が常に成り立つ。
証明 良い操作 はエッジの向きを一切変えないため、フリップ総和は不変だ。悪い操作 F について確認する。F のフリップ変化は位置 1, 5, 9, 6 にそれぞれ であり、変化量の総和は
B も同様に 4 つのエッジを同時にフリップするから、総和の変化は だ。
。1 個のコーナーだけを回転させることは不可能
。1 個のエッジだけを反転させることは不可能
この制約により、エッジの向きの自由度は から に減る。
第 3 の制約:置換パリティの連動
コーナー置換 の符号(偶奇)とエッジ置換 の符号は常に一致する。すなわち、
が成り立つ。
証明 各基本操作は、コーナーとエッジの両方で 4-cycle を引き起こす。4-cycle は 3 個の互換の積として書けるから奇置換である。したがって、任意の基本操作はコーナーとエッジの両方で符号を にする。
完成状態では であり、ともに偶置換だ。1 回の基本操作で両方の符号が同時に反転するから、何回操作を施しても が維持される。
この制約が意味するのは、コーナーだけを奇置換にしてエッジを偶置換のままにする(またはその逆)ことは不可能だということだ。たとえば、2 つのコーナーの位置だけを入れ替えて他をすべて元に戻すことはできない。
この制約は実践的にも重要で、ルービックキューブを一度分解してランダムに組み直すと、12 分の 1 の確率でしか解ける状態にならない。
3 つの制約がそれぞれ 、、 の確率を課し、 となる。
位数の導出
3 つの制約はそれぞれ独立に自由度を制限する。制約なしの場合から各制約の因子を割ると、
これを計算する。
したがって、
と書いてもよい。ここで がツイスト制約、 がフリップ制約とパリティ制約に対応する。数値を計算すると、
段階的に計算を進める。
# Python で正確に計算
import math
corners_perm = math.factorial(8) # 40320
edges_perm = math.factorial(12) # 479001600
corner_orient = 3**7 # 2187
edge_orient = 2**10 # 1024
order = corners_perm * edges_perm * corner_orient * edge_orient
print(f"|G| = {order:,}")
# |G| = 43,252,003,274,489,856,000
よって、ルービックキューブ群の位数は
日本語では約 4325 京 2003 兆 2744 億 8985 万 6000 だ。
位数の素因数分解
この巨大な数の構造をさらに理解するために、素因数分解を行おう。
# 素因数分解の確認
from sympy import factorint
order = 43252003274489856000
factors = factorint(order)
print(factors)
# {2: 27, 3: 14, 5: 3, 7: 2, 11: 1}
# 検算
result = 2**27 * 3**14 * 5**3 * 7**2 * 11
print(f"検算: {result == order}") # True
この素因数分解の各成分がどこから来るかを追跡できる。
の素因数分解:
の素因数分解:
の寄与:
の寄与:
合計すると となり、一致する。
制約の独立性の証明
3 つの制約が本当に独立であること、すなわち他の 2 つから第 3 の制約が導かれないことを示す。
ツイスト制約の独立性:1 個のコーナーだけを 120° 回転させた状態(ツイスト総和 )を考える。この状態はフリップ制約もパリティ制約も満たすが、ツイスト制約だけを破る。よってツイスト制約は他の 2 つから導かれない。
フリップ制約の独立性:1 個のエッジだけを反転させた状態(フリップ総和 )を考える。ツイスト制約とパリティ制約は満たすが、フリップ制約だけを破る。
パリティ制約の独立性:2 つのコーナーだけを入れ替えた状態を考える。コーナー置換は奇だがエッジ置換は偶であり、パリティ制約だけを破る。ツイスト制約とフリップ制約は満たされている。
以上により、3 つの制約は互いに独立であり、それぞれが全状態数を 、、 に削減する。
群構造の分解
位数の導出過程から、ルービックキューブ群 の構造が見えてくる。 は次のような半直積として記述できる。
ここで はパリティ制約を反映した制限付き直積を意味する。より正確には、
の部分群として実現される。 は wreath product(花冠積)であり、 と定義される。ここで は の成分を置換する作用を持つ。
:8 個のコーナーの位置置換 が、7 個の独立なツイスト の成分を並べ替える。ツイスト制約により自由度が 1 つ減っている。
:12 個のエッジの位置置換 が、11 個の独立なフリップ の成分を並べ替える。フリップ制約により自由度が 1 つ減っている。
そしてこの 2 つの部分は、パリティ制約 により結合されている。コーナーとエッジは物理的には独立に見えるが、代数的にはパリティを通じて不可分に結びついているのだ。
スーパーキューブとの比較
ルービックキューブの変種として、センターの向きも区別する「スーパーキューブ」がある。標準のキューブではセンターは固定とみなすが、実際にはセンターも回転しうる。この場合の状態数は
ではなく、やや複雑な計算が必要になる。センターの向きは の値をとるが、パリティ制約により に制限される。結果として
となる。標準キューブの約 2048 倍の状態数だ。
まとめ
ルービックキューブ群の位数 は、コーナーとエッジの位置・向きの組み合わせから、3 つの独立なパリティ制約を除くことで正確に導かれる。この導出過程そのものが群の半直積構造を明らかにしており、ルービックキューブが単なるパズルにとどまらず、豊かな代数構造を持つ数学的対象であることを示している。