Emblenのぼやき

ぴよぴよ

Mod13スピードはいいぞ

この記事はcoins Advent Calendar 2023 - Adventarの13日目の記事です.

adventar.org

はじめに

皆さん,好きなトランプゲームはありますか?

トランプゲームは様々あり,有名なのは神経衰弱,7並べ,大富豪,ババ抜き,スピード,素数大富豪,Mod13スピードあたりでしょうか.

(私はジジ抜きアンチです.最後まで何がジジか分からないというのは,興奮しようがありません.)

その中でもスピードは短時間で勝負を決することができ,お忙しいであろう皆さんでもサクッと勝負をすることができます.でもスピードのルールを知っている方なら分かると思いますが,正直あまり面白みがないですよね,飽きます.でも「Mod13スピード」は違います.この記事では,私が最近出会った「Mod13スピード」を皆さんに布教しようと思います.

お前は誰

筑波大学理工学群工学システム学類4年生をやらせてもらってます,えんぶれんです.

実はcoinsではありません.

学内に生えているキウイをもぎ取って食ってた人です.

Mod13スピードとは何ですか

ものすごく簡単に言うと,「Mod13でスピードをする」です.何のことかさっぱりわかりませんね,順を追って説明しましょう.楽しい楽しいただのゲームにすぎませんから,リラックスして読んでいってください.

以下にMod13スピードの詳細なルールとテクニックが書かれている文書があります.私が書いたわけではありませんが,ぜひご一読ください.

「Mod13スピードのルールとテクニック」

http://nadamath2012.web.fc2.com/bushi/2006_simoo.pdf

普通のスピードの説明

普通のスピードをご存知でしょうか.知っている方はこの項目は飛ばしてもらって構いません.簡単なゲームの流れは以下のとおりです.

1.トランプ52枚をシャッフルして26枚ずつ裏向きに持ちます

2.手元に4枚のカードを表を向けて出します

3.「せーの」の掛け声で手に持っているカードから1枚ずつ場に出します

4.場にある数字の±1異なる数を,表向きにしている4枚のカードの中から該当するカードの上に重ねて,相手よりも早く出します(ここがスピード要素).どちらのプレイヤーも出せる数字がないときは3に戻ります

5.表向きになっているカードが3枚以下になったら,手に持っているカードから補充します.補充のタイミングはいつでもかまいません

6.4と5を繰り返し(スピーディーに)行い,表向きになっている4枚のカードを含め,手札を先に全て場に出したプレイヤーの勝利です

 

例えば以下のような盤面の場合,プレイヤーA,Bはそれぞれどのカードを出すことができるでしょうか.

プレイヤーAは5の上に6を,7の上に6を出すことができます.

プレイヤーBは5の上に4または6,7の上に6を出すことができます.

Mod13スピードの説明

ゲームの進行はほぼ普通のスピードと同様ですが,2点だけ(だけ?)大きく異なる点があります.

1つ目は,任意の側の場札の上にカードを出せることです.つまり,自分が連続してカードを出せるように,相手がカードを出せないように,カードを出す山を決めることができます.

2つ目は,出せる数です.普通のスピードでは,場の数の±1異なる数を出すことができました.Mod13スピードでは,場にある札をそれぞれa,bとおくと,a+b,a-b,b-a,a*b,a/b,b/a のMod13での演算結果を出すことができます.なるほどなるほど(?)

 

よく分からないと思うので,同じように以下の盤面を考えてみましょう.プレイヤーA,Bはそれぞれどの数を場に出すことができるでしょうか?

まずすべての演算をしてみましょう.

今,a=5,b=7とおくと,13を法とした演算結果は以下のようになります.

a+b≡12,a-b≡11,b-a≡2,a*b≡9,a/b≡a*2≡10,b/a≡b*8≡4

割り算について,は?と思われるかもしれませんが,このあと解説します.

したがってプレイヤーAは10を,プレイヤーBは4,11,9を場に出すことができます.

ところでモジュラ逆数とは?割り算ってどうやるの?

まず,この世の中には逆数というものが定義されており,例えば2の逆数は1/2です.逆数の定義は,任意の数 a に対してかけて1になる数 b のことです.つまり,a*b=1になる b を a の逆数といいます.

これをMod13でやるとどうなるでしょうか.定義に則ると,a*b≡1 (mod13)である b が a の逆数です.これをモジュラ逆数といいます.例をいくつか考えてみましょう.

2*7≡1 (mod13) より,2のモジュラ逆数は7です.逆に7のモジュラ逆数は2です.

3*9≡1 (mod13) より,3のモジュラ逆数は9,9のモジュラ逆数は3です.

同様に,4と10,5と8,6と11,12と12,1と1はそれぞれモジュラ逆数の関係にあります.

次に割り算を考えてみましょう.

任意の数 a を任意の数 b で割る,つまり a/b は,a に b の逆数をかける,つまり a*(bの逆数)と等しいですよね.したがって,例えば 11/2≡11*7(2のモジュラ逆数)≡12 (mod13)となります.

これで割り算をマスターしました.四則演算は完璧ですね.

Mod13スピードに出会った日の話

私がMod13スピードをどのようにして知ったかお話しします.

2023年10月31日,いつものように日が沈んだあとに研究室に赴き,以下の記事を参考にしながらモジュラ逆数を求めるプログラムを書いていました.(実はまだMod13スピードに出会って2ヶ月も経っていません)

 

カタカタ......ワカンネー

 

ん?

 

そこには「Mod13スピード」の文字が.

スピードにモジュラ逆数を使う?なんだそれは,絶対面白いじゃないか.やりたい!

qiita.com

ありがとう,競プロ.競プロをやっていなかったらMod13スピードを知ることはなかったであろう.

早速やってみる

これを知った瞬間に,研究室の先輩方2名を巻き込んで対戦を始めました.一旦やってみることって大事です,一旦ね.

最初はスピード要素のかけらもないどころか,出せる数を声に出して計算してお互いに教え合う()ということをやっていました.

 

やっているうちに,冒頭で紹介した資料の中で気になる定理を見つけます.

「場にある数の和が13のとき,必ず12が出せる」

本当か?なぜ?早速C先輩がExcelで計算を始めます.分かったのは,場にある数の和が13になるとき,割り算をすると答えが必ず12になることです.12のモジュラ逆数は12なので,割り算は2通りありますが結果はどちらも12になります.

C先輩が証明してくれました.

(証明)

場にある2つの数を a, b と置く.

今,前提条件としてa+b=13であるから,b=13-aである.

ここでb/aを考えると,b/a = (13-a)/a .

Mod13上での a の逆元を x と置くと,逆元の性質より a*x ≡1 (mod13) .

(13-a)/a ≡ (13-a)*x ≡ 13*x - a*x ≡ -a*x ≡ -1 ≡ 12 (mod13).

(証明終わり)

 

a/bの場合も,a=13-bという前提条件から同様に導くことができます.

 

いや~モジュラ逆数面白いな.

 

こうして1か月半の間Mod13スピードをやり続け,次のようになってしまいました.

・足し算ができなくなる

モジュラ逆数を覚えたら,割り算をしたくなります.割り算から考えてしまい,足し算が疎かになった結果,「6+9ってなんだっけ」のように頭がバグります.

・どの演算をしたか忘れたけど出せるカードだけ分かる

「多分これ出せるんだよね...」と,すごすごと場にカードを出す場面に何度も遭遇しました.「10と7が場にあるときは10も7も出せるぜ」とか,「12が場にあるときは場のもう一方の数を±1した数が出せるぜ」などといった法則を見つけられるようになってきます。

自己研鑽プログラムを書く

こんなに楽しいゲーム,人間が2人いないとできないのは勿体ないですよね.ですからPCと対戦するプログラムを書いてみましょう.

 

できました.

コンソール上での対戦で,入力はコマンドを打っていく原始的なアプリですが,自己研鑽には十分です.仕様として,

・入力を誤ってしまうとそのターンは出せない

・相手(CPU)が出すまでの時間を調節できる

というものがあります.的確な札を出す正確性が問われ,相手よりも早く出す俊敏性を培うことができ,自己研鑽に大いに役立ちそうですね.

 

このコードはGitHubで公開しています.自己研鑽をしたい方は勝手に自分でコンパイルを行ってCPUと対戦してみてください.

github.com

 

なお動いたときは感動したものの,ひとりでPCに向き合うだけなので

 

「飽きます」

 

おわりに

人間と対戦したほうが遥かに楽しいです.皆プレイヤーになって私と対戦してください.それでは,良いMod13スピードライフをお過ごし下さい.

 

最後に,研究室内やその他様々なところでMod13スピードを布教するにあたって言われた文言を紹介します.

「頭がおかしい」

「脳が破壊される」

「足し算と引き算と掛け算まではいける,割り算は無理」

「元気なときにやると楽しいのかもしれない」

「絶対にやりたくない」

 

以上です.