如何在python中进行包含阶乘的大量计算?

时间:2019-04-03 14:24:49

标签: python numpy math

我遇到了必须进行以下计算的问题:

N = 250
H = 140
bayes_factor = factorial(H) * factorial(N-H) / factorial(N+1) / (0.5**N)

如何解决问题: 我尝试过:

from scipy.special import factorial
bayes_factor = (factorial(H) * factorial(N-H)) / factorial(N+1) / (0.5**N)

给出无限。

更新:分母阶乘(H + 1)中固定的错字应为阶乘(N + 1)。

注意:答案应该在0.5左右,因为硬币可能是无偏的。

答案是值得的。

2 个答案:

答案 0 :(得分:1)

最好使用scipy.special函数loggamma进行对数运算。伽玛函数满意文件

n! = gamma( n+1)

因此,您给出的表达式可以计算为

exp( loggamma( H+1) + loggamma( N-H+1) - loggamma( N+2) - N*log(0.5))

使用对数的原因是中间项(例如阶乘(N + 1))是如此之大,以至于会翻倍。

答案 1 :(得分:1)

要获得确切的解决方案,您可以使用this post中提到的阶乘的以下实现:

def range_prod(lo,hi):
    if lo+1 < hi:
        mid = (hi+lo)//2
        return range_prod(lo,mid) * range_prod(mid+1,hi)
    if lo == hi:
        return lo
    return lo*hi

def tree_factorial(n):
    if n < 2:
        return 1
    return range_prod(1,n)

因此,您的程序将是:

N = 250
H = 140
bayes_factor = tree_factorial(H) * tree_factorial(N-H) / tree_factorial(N+1) / (0.5**N)

您可以运行代码here。结果是:

Python 3.6.1 (default, Dec 2015, 13:05:11)
[GCC 4.8.2] on linux
bayes_factor: 0.476723359160760
running time: 0.000546