すごろくでゴールするために必要なサイコロを振る回数の平均値
月に一度の土曜日の午後、プログラミング言語Perlの初学者向け勉強会 Perl入学式 のサポーター(運営)をしているのですが、その勉強会の後にピザを囲んで受講生やサポーターと語らう懇親会があり、そこで私がサポーターに思いつきでプログラミングの問題を出すことがあります。
2019年7月の回では、以下のようなすごろくの問題を出しました。
- スタートを0マス目とすると、ゴールが10マス目になる一本道のすごろくがある
- 3 6 9 のマスに止まるとスタートに戻される
- ゴール手前でゴールを超えるような大きな目が出てもゴール可能(8マス目にいるときに2の目だけでなく、3以上の目でもゴール可能ということ)
- サイコロは通常の6の目のものを使用する
- この時、平均的に何回サイコロを振るとゴールできるか
期待値を求める問題です。Perl入学式の懇親会で出題するだけあって、Perl でプログラミングをすることで探ってもらうことを期待しています。マシンパワーにモノを言わせて何百万回もこのすごろくゲームを試行させて、各ゲームでサイコロを振った回数の平均値を求めれば正解に近い値が得られるというもの。数学用語で言えば大数の法則です。プログラミング的には、シミュレーションというものを体感しつつ、現状知っているプログラミングの知識でこのすごろくをどうモデル化するかという部分に着目しています。
ブログで手練のサポーターの方々に回答して頂きました。
だいたい「6.35回」といった回答。問題を思いついた直後に手元で書いた私の雑プログラムも6.35回あたりだったので、この数値がだいたいの平均値なのでしょう。
いったんはコンピュータが出した「約6.35回」に満足。ただ、次の日(日曜日)にふと「これの厳密な値は求まるだろうか?」と思い立ち、自分で考えたこの問題に取り組んでみることにしました。
7月中は、式の立て方がまずかったり、計算ミスを繰り返したり、そもそも方針が間違っていたりとなかなか求まらず。公私共に多忙だった8月の合間の時間に気分転換に計算を繰り返して、ようやくそれらしい回答を得ることができたのでご紹介します。
どのように解けばいいか考える
このすごろく、サイコロ1投ではゴールできないことはすぐにわかります。また、サイコロ2投でゴールするためには、3 6 9 のマスが罠であることを考えて、4→6、5→5、5→6 の3パターンの目の出方でしかゴールできないこともわかります。つまり、サイコロ1投でゴールできる確率は であり、サイコロ2投でゴールできる確率は です。
求めたい「厳密な平均値」とは期待値のことです。ちょうど 投でゴールする確率を とすると、期待値の定義から の和を求めれば良さそうです。ただ、罠のマスにひたすら止まり続けていつまで経ってもゴールできない最強レベルに悪運の強い人の試行も当然考慮に入れる必要があり、厳密に求めるには無限和になります。
求めたい期待値を とすると
となります。また、ちょうど 投でゴールするパターンの総数を とすると、 は
と表されます。上述の通り、、 です。最終的に を求めることになりそうなので
と書いておくことにしましょう。
さて、 はどう求めると良さそうでしょうか。
上記で 4→5 (4の目が出た後の5の目を出す)といった順番を考えました。これを発展させて、 1〜6 の数字を 個使った重複順列を考えた上で左側区間の和が3の倍数になったらその部分を除外……といったことを考えましたが、これは計算が複雑になって撤退。
いくつか解法を考えてみたのですが、たくさんの漸化式を立てて地道に解決することにしました。
漸化式を立てる
ちょうど 投でゴールにいる総数だけでなく、 の目にいる総数も合わせて定義してみましょう。
マスの数が多いので記号に悩みますが、ちょうど 投で の目にいる総数を としましょう。なお、スタートのマスは です。
ちなみに、上付きの は冪乗の意味は無く、2つ目の添字でしかありません。
(個人的な好みではあるのですが、添え字が2つあるときに とするのは少々見づらかったりややこしさを感じるもので…。線形代数での行列の要素のようなイディオムならいいのですが。)
このとき、 、 つまりサイコロをまだ一度も振っていない時は必ずスタートのマスいると考えると、 かつ が言えます。また、スタートに戻される罠の 3 6 9 のマスに止まり続けることはできないので も言えます(その分 が増えます)。
少し考えると、 投のときのパターンの数から 投のときのパターンの数が出てくることが見えてきます。実際に漸化式を立ててみましょう。
この式のざっくりとした読み方ですが、最初の の式は、0〜5のマスにいる場合は、次に罠のマスに止まるパターンが2通り、7と8のマスにいる場合は9のマス1通りの罠に落ちるパターンがあるということです。また最後の の式は、次に8の目に行くには少なくとも 2 4 5 7 の目に止まっている必要があり、現在の 2 4 5 7 の目に止まっている総数がそのまま次の 8 の目に行く総数だということです。
同様に考察すると、ちょうど 投でゴールにいる総数を goal の頭文字を取って とすると、 は を使って以下のように書くことができることがわかります。
母関数の閉じた形を求める
上記のように漸化式を求めましたが、出てきたのは7元連立漸化式でした( を加えれば8元連立漸化式?)。これの一般項は求まるのでしょうか。少々絶望的な気がします。
連立方程式を解くときに用いる掃き出し法を使う方法もあるでしょうが、今回は母関数を使ってみることにしましょう。
母関数とは、求めたい数列 を の係数に持った形式的冪級数のことです。
なお形式的冪級数ということもあり、今回は収束性についての議論を省略していますが、実際の値を代入している箇所では収束半径内の値を代入しています。
例えば定数数列 の場合、母関数 は
と冪級数ではない形で表現することができます。このような冪級数ではない式のことを「閉じた式」と呼ぶことにしましょう。
さて、前節の の母関数を と書くことにします。つまり
です。
このとき の を と多項式の積の形で表してみましょう。
まずは 。
次は 。
次は 。
次は 。
次は 。
そして 。
これで について を と多項式の積の形の閉じた式で表すことができました。
そして は数列 の母関数ですが
という関係式から、以下のようにして を有理数関数として確定させることができます。
ここからは骨が折れる計算になりますが、
となり、両辺整理すると
ゆえに
となります。ちなみに突然現れた定数項 1 は「サイコロを一度も振らない時は0の目にいるという1通りのみ」という です。上手くできていますね。
の は、 と多項式の積なので、こちらも有理数関数として求めることができました。
勢いに乗って、ちょうどサイコロ 投するときにゴールするパターンの総数 の母関数も求めてみましょう。同じ記号を採用しても混乱は無いと思うので、数列 の母関数は とします。つまり
です。前述の通り
なので
となり、 をくくりだすと
ゆえに
と書くことができます。
数列 の一般項を求めるのは……少々ではないくらい絶望的そう……。
期待値を求める
の一般項が求められないのに、期待値を求めることができるのでしょうか。
求めたい期待値 は
です。また に注意すれば
です。
両方とも無限和の似た形をしています。
少し考えると、母関数の方を微分すればよさそうだということに気づきました。
なので、 とすると
つまり
となります。
を使って求めることができます。ただ分子も分母も7次関数でかなりしんどいので、ここの計算は Wolfram|Alpha を使いました。
さて
を微分すると
となるので、 を代入すると
ゆえ、期待値 は
となります。
この値は 6.35172083621469227086...... という概算値を取ります。最初のプログラミングでのシミュレーションでの6.35回とほぼ同じですね。
おまけの考察:一般項は求められるのか?
期待値 が求められたので当初の目的は達成されたのですが、果たして の一般項は求められるのでしょうか。
は以下の母関数
の係数
でした。
母関数が有理数関数の場合、一般項を求めるには部分分数分解をして分母が の形と多項式 の積の項の和の形
に持ち込むことが常套手段のようです。こう変形することで等比級数の無限和の公式
より
と変形することで一つ一つの項は等比数列
に対応していることがわかり、母関数自体に対応する数列は色々な等比数列を足し合わせたような形になるでしょう。わかりやすい例としては、フィボナッチ数列の一般項を求める手順がこの良い題材となっています。フィボナッチ数列自体は3項間漸化式で分母が2次関数の有理数関数を部分分数分解することになります。
部分分数分解の手順を考察すると、まず分母の関数を因数分解する必要があります。そしてその因数分解は「その関数 = 0」の方程式の解を求めることであり、今回の場合は7次方程式の解をどう求めるかという問題に直結すると思います。
残念ながら7次方程式には解の公式はない(ガロア理論)ので、この方程式特有の解法が運よく見つかれば厳密な一般項への足がかりになるかもしれない、ということしか言えません。時間をかければ運良く見つかるのかと言われると、徒労に終わる可能性のほうが高そうに思えますし、その過程で得られるものも少ない気がします(計算の練習になったという効用はありそうですが、その時間があるなら代数学とガロア理論を勉強したほうが良さそうです)。
一般項を求めることは困難でしょうが、有理数関数 の分母の多項式に対応する7次方程式の7つの解を文字で置くことで部分分数分解を行うことはできそうです。なお、分母の多項式に対応する方程式に重解がないことの確認は必要ですが、それが結構難しい気がしています。
上記で触れなかったのですが、重解が存在する場合には等比級数の無限和の公式をそのまま適用することはできません。例えば二重解であれば
を適用する必要があるでしょう。この公式自体は、有限和を数列としたときのその階差数列を取ることでも導けますし、形式的に微分しても同じ結果を導くことができます。
上述の7つの解を文字で仮定した上で部分分数分解ができると、 をその文字を含んだ形で複数の等比数列の足し合わせのような形で書くことができそうです。それを元に期待値 を求めるため の形の和を求めようとすると、うまく仮定して置いた7つの解が相殺して相殺するのかなと想像しています。この和は、逆に上記で解説した の和を使うと良さそうです。ただ、一般項も未知数を含んだ不完全なもの、そして母関数のまま議論を進めれば前節までで解説したように求められることを考えると、わざわざ の一般項に固執して議論を進めるのは遠回りでしょう。