2014-04-09 21 views
0

我想计算以下总和。问题是二项系数太大,我认为它失败了。计算大二项式系数的总和

from __future__ import division 
import numpy as np 
from scipy.special import binom 
print [sum(binom(n,2*k)*np.sqrt(np.pi*k)**(-n/10) for k in xrange(1,int(n/2)+1)) for n in xrange(100000)] 

有没有某种方法来近似答案?

回答

1

好,binom冠上很早就:

from scipy.special import binom 

binom(1019, 509) # => 1.40313388415e+305 
binom(1020, 510) # => inf 

到底是什么你正在尝试进行计算?


这是一个重新配置的版本,它将值稍微移动一下;我们可以找到每个n的二项式系列的连续值,而不是每次都从头开始重新计算,并且我已经将sqrt的功率推入单个操作。

from math import pi 

for n in xrange(100000): 
    total = 0. 

    binom = 1 
    binom_mul = n 
    binom_div = 1 

    power = -0.05 * n 
    for k in xrange(1, n // 2 + 1): 
     binom = binom * binom_mul/binom_div 
     binom_mul -= 1 
     binom_div += 1 

     total += binom * (pi * k) ** power 

    print(total) 
+0

从数学上讲,这正是我在问题中的含义。这些值最终应该趋于零。看起来我需要一些方法来避免明确计算这些大量的二项式系数。 – felix

2

你面临的问题是,scipy.special.binom近似的答案。您可以尝试使用scipy.misc.comb与可选参数exact=True精确计算它们。

exact=False它使用伽马函数进行快速计算,但您可以强制它使用exact=True明确计算系数。在这种情况下,它会返回一个python long

例如:

In [1]: from scipy.misc import comb 
In [2]: comb(1100, 600, exact=1) 
Out[2]: 3460566959226705345639127495806232085745599377428662585566293887742644983083368677353972462238094509711079840182716572056521046152741092473183810039372681921994584724384022883591903620756613168264181145704714086085028150718406438428295606240034677372942820551517227766024953527980780035209056864110017856973033878393954438656320L 

此外,您可以尝试使用除scipy以外的东西:gmpy herehere