解説
方針
x1+x2+⋯+xN=Kを満たす平面で[0,1]Nの超立方体をぶった切ったとき原点を含む方の体積は[0,1]から一様ランダムにN個実数を選んだときの総和がK以下となる確率と等しいので、以下その確率を計算する。
確率変数の定義
[0,1]上の一様分布に従うNこの独立な確率変数をxi(1≤i≤N)とし、総和をSNとする。各変数の確率密度関数f(x)は0≤x≤1となる関数、すなわちf(x)=U(x)−U(x−1)である。
N=iのときの確率密度関数をfiとする。
畳み込み
N=2のとき確率密度関数は、足してxになるように畳み込み、以下のようになる。
f2(x)=∫−∞∞f1(t)f1(x−t)dt
N=3ではf2(x)とf1(x)の畳み込みである。N>3でも同様。
ここで、
L[fn(x)](s)=L[fn−1(x)∗f1(x)](s)=L[fn−1(x)](s)L[f1(x)](s)
となり再帰的に適用すれば
L[fn(x)](s)=(L[f1(x)](s))N=(s1−e−s)N=sN(1−e−s)N=sN∑k=0N(−1)k(kN)e−ks
となる。これを逆ラプラス変換すると、
L−1[sN∑k=0N(−1)k(kN)e−ks](x)=(N−1)!1k=0∑N(−1)k(kN)(x−k)N−1U(x−k)
求めるものはこれの[0,K]上定積分の値なので、
==∫0K(N−1)!1k=0∑N(−1)k(kN)(x−k)N−1U(x−k)dx[N!1k=0∑K(−1)k(kN)(x−k)NU(x−k)]0KN!1k=0∑K(−1)k(kN)(K−k)N
あとは適切に実装すればよいです。全体としてO(NlogN)で解けて十分高速です。