ルービックキューブ解法を群論で理解する:交換子と共役

ルービックキューブを解くとき、最大の難関は「他のパーツを崩さずに少数のパーツだけを動かす」ことだ。群論はこの問題に対して、交換子(commutator)と共役(conjugation)という 2 つの強力な道具を提供する。本記事では、これらがなぜ「影響範囲を狭める」効果を持つのかを代数的に明らかにし、具体的なキューブ操作で検証する。

交換子の定義と直観

の元 に対し、交換子は

で定義される。 が可換、すなわち ならば (単位元)だ。交換子は「 がどれだけ非可換か」を測る量である。

ルービックキューブの文脈で交換子が重要な理由は、次の観察にある。 が動かすパーツの集合を が動かすパーツの集合を と書くと、 が動かすパーツは

だが、実際にはもっと狭い。 ならば は可換だから となり、何も動かない。つまり交換子が非自明になるのは が重なる部分だけであり、重ならない部分では の効果が で、 の効果が で打ち消される。

交換子 は 4 手の操作だが、 の支持集合(supp)が少しだけ重なる場合、重なり部分のパーツだけが最終的に動く。重ならない部分では による打ち消しが起こる。

支持集合の重なりが小さいほど、交換子の影響範囲が狭くなるという原理。

具体例: の計算

最も基本的な交換子 (ここで )を計算しよう。

が動かすコーナーは が動かすコーナーは だ(前回の記事の番号付けに従う)。重なりは の 2 個だけ。

各操作のコーナー置換を順に追跡する。

# コーナー番号 1-8
# R: (1 4 8 5), U: (1 2 3 4)
# R': (1 5 8 4), U': (1 4 3 2)

def apply_perm(state, perm):
    """perm = {from: to} の辞書で置換を適用"""
    new = list(state)
    for fr, to in perm.items():
        new[to - 1] = state[fr - 1]
    return new

# 初期状態: 各位置にその番号のパーツがある
state = [1, 2, 3, 4, 5, 6, 7, 8]

R  = {1:4, 4:8, 8:5, 5:1}
U  = {1:2, 2:3, 3:4, 4:1}
Ri = {4:1, 8:4, 5:8, 1:5}
Ui = {2:1, 3:2, 4:3, 1:4}

for name, perm in [("R", R), ("U", U), ("R'", Ri), ("U'", Ui)]:
    state = apply_perm(state, perm)
    print(f"After {name}: {state}")

moved = [(i+1, p) for i, p in enumerate(state) if p != i+1]
print(f"Moved: {moved}")

結果として、 のコーナー置換は となる。3-cycle だ。8 個のコーナーのうち、たった 3 個だけが入れ替わる。 もそれぞれ 4 個のコーナーを動かす 4-cycle だが、交換子にすると影響範囲が劇的に縮小する。

エッジについても同様に計算すると、 のエッジ置換は で、12 個中 6 個のエッジが動く。コーナーに比べるとエッジへの影響はやや広いが、それでも がそれぞれ動かす 4 エッジ(計 8 スロット)よりは少ない。

なぜ 3-cycle になるのか

交換子が 3-cycle を生む代数的な理由を説明しよう。 のコーナー置換をそれぞれ とする。

置換の支持集合は であり、共通部分は のみが動かすのは のみが動かすのは だ。

交換子 の作用を追跡すると、 のみが動かす点()と のみが動かす点()は完全に元に戻る。なぜなら、たとえば点 で移動し は関与せず で戻り も関与しないからだ。

動くのは共通部分 と、そこから が引き込む だけだ。 の 3 点が巡回的に入れ替わり、3-cycle が生じる。

一般に、2 つの -cycle の交換子は、支持集合の重なりの大きさ に応じて -cycle 以下の置換を生む。 では 4-cycle 同士で だから、 で 3-cycle が得られるわけだ。

共役の原理

共役 は、操作 の「場所を変える」技法だ。

がある特定のパーツ集合に作用する操作だとする。 は「準備操作」で、目標のパーツを の作用圏内に移動させ、 を施した後、 で元の配置に戻す。

交換子

2 つの操作の「非可換度」を取り出す。影響範囲が支持集合の重なりに局在化される

共役

操作 の作用を で別の場所に「輸送」する。 の代数的構造(サイクル型など)は保存される

共役の基本性質として、サイクル型が保存される。 が 3-cycle ならば もまた 3-cycle だ。つまり共役は操作の「形」を変えずに「位置」だけを変える。

共役の具体例:セットアップムーブ

実際のキューブ解法でこの原理がどう使われるか見てみよう。

のコーナー置換が (UFR → UFL → UBR の 3-cycle)であることがわかった。では、UFR → UBL → DFR の 3-cycle を実行したいとしよう。直接そのような交換子を見つけるのは困難だが、共役を使えば既知の 3-cycle を「ずらす」ことができる。

適切なセットアップムーブ を見つけて、 とすればよい。 は「UFR → UFL → UBR」を「UFR → UBL → DFR」に写す置換を実現する操作だ。

# セットアップムーブの効果を確認する例
# [R, U] = RUR'U' のコーナー置換: (1 2 4)
# これは UFR -> UFL -> UBR の 3-cycle
# D[R,U]D' は D(RUR'U')D' に等しく、
# D が (5 6 7 8) なので (1 2 4) は D の作用を受けない

# 代わりに F[R,U]F' を考える
# F のコーナー置換: (1 5 6 2)
# F(1)=5, F(2)=1 -> F(5)=6 (not needed)
# 共役 F(1 2 4)F' = (F(1) F(2) F(4)) = (5 1 4)
# つまり DFR -> UFR -> UBR の 3-cycle

# これで異なる3つのコーナーの3-cycleが得られた
targets = {
    "[R,U]": "(1 2 4) = UFR->UFL->UBR",
    "F[R,U]F'": "(5 1 4) = DFR->UFR->UBR",
}
for move, desc in targets.items():
    print(f"{move}: {desc}")

このように、1 つの交換子 さえあれば、共役によってあらゆるコーナー 3-cycle を生成できる。これが共役テクニックの威力だ。

交換子のもう一つの形: の影響範囲

交換子の影響範囲をもう少し体系的に分析しよう。 が動かすパーツの集合をそれぞれ とする。

領域定義 での挙動
のみ元に戻る
のみ元に戻る
重なり動く可能性がある

パーツが のみに属する場合、 の中で はそのパーツに影響せず、 が打ち消し合う。 のみに属する場合も同様だ。

実際に動くのは に属するパーツと、その近傍のパーツに限られる。この局在化の原理こそが、交換子が解法の基本道具となる理由だ。

位数と交換子の関係

の位数を計算してみよう。コーナー置換は で 3-cycle だから位数 3。エッジ置換は で互いに素な 2 つの 3-cycle だから位数 3。向きの変化も考慮すると、 であることが知られている。

基本操作 の位数は 4 だが、交換子の位数は 6 になる。これは一見不思議だが、交換子が元の操作とは異なるサイクル構造を持つことの反映だ。4-cycle 2 つの交換子が 3-cycle を生み、位数が 4 から 3 の倍数に変化するのは、代数的に自然な帰結である。

解法アルゴリズムへの応用

交換子と共役の組み合わせは、ルービックキューブの解法アルゴリズムの核心をなす。典型的なパターンを整理しよう。

3-cycle の生成

で 3-cycle を作り、 で目標位置に移動させる。コーナーの位置合わせに使う。

2 点の向き修正

の向き変化に注目し、位置を元に戻しつつ 2 つのパーツの向きだけを変える手順を構成する。エッジのフリップやコーナーのツイストの修正に使う。

たとえば、T-perm と呼ばれる操作 は、実際には共役と交換子の入れ子構造で分解できる。

この手順は 2 つのコーナーと 2 つのエッジを同時に入れ替える操作であり、PLL(Permutation of the Last Layer)の一部として広く使われている。一見複雑だが、「交換子で少数のパーツだけを動かし、共役で目標位置に合わせる」という原理の応用にほかならない。

交換子の深さと操作の効率

1 重の交換子 で得られる操作は限られている。より精密な操作が必要な場合、入れ子の交換子 を用いることがある。

入れ子の交換子は影響範囲をさらに狭める効果を持つ。 個のパーツを動かすなら、 の支持集合の重なりに依存するが、一般に 個以下のパーツしか動かさない。

基本操作(4-cycle)

1 重の交換子(3-cycle)

入れ子の交換子(2 点のみの操作が可能に)

この「交換子の深さを増すほど影響範囲が狭まる」という性質は、Schreier 予想やキューブ群の導来列と深い関係にある。次の記事で、交換子部分群とキューブ群の可解性について詳しく論じる。

まとめ

交換子 は、 の支持集合の重なりに影響範囲を局在化させる操作だ。共役 は操作 のサイクル型を保存しながら作用点を移動させる。この 2 つの道具を組み合わせることで、「任意のパーツの組を狙い撃ちして動かす」操作を体系的に構成できる。ルービックキューブの高速解法アルゴリズムは、この代数的原理の実践的応用にほかならない。