初めに
麻雀における4面子1雀頭形(以下,標準和了形と称する)の向聴(シャンテン)数の計算式としてしばしば「8-(面子数)×2-(搭子数)-1」ないしは「13-(面子数)×3-(搭子数)×2-(孤立牌数)」というものが採用されている.しかしながら,この計算式は端的に言えば間違い,すなわち特定のケースで(ごく一般的な麻雀のルールにおける)向聴数と異なる数値を計算するものである.実際の間違いの詳細な内容についてはtomohxx氏の「ブロック分解方式向聴数計算アルゴリズムの精度の検証」を参照のこと.
上記の計算式が仮に間違いでないならば,計算式に登場する「面子数」や「搭子数」といったものを厳密に定義することで,これらを標準和了形に対する向聴数の定義として採用しても特に問題は無い.しかしながら,上記の計算式が間違いである以上,これらを標準和了形に対する向聴数の定義とすることは少なくとも数学的にはありえないことになる.
では,標準和了形に対する向聴数を数学的に定義するとどうなるのか? これが本稿の中心的な目的である.筆者の知る限り,本稿は世界で初めて標準和了形に対する向聴数を構成的(つまり計算機上で取り扱える形)かつ形式的に定義したものである.
標準和了形に対する向聴数の構成的定義
向聴数の説明として以下のようなものが挙げられる:
おおまかに言って,「ある手牌を聴牌形へと変形するために必要な自摸の最小回数」を向聴数と称するところまでは合意できるようであるので,これを数学的に形式化することを試みよう.
まず,以降の議論のために牌の種類を0から33までの自然数で表現しておく.各自然数と各牌の対応は以下の通りである.
自然数 | 対応する牌の種類 |
---|---|
$0$ | 一萬 🀇 |
$1$ | 二萬 🀈 |
$2$ | 三萬 🀉 |
$3$ | 四萬 🀊 |
$4$ | 五萬 🀋 |
$5$ | 六萬 🀌 |
$6$ | 七萬 🀍 |
$7$ | 八萬 🀎 |
$8$ | 九萬 🀏 |
$9$ | 一筒 🀙 |
$10$ | 二筒 🀚 |
$11$ | 三筒 🀛 |
$12$ | 四筒 🀜 |
$13$ | 五筒 🀝 |
$14$ | 六筒 🀞 |
$15$ | 七筒 🀟 |
$16$ | 八筒 🀠 |
$17$ | 九筒 🀡 |
$18$ | 一索 🀐 |
$19$ | 二索 🀑 |
$20$ | 三索 🀒 |
$21$ | 四索 🀓 |
$22$ | 五索 🀔 |
$23$ | 六索 🀕 |
$24$ | 七索 🀖 |
$25$ | 八索 🀗 |
$26$ | 九索 🀘 |
$27$ | 東 🀀 |
$28$ | 南 🀁 |
$29$ | 西 🀂 |
$30$ | 北 🀃 |
$31$ | 白 🀆 |
$32$ | 發 🀅 |
$33$ | 中 🀄 |
次に手牌(一般には牌の多重集合)の数学的な表現を導入する.手牌は34個の自然数を並べた列 $\mathbf{h} = (h_0, \dots, h_{33}) \in \mathbb{N}^{34}$ で表現できる.ここで,列の1番目の自然数は手牌に含まれる一萬 🀇 の個数を表す.また,列の2番目の自然数は手牌に含まれる二萬 🀈 の個数を表す.以下,同様に,列の $i$ 番目の自然数は手牌に含まれる牌種 $i$ の個数を表す.
さらに手牌 $\mathbf{h} = (h_0, \dots, h_{33})$ から手牌 $\mathbf{g} = (g_0, \dots, g_{33})$ へと変形するために必要な自摸(手牌に任意の種類の牌を1枚追加する操作)の最小回数を $\delta(\mathbf{g}, \mathbf{h})$ と表記することとする.明らかに $\delta(\mathbf{g}, \mathbf{h}) = \sum_{i = 0}^{33} \max(g_i - h_i, 0)$ である.
以上の表記に加えて標準和了形に対する聴牌形全体の集合を $T \subset \mathbb{N}^{34}$ と表記すると,手牌 $\mathbf{h} \in \mathbb{N}^{34}$ の向聴数 $s(\mathbf{h})$ の定義の1つとして $s(\mathbf{h}) \equiv \min_{\mathbf{t} \in T} \delta(\mathbf{t}, \mathbf{h})$ が採用できるように思われる.しかしながら,この定義には実用上の大きな問題がある.聴牌形と和了形のどちらも $s(\mathbf{h}) = 0$ となり,聴牌形と和了形の区別がつかないのである.
そこで,向聴数の拡張的な定義として和了形に対する向聴数として -1 を付与するものを考える.まず,標準和了形全体の集合を $W \subset \mathbb{N}^{34}$ と表記する.そして,手牌 $\mathbf{h} \in \mathbb{N}^{34}$ に対する置換数 $r(\mathbf{h})$ を $r(\mathbf{h}) \equiv \min_{\mathbf{w} \in W} \delta(\mathbf{w}, \mathbf{h})$ で定義する.また, $\mathbf{h}$ に対する向聴数 $s(\mathbf{h})$ を $s(\mathbf{h}) \equiv r(\mathbf{h}) - 1$ で定義する.この定義により,和了形以外に対して「聴牌形へと変形するために必要な自摸の最小回数」 となり,和了形に対して「-1」となるような数値が定義できる.
以上までの議論は特に目新しいものでなく,少なくとも筆者の知る限り清一色のシャンテン数を01BFSで計算するにおいて初出の議論である.
本稿における中心的な指摘は,上記において表記した標準和了形全体の集合 $W$ を(少なくとも筆者が知る限り)誰も数学的に定義していないという事実である.標準和了形全体の集合 $W$ は,麻雀のルール上,厳密に定まる有限集合であるため,この集合の存在を天下り的に認めて向聴数の議論を展開してもある程度は許されると筆者は考える.しかしながら,この集合が数学的に定義されていない以上,この集合に依拠して表記された向聴数はそもそも元を正せば数学的には定義されていないと言わざるを得ない,というのが本稿における筆者の主張である.
そこで,標準和了形全体の集合 $W$ を数学的に定義して,向聴数も数学的にきちんと定義された概念としておこうというのが本稿の貢献である.本稿では,特に,標準和了形全体の集合 $W$ を構成的に定義する.構成的な定義を与えることで, $W$ の列挙に関するアルゴリズムや, $W$ の定義に依拠して定義された向聴数の計算アルゴリズムなどに対する形式的な取り扱いを可能にする下準備が整うこととなる.
さて,標準和了形全体の集合 $W$ の要素を過不足なく列挙するにはどうすれば良いだろうか,ということを以下では考えていく.
まず,一萬 🀇 に着目して,「一萬を先頭とする順子(つまり 🀇🀈🀉)」「一萬からなる刻子(つまり 🀇🀇🀇)」「一萬からなる雀頭(つまり 🀇🀇)」をそれぞれ適当な個数取り出してくることを考える.「一萬を先頭とする順子」を取り出してくる個数を $x$,「一萬からなる刻子」を取り出してくる個数を $y$,「一萬からなる雀頭」を取り出してくる個数を $z$ と,それぞれ表記することとする.「各牌は4枚しかない(したがって一萬も4枚しかない)」「標準和了形において雀頭は(高々)1つ(したがって一萬からなる雀頭を2個以上取り出すことは考えなくて良い)」という制約のみに注目すると, $(x, y, z)$ という3つ組が取りうる値は以下の表における10種類に限られる.
(x, y, z) | 対応するタイル |
---|---|
(0, 0, 0) | (No tile) |
(0, 0, 1) | 1m1m (🀇🀇) |
(0, 1, 0) | 1m1m1m (🀇🀇🀇) |
(1, 0, 0) | 1m2m3m (🀇🀈🀉) |
(1, 0, 1) | 1m1m1m2m3m (🀇🀇🀇🀈🀉) |
(1, 1, 0) | 1m1m1m1m2m3m (🀇🀇🀇🀇🀈🀉) |
(2, 0, 0) | 1m1m2m2m3m3m (🀇🀇🀈🀈🀉🀉) |
(2, 0, 1) | 1m1m1m1m2m2m3m3m (🀇🀇🀇🀇🀈🀈🀉🀉) |
(3, 0, 0) | 1m1m1m2m2m2m3m3m3m (🀇🀇🀇🀈🀈🀈🀉🀉🀉) |
(4, 0, 0) | 1m1m1m1m2m2m2m2m3m3m3m3m (🀇🀇🀇🀇🀈🀈🀈🀈🀉🀉🀉🀉) |
同様のことを二萬 🀈 や三萬 🀉 などに対して考えていく.最終的に,34種類の牌それぞれに対して,上表の10種類の $(x, y, z)$ のどれかを適当に割り当てていけば,0個以上の面子と0個以上の雀頭からなるなんらかの手牌を指定できることは明らかであろう.
定義1(分解要素)
分解要素 $d^{(0)}$, $d^{(1)}$, $d^{(2)}$, $d^{(3)}$, $d^{(4)}$, $d^{(5)}$, $d^{(6)}$, $d^{(7)}$, $d^{(8)}$, $d^{(9)}$ を以下で定義する:
- $d^{(0)} \equiv (0, 0, 0)$,
- $d^{(1)} \equiv (0, 0, 1)$,
- $d^{(2)} \equiv (0, 1, 0)$,
- $d^{(3)} \equiv (1, 0, 0)$,
- $d^{(4)} \equiv (1, 0, 1)$,
- $d^{(5)} \equiv (1, 1, 0)$,
- $d^{(6)} \equiv (2, 0, 0)$,
- $d^{(7)} \equiv (2, 0, 1)$,
- $d^{(8)} \equiv (3, 0, 0)$,
- $d^{(9)} \equiv (4, 0, 0)$.
以下,全ての分解要素からなる集合を $D$ と表記する.
定義2(分解要素の連結)
分解要素の列 $\mathbf{d} = (d_0, d_1, \dots, d_{n - 1}) \in D^n$ と分解要素 $d \in D$ が与えられた時,2項演算 $\mathbf{d} \cdot d$ を $\mathbf{d} \cdot d \equiv (d_0, d_1, \dots, d_{n - 1}, d) \in D^{n + 1}$ と定義する.
0個以上の面子と0個以上の雀頭で構成される任意の手牌のうち麻雀のルールに従うものは,常に34個の分解要素の列で表すことができるのは自明である.例えば,4面子1雀頭形の和了形 "1m1m1m1m2m2m2m2m3m3m3m3m4m4m" は $(d^{(9)}, d^{(0)}, d^{(0)}, d^{(1)}, d^{(0)}, \dots, d^{(0)})$ で表現することができる.
しかしながら,上記の逆,すなわち「34個の分解要素の列が全て,0個以上の面子と0個以上の雀頭で構成される任意の手牌のうち麻雀のルールに従うものを表現する」は必ずしも成り立たない.というのも,34個の分解要素の列として表現される手牌が以下のいずれかの制約を満たさない場合があるからである:
- 4面子1雀頭形の和了形においては,面子の数は4である,
- 4面子1雀頭形の和了形においては,雀頭の数は1である,
- 8・9・字牌から始まる順子は無い,
- 各牌の合計枚数は4を超えてはならない.
次の「定義3」および「定義4」によって,これら麻雀のルールに違反する手牌に対応する分解要素の列を排除する.
定義3(分解要素列集合の結合)
分解要素列集合 $\mathbf{D} \subset D^n$ および分解要素 $d \in D$ に対して,二項演算 $\mathbf{D} \circ d$ を $\mathbf{D} \circ d \equiv \lbrace \mathbf{d} \cdot d \mid \mathbf{d} \in \mathbf{D} \rbrace$ と定義する.
定義4(標準和了形分解接頭辞)
標準和了形接頭辞 $\mathbf{W}'_{i, m, p, a, b} \subset D^i$ $(i, m, p, a, b \in \mathbb{N})$ を以下で定義する:
- $\mathbf{W}'_{0, 0, 0, 0, 0} \equiv \lbrace () \rbrace$.
- 以下のいずれかの条件が満たされるならば $\mathbf{W}'_{i, m, p, a, b} \equiv \emptyset$ とする:
- $i < 0$ または $i > 34$,
- $m < 0$ または $m > 4$,
- $p < 0$ または $p > 1$,
- $a < 0$ または $a > 4$,
- $b < 0$ または $b > 4$,
- $i \in \lbrace 0, 8, 17, 26, 27, 28, 29, 30, 31, 32, 33 \rbrace$ かつ $a \neq 0$,もしくは
- $i \in \lbrace 0, 7, 8, 16, 17, 25, 26, 27, 28, 29, 30, 31, 32, 33 \rbrace$ かつ $b \neq 0$.
- 上記以外の場合,
- $\mathbf{W}'_{i + 1, m, p, a, 0} \equiv \text{(以下の全ての集合の和)}$:
- $\bigcup_{t = 0, 1, 2, 3, 4} \mathbf{W}'_{i, m, p, t, a} \circ d^{(0)}$
- $\bigcup_{t = 0, 1, 2} \mathbf{W}'_{i, m, p - 1, t, a} \circ d^{(1)}$
- $\bigcup_{t = 0, 1} \mathbf{W}'_{i, m - 1, p - 1, t, a} \circ d^{(2)}$
- $\mathbf{W}'_{i + 1, m, p, a, 1} \equiv \text{(以下の全ての集合の和)}$:
- $\bigcup_{t = 0, 1, 2, 3} \mathbf{W}'_{i, m - 1, p, t, a - 1} \circ d^{(3)}$
- $\bigcup_{t = 0, 1} \mathbf{W}'_{i, m - 1, p - 1, t, a - 1} \circ d^{(4)}$
- $\mathbf{W}'_{i, m - 2, p, t, a - 1} \circ d^{(5)}$
- $\mathbf{W}'_{i + 1, m, p, a, 2} \equiv \text{(以下の全ての集合の和)}$:
- $\bigcup_{t = 0, 1, 2} \mathbf{W}'_{i, m - 2, p, t, a - 2} \circ d^{(6)}$
- $\mathbf{W}'_{i, m - 2, p - 1, t, a - 2} \circ d^{(7)}$
- $\mathbf{W}'_ {i + 1, m, p, a, 3} \equiv \bigcup_ {t = 0, 1} \mathbf{W}'_ {i, m - 3, p, t, a - 3} \circ d^{(8)}$
- $\mathbf{W}'_ {i + 1, m, p, a, 4} \equiv \mathbf{W}'_ {i, m - 4, p, 0, a - 4} \circ d^{(9)}$
- $\mathbf{W}'_{i + 1, m, p, a, 0} \equiv \text{(以下の全ての集合の和)}$:
定義5(m-面子 p-雀頭標準和了形分解集合)
$m \in \lbrace 0, 1, 2, 3, 4 \rbrace$ および $p \in \lbrace 0, 1 \rbrace$ に対して,m-面子 p-雀頭標準和了形分解集合 $\mathbf{W}'_ {m, p} \subset D^{34}$ を $\mathbf{W}'_ {m, p} \equiv \mathbf{W}'_ {34, m, p, 0, 0}$ で定義する.
定義6(手牌関数)
34個の分解要素の列 $\mathbf{d} = (d_0, d_1, \cdots, d_{33}) \in D^{34}$ に対して, 手牌関数 $f: D^{34} \to \mathbb{N}^{34}$ を $f(\mathbf{d}) \equiv (h_0, h_1, \cdots, h_{33})$ で定義する.ここで:
- $i \in \lbrace 0, 9, 18, 27, 28, 29, 30, 31, 32, 33 \rbrace$ ならば $h_i \equiv d_{i, 0} + 3 d_{i, 1} + 2 d_{i, 2}$,
- $i \in \lbrace 1, 10, 19 \rbrace$ ならば $h_i \equiv d_{i - 1, 0} + d_{i, 0} + 3 d_{i, 1} + 2 d_{i, 2}$,
- 上記以外の場合, $h_i \equiv d_{i - 2, 0} + d_{i - 1, 0} + d_{i, 0} + 3 d_{i, 1} + 2 d_{i, 2}$.
なお,上記において $d_i = (d_{i, 0}, d_{i, 1}, d_{i, 2})$ とする.
定義7(m-面子 p-雀頭標準和了形集合)
$m \in \lbrace 0, 1, 2, 3, 4 \rbrace$ および $p \in \lbrace 0, 1 \rbrace$ に対して,m-面子 p-雀頭標準和了形集合 $\mathbf{W}_ {m, p} \subset \mathbb{N}^{34}$ を $\mathbf{W}_ {m, p} \equiv f(\mathbf{W}'_ {m, p}) = \lbrace f(\mathbf{w}) \mid \mathbf{w} \in \mathbf{W}'_ {m, p} \rbrace$ で定義する.
定義8(手牌距離)
2つの手牌 $\mathbf{g} = (g_0, g_1, \dots, g_{33}) \in \mathbb{N}^{34}$ および $\mathbf{h} = (h_0, h_1, \dots, h_{33}) \in \mathbb{N}^{34}$ に対して, $\mathbf{h}$ から $\mathbf{g}$ への距離 $\delta(\mathbf{g}, \mathbf{h}): \mathbb{N}^{34} \times \mathbb{N}^{34} \to \mathbb{N}$ を以下のように定義する:
\delta(\mathbf{g}, \mathbf{h}) \equiv \sum_{i = 0}^{33} \max(g_i - h_i, 0) .
定義9(m-面子 1-雀頭置換数)
手牌 $\mathbf{h} = (h_0, h_1, \dots, h_{33}) \in \mathbb{N}^{34}$ と $m \in \lbrace 0, 1, 2, 3, 4 \rbrace$ に対して, $\mathbf{h}$ のm-面子 1-雀頭置換数 $r_m(\mathbf{h})$ を以下で定義する:
r_m(\mathbf{h}) \equiv \min_{\mathbf{w} \in \mathbf{W}_{m, 1}} \delta(\mathbf{w}, \mathbf{h}) .
定義10(m-面子 1-雀頭向聴数)
手牌 $\mathbf{h} = (h_0, h_1, \dots, h_{33}) \in \mathbb{N}^{34}$ と $m \in \lbrace 0, 1, 2, 3, 4 \rbrace$ に対して,$\mathbf{h}$ のm-面子 1-雀頭向聴数 $s_m(\mathbf{h})$ を以下で定義する:
s_m(\mathbf{h}) \equiv r_m(\mathbf{h}) - 1