Closed9

スターリング近似を用いた多項係数評価(その2)

pokapoka-jigokupokapoka-jigoku

課題

(その1)では、k=0はカウントしなかったが、やっぱりk=0も入れ込みたいケースがあるので、それに対応したい。

pokapoka-jigokupokapoka-jigoku

対応策。

w(0)=1, \forall x \ge 1:~w(x) = x なる関数wを用意する。たとえば、

w(x) = \max(1, x)

を導入して、

\ln x! \approx w(x) \ln w(x) - w(x) + \frac{1}{2} \ln 2\pi w(x) + \frac{1}{12w(x)}

をスターリング近似式の亜種として採用する。

pokapoka-jigokupokapoka-jigoku

表記の簡単のため、k_i' = w(k_i) と書く。

Factorial trickに注意して計算を進めると:

https://zenn.dev/pokapoka_jigoku/scraps/ec44cdcff0ec1f

\ln W = - N \sum_i q_i \ln q_i - \frac{r-1}{2} \ln 2\pi N + r_0 + \frac{1}{2} Q_1' + \frac{1}{12N} Q_2'

ここで、r_0 はゼロをとるkの個数であり:

Q_1' = - \sum_i \ln q_i'
Q_2' = 1 - \sum_i \frac{1}{q_i'}

である。ただし、

q_i' = \frac{k'_i}{N} = \frac{k_i}{N} + \delta_{k_i, 0} \frac{1}{N} = q_i + \frac{\delta_{k_i, 0}}{N}

\delta はクロネッカーのデルタ。以降、簡単のために \delta_i := \delta_{k_i, 0} と書く。

pokapoka-jigokupokapoka-jigoku

前回の記事を見比べると、

  • r_0
  • Q_1',~Q_2'

が具体的な変更点になっている。前回と引き続き、非ゼロなkのインデックス集合:

\Lambda = \{i~|~ k_i \ge 1\}

を使うと、

Q_1' = - \sum_{i \in \Lambda} \ln q_i - \sum_{i \notin \Lambda} \ln \frac{1}{N} = Q_1 + r_0 \ln N

および、

Q_2' = 1 - \sum_{i \in \Lambda} \frac{1}{q_i} - \sum_{i \notin \Lambda} N = Q2 - r_0 N
pokapoka-jigokupokapoka-jigoku

よって、非ゼロ値に制限したときと比べて、いくつかの項が発生して:

\begin{split} \ln W &= - N\sum_i^r q_i \ln q_i - \frac{r-1}{2} \ln 2\pi N + \frac{1}{2} Q_1 + \frac{1}{12N} Q_2 + r_0 \left( \frac{1}{2} \ln N + \frac{11}{12} \right) \end{split}

が最終的な答えになる。

pokapoka-jigokupokapoka-jigoku

さて、少し睨むと

\left| \frac{1}{2} \ln 2\pi - \frac{11}{12} \right| \le 0.002272

であることに気づいて、

\begin{split} \ln W &= - N\sum_i^r q_i \ln q_i - \frac{r_p - 1}{2} \ln 2\pi N + \frac{1}{2} Q_1 + \frac{1}{12N} Q_2 - \frac{r_0}{2} \ln {2 \pi e^{- \frac{11}{6} }} \end{split}

と、前回の議論の結果にゼロ値に対する小さな補正項がつく結果にまとめることができる。

ここで、非ゼロなkの個数をr_p := r - r_0と定義した。また、

\ln {2 \pi e^{- \frac{11}{6} }} \approx 0.00454373307601

であり、求める精度によっては落としてもよい。

このスクラップは2023/05/28にクローズされました