人気サイエンス・ライターの竹内薫先生が校長を務める で、ルービック・キューブを教材としたプログラミングの授業が始まりました。ルービックキューブとプログラム、どのように関係しているのでしょうか。ルービック・キューブのディープな世界にお誘いします。
ルービック・キューブの数学
2ヶ月前にルービック・キューブを教材として使っている話を書きましたが、今回は、その「発展形」のお話です。例によってWolrfam Cloudで授業を進めているのですが、YES東京校の田森先生が書いたプログラムをみんなで「いじくって」遊んでいます。みんなでルービック・キューブのディープな数学世界を探索しましょう。
YouTubeを散策していると、「神の数」という動画に頻繁に出くわします。ルービック・キューブの異なる配置がいくつあるかという数字で、前にも書いたかと思いますが、およそ4325京なんですね、これが。
この途方もない組み合わせの一つから、別の組み合わせ(=完成形)へと10秒以下で到達してしまう人類がいることに、驚嘆せざるをえません。小学生ですら、回しはじめて一ヶ月で易々と一分を切ってくるのです。なんと精緻な脳と指の連動でしょう。
さて、実際にキューブを回してみて、みんながリアルで感覚的な理解を得たので、ようやくキューブワールドの深い数学世界に沈潜できます。
すでにYES東京校ではいろいろやっていたのですが、イマイチ、受けがよくありませんでした。内容が難しすぎたのかもしれません。同様に、YES横浜校の小5以上のクラスでも、あまり評判はよくありませんでした。
ところが、不思議なことに、小4のクラスでは、ほぼ全員が興味を示し、それなりに喜んでくれたのです。もしかしたら、私の説明が「こなれて」きて、生徒の理解が進んだのかもしれません。
ルービックキューブのプログラム
さて、肝心のプログラムですが、まずは、ルービックキューブの各面に数字を振ります。
もちろん、小さいリアルな立方体からキューブはできていて、センターとエッジとコーナーとでは、動き方が異なります。そこで、たとえば、U(=上を右ねじ方向に90度回転)とかR’(=右を左ねじ方向に90度回転)といった操作によって、この数字が、どのようにシャッフルされるのかをコンピュータに教えてやります。
さて、Uの操作の場合、3が27へ、27が28へ、28が3の場所に移動します。つまり、これらが「置換」されるのです。ぐるぐると置き換えられるのですね。数学好きの方は、「巡回置換」(cyclic permutation)という言葉をご存じかもしれません。記号では、この置換を、
{3, 27, 16, 28}
とあらわします。よろしいでしょうか?
でも、これだけではありません。小さな立方体があちこち動くので、その他の数字もシャッフルされます。ぜんぶ書くと、
{3, 27, 16, 28}, {6, 26, 13, 29}, {9, 25, 10, 30}, {37, 39, 45, 43}, {38, 42, 44, 40}
となります。
単に上面を90度ずらしただけで、数学的には、これほどたくさんの数字がぐるぐると置き換わるわけです。うそだと思う人は、キューブに番号を振って、回して確かめてください(授業ではやりました(笑))。
この動きをUDRLFBの6個について定義します。逆回転についても定義しておきましょう。上面Uと逆回転のU’については、
u = Cycles[{{3, 27, 16, 28}, {6, 26, 13, 29}, {9, 25, 10, 30}, {37, 39, 45, 43}, {38, 42, 44, 40}}]
um = InversePermutation[u]
といった具合です。同じような定義を、DRLFBについても書きます(詳細は補足参照)。
そして、操作の「グループ」(=仲間、群れ)を定義します。
RubikG = PermutationGroup[{u, d, b, r, l, f, um, dm, bm, rm, lm, fm}]
全部で12名の数学操作の仲間たちですね。数学好きの方は、これがいわゆる「群(group)」を成すことがおわかりでしょう。必ず逆の操作があり、「何もしない」もしくは「元に戻る」操作がありますよね。そして、グループ内で何をおこなっても、そのグループがつくる世界の外にはみ出すことはありません。
で、このグループがつくり出すことのできる、異なる状態がいくつあるかを計算します。このグループの世界の広さということですね。こんな命令です。
GroupOrder[RubikG]
そして、その答えこそが、ルービックワールドを統べる神の数、
43252003274489856000
なのです!
ここまでの流れの復習です。
まず、ルービックキューブのちっちゃな各面に背番号を振りました。次に、12個の操作でどう番号がシャッフルされるかを「ぐるぐる回る置き換え」で定義しました。そしてグループ全員の名簿を作って、最後に、このグループが生み出すことのできる世界の総数を計算したのです。
キューブを自動で解くロボット「GAN ROBOT」
でも、驚きはこの先にあります。
授業で私は生徒たちに、ルービックキューブを自動でシャッフルしたり、解いたりできるGAN ROBOTで遊ばせました(その際に59秒57の記録を出して新品の高性能キューブを手に入れた子もいます)。でも、このロボットには、下と東西南北の5本しかアームがないのです。上の蓋がないからです。そして、そのアームも、回転するだけのアームです。
12個の操作でつくられるルービックワールドは、はたして、5個の操作でもつくれるのでしょうか?
その前に、そもそも左ねじの6個(=R’のようにプライムがついている連中)は、グループの中では余分ですよね? たとえば、右ねじ回転のRを3回やればR’と同じになるわけですから。そこで、まずグループを6名に減らして、
RubikG = PermutationGroup[{u, d, b, r, l, f}]
として、神の数を計算してみると、当然ですが、
43252003274489856000
になりました。なんだか、会社組織などで業務に必須な人だけ選抜したような感じです。
では、もう一個減らしたらどうでしょう? たとえば、GAN ROBOTのようにUの動きを削除してしまいましょう。
RubikG = PermutationGroup[{d, b, r, l, f}]
そしてプログラムを実行すると、なんと! 答えは、
43252003274489856000
のままなんです。これは私にも田森先生にも「発見」でした。つまり、ルービックワールドは、5名のメンバーで構築可能だとわかったのです。GAN ROBOTの開発チームは、当然、この事実を知っていたのでしょう。
「もう一個減らしてみたい!」
生徒から要望が出ました。では、試しにRを削除して、グループを4名にしてみましょう。すると、おおお! 神の数字が、
1802166803103744000
と、いきなり24分の1に減ってしまいました! これだと神ではなく半神の数というべきでしょうか。うん? それにしても、なんで24分の1なんだろう?(←みなさん、考えてみてくださいね)
はい、ここで授業終了のチャイムが鳴りました。いやあ、数学プログラミングって本当に楽しいですね〜。
遊びの延長で大学レベルの抽象数学講義が理解できる
YESで使っているWolfram Cloudの凄いところは、大学レベルの抽象数学講義が、遊びの延長で理解できてしまう点だと思います。生徒たちは、楽しいルービックキューブの「付録」として、プログラムを鑑賞して実験してみたわけですが、将来、高等数学を学び直す際に、
「あ、これって、むかし薫先生が計算してくれたキューブ神の数だ!」
と、思い出してくれることでしょう。
おまけの話ですが、最近私は、ルービック・キューブを解く際に、いわゆる「カラーニュートラル」になってきました。インターネットの動画などでは、下面が白、上面が黄色で解く方法がよく紹介されていますが、最初に下面でクロス(白十字)をつくるのが億劫で、臨機応変に他の色のほうがつくりやすい場合は、たとえば青でクロスをつくることにしたのです。
また、完成までの手順を端折る「ウィンター・バリエーション」なるものも少し憶え始めたり、クロスではなく、最初に2×2×2、次に2×2×3のブロックをつくる方法も試みています。
キューブの蒐集にも熱が入ってきまして、アメリカの でプロが調整、潤滑、特殊なステッカー貼りをしてくれるカスタムキューブを使い始めました。いまのところ硬い回し心地のVALK 3Mとゆるい回し心地のDAYAN Tengyun Mの両極端の「感触」にハマっております。
とはいえ、還暦キューバーの指の動きはお世辞にも速いとはいえず、子どもたちにスピードには勝てません。まあ、ゆっくり楽しみながらパズルを解くのも乙なもの、ということにしておきましょう(笑)
詳細な補足:以下、6面の90度回転の定義です。実際にプログラムを組んでみたい方は参考にしてください(YES東京田森先生作成)
u = Cycles[{{3, 27, 16, 28}, {6, 26, 13, 29}, {9, 25, 10, 30}, {37, 39, 45, 43}, {38, 42, 44, 40}}]
f = Cycles[{{7, 43, 16, 52}, {8, 44, 17, 53}, {9, 45, 18, 54}, {28, 30, 36, 34}, {29, 33, 35, 31}}]
l = Cycles[{{1, 3, 9, 7}, {2, 6, 8, 4}, {19, 37, 28, 54}, {22, 40, 31, 51}, {25, 43, 34, 48}}]
r = Cycles[{{1, 46, 10, 37}, {2, 47, 11, 38}, {3, 48, 12, 39}, {19, 21, 27, 25}, {20, 24, 26, 22}}]
d = Cycles[{{10, 12, 18, 16}, {11, 15, 17, 13}, {21, 52, 30, 39}, {24,49, 33, 42}, {27, 46, 36, 45}}]
b = Cycles[{{1, 34, 18, 21}, {4, 35, 15, 20}, {7, 36, 12, 19}, {46, 48, 54, 52}, {47, 51, 53, 49}}]
これまでの【竹内薫のトライリンガル教育】は