ルービックキューブ群論の核心:位数の導出とパリティ制約

ルービックキューブの全状態数――すなわちルービックキューブ群の位数――は約 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 つの独立なパリティ制約を除くことで正確に導かれる。この導出過程そのものが群の半直積構造を明らかにしており、ルービックキューブが単なるパズルにとどまらず、豊かな代数構造を持つ数学的対象であることを示している。