シチャーマンのサイコロ(Sicherman Dice)とは、通常のサイコロ2個の合計の確率分布と等価になるような、通常とは異なる目のサイコロのこと。結論から言うと、 \(1,2,2,3,3,4\) と \(1,3,4,5,6,8\) のサイコロを振った時の合計の確率分布が、通常のサイコロ \(1,2,3,4,5,6\) の2つを振った時の合計の確率分と一致する。
この事実は簡単に検算できる。

左が通常のサイコロ、右がシチャーマンのサイコロ1
左右で、合計値の分布が一致している
Wikipediaによると、(6面体に限らず)サイコロの目を変えても合計値の確率分が変わらないような特殊なサイコロをクレイジーダイスと呼ぶらしい2。シチャーマンのサイコロはクレイジーダイスのうち、6面サイコロx2、かつ目が正の自然数のケース、と言える。
なお、6面x2かつ正の数、という条件を満たす目は、シチャーマンのサイコロの目しか存在しない。多項式を因数分解するやり方による唯一性の証明がWikipediaに載っている。
通常のサイコロx2の場合は合計値がたかだか2〜12と言うことは、1〜11の数字から重複ありで6個選んだサイコロを考えれば良い。重複ありの組み合わせの公式 \(H\) より8008。
$$ \begin{aligned} H(n,k) &= \binom{n+k-1}{k} = \frac{(n+k-1)!}{k!(n-1)!} \\ H(11,6) &= \binom{11+6-1}{6} = 8008 \end{aligned} $$
せっかくなので全列挙で唯一性を確認する。
- 通常のサイコロ1個の生成多項式を \(P(x)=x+x^2+x^3+x^4+x^5+x^6\) とおく。2個のサイコロの和の分布はその畳み込みであり、\(P(x)^2\) に対応する。
- サイコロ A の候補として、面が1〜11の整数から重複を許して6個選ぶ多重組合せを
combinations_with_replacementで列挙する - 各候補 \(A(x)\) に対して多項式の整数除算を行い、 \(B(x)=P(x)^2 / A(x)\) が割り切れるか(余りが0になるか)を調べる。割り算で余りが生じる場合は不適合
- 商 \(B(x)\) の係数が全て非負整数で、定数項が0(=面は1以上)かつ係数の総和が6(=6面)であれば有効なサイコロと判定
- 条件を満たす候補を全て列挙
solutions = set()
checked = 0
for combo in combinations_with_replacement(range(1, 12), 6):
checked += 1
A_poly = faces_to_poly(combo, max_degree=12) # 多項式係数のリスト
Q = poly_div_exact(P2, A_poly) # 整数多項式の厳密除算
# 割り切れた画のチェック
if Q is None:
continue
if Q[0] != 0:
continue
if np.any(Q < 0):
continue
if int(Q.sum()) != 6:
continue
# 見つかった結果格納
B_faces = []
for deg, coeff in enumerate(Q):
if coeff:
B_faces.extend([deg] * int(coeff))
A_sorted = tuple(sorted(combo))
B_sorted = tuple(sorted(B_faces))
pair = tuple(sorted([A_sorted, B_sorted]))
solutions.add(pair)
# Output
for sol in sorted(solutions):
A, B = sol
print("A:", A)
print("B:", B)
print("-" * 30)
結果
A: (1, 2, 2, 3, 3, 4)
B: (1, 3, 4, 5, 6, 8)
------------------------------
A: (1, 2, 3, 4, 5, 6)
B: (1, 2, 3, 4, 5, 6)
------------------------------
フルスクリプトは以下