素数大富豪(そすうだいふごう)は、2014年5月23日に、当時大阪大学の大学院生であった関真一朗氏によって考案された2人以上で遊ぶトランプゲームです。面白そうなのでC#でつくってみたいと思います。

素数大富豪とは

ルールですが、手札を並べて素数を作ります。これを順番に場に出し、早く手札をなくしたプレーヤーが勝ちです。出せるのは原則素数だけですが、一定の条件をみたせば合成数も出すことができます。

大富豪と同じで最初にカードを出す人が出せるカードの枚数を決めることができます。複数枚のカードを組み合わせて扱う際には、そのカードの数字(ただしA=1、J=11、Q=12、K=13)を並べて十進法で評価します。
たとえば2とJ(=11)のカードを並べて出した場合は「211」になるわけです。

ゲームの流れ

ゲームの流れですが、全プレイヤーに同枚数ずつ(原則は素数枚数ずつ)配り、残ったカードは山札として中央に積みます。ジャンケン等により親を決め、親が手札から最初の数を出し、以降順番に次のプレイヤーがカードを出し重ねていきます。親以外のプレイヤーは、手番が回ってきた時点で場にあるカードと同じ枚数でそれよりも大きな数しか出すことができません。カードを出した人以外が全員パスをした場合は場が流れ、そのプレーヤーが親となります。

手番が回ってきた時には、山札からカードを引いて手札に加えることができます。引けるカードは1度の手番につき1枚までです。引かずにカードを出すだけとかパスをすることもできる。パスに制限はなく戦略的なパスも認められています。

52枚のカードだけでなくジョーカーも使われます。ジョーカーは1枚出しでは最強のカードです。他のカードと組み合わせて2枚以上で使用する場合、または合成数出しにおける素因数として使用する場合は、0から13まで好きなカードとして使用できます。

通常の大富豪との相違点

通常の大富豪との共通点としては、手札を早くなくしたほうが勝ち、場に出ているカードと同じ枚数でしか出せないことが挙げられます。一方でカードに特別な強弱はなく、必要なら山札からカードを取ることができる点は大富豪と完全に異なっています。またひとつのゲームが終わったときに大富豪や大貧民といった階級はつけないことや、ゲーム開始前にカードの交換する(大富豪では「税金」とか「搾取」という)ルールも存在しません。

大富豪には「革命」というルールがあり、カードの強弱が変わります。素数大富豪にも「ラマヌジャン革命」という革命が存在します。

醍醐味は合成数出し?

原則、素数しか出せませんが、ある条件を満たすときには合成数を出すことができ、これが素数大富豪というゲームに深みを与えています。手札を組み合わせて合成数の素因数を作って出すことにより、場にその合成数を出すことができるのです。素因数は素因数場という通常の場とは異なる場に出され、このルールによって手持ちのカードを一気に減らすことができ、一発逆転の要素を持っています。

また合成数出しを行う際に使用する素因数には指数表記が許されます。合成数出しの場合、8は2×2×2なので8を場に出し、素因数場に2のカードを3枚出すことができる他に、8は2の3乗なので2のカードの右上に3のカードを載せた形で素因数場に出すこともできるのです。ただしジョーカーをつかって指数を0にして1を出したり、1乗としてその数を出すことはできません。

グロタンカットというルール

57は素数ではありません。ところがフランスで活躍したドイツ出身のユダヤ系フランス人の数学者、アレクサンドル・グロタンディークが素数について説明しようとしたとき誤って57を選んでしまったという逸話があります。そのため57は「グロタンディーク素数」と呼ばれるようになったといわれています。そのため特別ルールで57は素数として出すことができます。57が出ると即座に場が流れ、57を出した者が次の親になります。また57を合成数として出すこともできる(57=3×19なので場に5と7、素因数場に3と1と9を出す)が、この場合は特別な効果は持ちません。

ラマヌジャン革命

1729は数学者シュリニヴァーサ・ラマヌジャンの逸話からタクシー数と呼ばれます。療養所に入っていたラマヌジャンを見舞いに来たケンブリッジ大学のゴドフリー・ハーディは「乗ってきたタクシーのナンバーは1729だった。さして特徴のない数字だったよ」と言ったのですが、ラマヌジャンは1729は「とても興味深い数字です。それは2通りの2つの立方数の和で表せる最小の数です」と言ったそうです。こうして1729はハーディ・ラマヌジャン数やタクシー数と呼ばれるようになりました。

1729も57同様、素数ではありません(=7×13×19)がこれも57と素数大富豪においては特別に単体で出すことができます。そして1729が出されると数の大小が逆転し、大富豪と同じ現象がおきます。すなわち次のプレイヤーからは場に出ている数より小さな数を出さなければならなくなり、再度1729が素数として出されるか、ゲームが終了するまで続きます。ただし1枚出しでジョーカーが最強であることに限っては革命によっても変化することはありません。

なお57同様、1729を合成数(1729=7×13×19)として出すこともできますが、この場合も特別な効果は持たず、革命は起きません。

ゲームを作るにあたっての準備

今回はゲームとして完成させるところまではたどり着けそうもないので必要なものも準備です。

必要なこととして

カードを並べて数をつくる
その数は素数なのか判定する
コンピュータの手番の場合、出せるカードがあるかどうか判断できるようにする
勝つためのアルゴリズム(これはちょっと難しいそう)

カードに書かれている数字から整数をつくる

これは1から13までの整数の配列を渡して数をつくるためのメソッドです。引数はリストと配列の両方に対応できるようにします。

素数かどうかの判定

これはGetNumberメソッドが生成した整数が素数なのかどうかを判定するメソッドです。

これで出されたカードが素数かどうかを判定することはできるようになりました。次に考えないといけないのは素因数分解をする方法です。数が大きくなると処理が難しくなります。これが公開鍵暗号の信用性にも繋がっているのですが、ここでは素因数として使える数が限られているのでなんとかなりそうです。