1

私は初心者で、Pythonで次の階乗級数をコーディングして、有限範囲内の級数の最初の一致する数を計算しようとしています。kd×d×(d-1)×⋯×(d-k + 1)d×d×⋯d= k(d-1)!dk(d-k)!したがって、一致に必要な数の期待値は、∑k = 1d(k + 1)k(d-1)!dk(d-k)!です。

数値のサイズが原因で、エラーが発生します。OverflowError:long intが大きすぎてfloatに変換できないため、ログを使用していますが、それでもエラーが発生します。誰かがこれについて良い考えを持っているかどうか疑問に思います。

 m = 365
  q = 1
  a=[]
  for x in range(q,m):
    #y = y + x*(1/365)
    #####y = y + (factorial(x)/(factorial(m-x)*(exponent(m,x))))
    a.append((log((factorial(m))/exponent(m,x)))*log((q+x)/m))
    #y = [(m-x)*factorial(m-x)/m]
    #print ("x: ",x,"   y: ",y)
  #return "a:",a,"  product-sum:",[a*a for a in a]
  return sum(a)

申し訳ありませんが、上記の式が明確ではありません。これが私が得ようとしているものです:http: //en.wikipedia.org/wiki/Birthday_problem#Average_number_of_people

4

1 に答える 1

2

編集:ちょうど気づいた-私はログがそもそもここであなたをあまり助けないだろうと思います:あなたは合計を計算しようとしています、そしてログは合計とあまり友好的ではありません(それらは製品に適しています)。

あなたが与えるリンクは、あなたが正しい順序で計算するならば、大きな数を避けるべきである別のアプローチ(あなたが引用したものの直後の式)を示唆しています。ただし、丸め誤差の累積が結果に影響を与える可能性があります。コード内

m = 365 
ans = 0
for x in range(0,m-1):
  tmp = 1
  for y in range(0,x):
    tmp *= (M-y)/M
  ans += tmp
return ans

とは言うものの、与えられたような漸近式を使用することは、おそらくこれを計算するためのより良い方法です。

于 2012-10-13T04:57:05.460 に答える