tomohxxの日記

麻雀プログラミング

麻雀と合同式

はじめに

以前から考えていたことを記事にまとめておきます。麻雀は一言でいうと面子と雀頭を集めるゲームです。数牌の面子には順子と刻子があり、これらを構成する牌の数字の和はともに3で割り切ることができます。例えば123mならば牌の数字の和は6であり、678mであれば21なので確かに3で割り切れます。連続する3数の和が3で割り切れることは中学校で習うのでこのようなことを連想する人は多いのではないかと思います。とてもシンプルなアイデアですがこれを応用することで和了形の雀頭聴牌形の待ちを効率的に探すことができます。

証明のパターンを追加しました(2020/06/22追記)。

前提

この記事では1色の数牌からなる手牌を扱います。特にどの種類の牌であるかを限定しません。以降でいくつかの定理を述べますが、それらで共通する操作に手牌の数字の和をとるというものがあります。これを sと表すことにします。また合同式を扱いますが、すべて3を法とします(これは面子の数字の和が3で割り切れることに由来します)。そのため数式中の \mod 3を省略していることに注意してください。合同式について知りたい方は以下のページを参照してください。

mathtrain.jp

諸定理

定理1

手牌が 3N ( Nは任意の自然数)枚の牌からなり N組の面子に分解できるならば s \equiv 0が成り立つ。

  • 証明

同一の3数の和および連続する3数の和はともに3で割り切れるため成り立つ。

定理2

手牌が 3N+2枚の牌からなり N組の面子と1つの雀頭に分解できるとする。雀頭 pとすると p \equiv 2sが成り立つ。

  • 証明

条件より s \equiv 2p。両辺に2をかけると 2s \equiv 4p = 3p + p \equiv pとなるので整理して p \equiv 2sが成り立つ。

  • 補足

この定理は和了判定で雀頭を探すのに使えます。

定理3

手牌が 3N+2枚の牌からなり N組の面子と1つの塔子(リャンメン/ペンチャン/カンチャンのいずれか)に分解できるとする。待ち牌を xとすると x \equiv 2sが成り立つ。

  • 証明(その1)

リャンメン/ペンチャン待ちの場合とカンチャン待ちの場合に分けて考える。

(1) リャンメン/ペンチャン待ちの場合
リャンメン/ペンチャン待ちを構成する牌を t, t+1とする。待ち牌を xとすると x \equiv t+2である。 s \equiv t + (t + 1) \equiv 2t +1の両辺に2をかけて 2s \equiv 4t + 2 \equiv t + 2を得る。よって x \equiv 2sが成り立つ。

(2) カンチャン待ちの場合
カンチャン待ちを構成する牌を t, t+2とする。待ち牌を xとすると x \equiv t+1である。 s \equiv t + (t + 2) \equiv 2t +2の両辺に2をかけて 2s \equiv 4t + 4 \equiv t + 1を得る。よって x \equiv 2sが成り立つ。

1, 2より与えられた命題が成り立つ。

  • 証明(その2)

手牌に待ち牌を加えると N組の面子に分解できる。待ち牌を xとすると定理1より s+x \equiv 0。整理して x \equiv -s \equiv 2sが成り立つ。

  • 補足

この定理は雀頭がわかっているとき待ち牌を探すのに使えます。

定理4

手牌が 3N+1枚の牌からなり N面子一雀頭を待つ聴牌形であるとする。雀頭または雀頭候補を p、待ち牌を xとすると p + x \equiv 2sが成り立つ。

  • 証明(その1)

リャンメン/ペンチャン/カンチャン待ちの場合とタンキ待ちの場合、シャボ待ちの場合の3つに分けて考える。

(1) リャンメン/ペンチャン/カンチャン待ちの場合
雀頭がわかっているので定理3より x \equiv 2(s - 2p) \equiv 2s - 4p \equiv 2s - pが成り立つ。 移項して p + x \equiv 2sが成り立つ。

(2) タンキ待ちの場合
 p = xと考える。 x \equiv sとなるので p + x \equiv 2sが成り立つ。

(3) シャボ待ちの場合
一方の雀頭候補を p、他方の雀頭候補を xとする。 2p + 2x \equiv sとなるから p + x \equiv 2sが成り立つ。

1, 2, 3より与えられた命題が成り立つ。

  • 証明(その2)

手牌に待ち牌を加えると N組の面子と1つの雀頭に分解できる。定理2より p \equiv 2(s+x)。整理して 2s \equiv p - 2x \equiv p + x

  • 補足

この定理は雀頭/待ちのいずれかを固定して他方を探すのに使えます。また、この定理から待ちが複数の筋にまたがるときは雀頭も複数の筋にまたがらなければならないことが言えます。多面待ちの多くのパターンで暗刻が含まれるのはこのような理由があったためと理解できます。多面待ちの一覧を知りたい方はこちらの記事をご覧ください。

tomohxx.hatenablog.com

おわりに

個人の経験や想像力によらずに普遍的なことを主張できるので、数学は本当に強力なツールですよね。ところで以上の定理の用途に和了判定・聴牌判定・待ち牌探索を高速化する以外が存在するのか、実のところ疑問です。要するにプログラマ向けに限定された知識になっているのではないかということです。頭の回転の早さに自信がある方ならば、頭の片隅にでも上記の知識を置いておくと何かの機会に役に立つかもしれませんね。