計算したい
n
までの値を1000000
可能な限り正確に。ここにいくつかのサンプルコードがあります。
from __future__ import division
from scipy.misc import comb
def M(n):
return sum(comb(n,k,exact=True)*(1/n)*(1-k/n)**(2*n-k)*(k/n)**(k-1) for k in xrange(1,n+1))
for i in xrange(1,1000000,100):
print i,M(i)
最初の問題はOverflowError: long int too large to convert
、n = 1101
. これは、comb(n,k,exact=True)
が大きすぎて float に変換できないためです。ただし、最終結果は常に 前後の数値になり0.159
ます。
大きな中間値を持つ合計を計算する方法で関連する質問をしましたが、この質問は主に 3 つの理由で異なります。
- 計算したい数式が異なるため、さまざまな問題が発生します。
- 私が示した例に見られるように、exact=True を使用するために以前に提案された解決策は、ここでは役に立ちません。浮動小数点除算を実行する必要があるため、comm の独自の実装をコーディングしてもうまくいきません。
- 以前よりもはるかに大きな値の答えを計算する必要があるため、新しい問題が発生します。何らかの巧妙な方法で合計をコーディングしないと、それはできないと思います。
クラッシュしない解決策は、使用することです
from fractions import Fraction
def M2(n):
return sum(comb(n,k,exact=True)*Fraction(1,n)*(1-Fraction(k,n))**(2*n-k)*Fraction(k,n)**(k-1) for k in xrange(1,n+1))
for i in xrange(1,1000000,100):
print i, M2(i)*1.0
残念ながら、現在は非常に遅いためn=1101
、妥当な時間内に回答が得られません。
したがって、2 番目の問題は、大きなn
.