计算具有大二项式系数的总和

Posted

技术标签:

【中文标题】计算具有大二项式系数的总和【英文标题】:Calculate sums with large binomial coefficients 【发布时间】:2014-05-22 20:17:35 【问题描述】:

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

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】:

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

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

例如:

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

此外,您可以尝试使用 scipy 以外的其他内容:gmpy here 和 here。

【讨论】:

【参考方案2】:

嗯,binom 很早就结束了:

from scipy.special import binom

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

您要执行的计算究竟是什么?


这是一个重新制定的版本,它稍微改变了一些值;我们可以找到每个 n 的二项式级数的连续值,而不是每次都从头开始重新计算,并且我已经将平方的幂推到了单个操作中。

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)

【讨论】:

从数学上讲,这正是我的问题。这些值最终应趋于零。看来我需要一些方法来避免显式计算这些大量的二项式系数。

以上是关于计算具有大二项式系数的总和的主要内容,如果未能解决你的问题,请参考以下文章

使用pascals三角形打印二项式系数

如何找到固定 n 的前 r 二项式系数的总和?

二项式系数和公式

vijos - P1739计算系数 (多项式计算 + 杨辉三角形 + 高速幂)

使用动态规划计算二项式系数

以二进制计算二项式系数