如何计算具有较大中间值的总和 [英] How to compute sum with large intermediate values
问题描述
我想计算
用于 n ≥ m ,两个值都是不超过1000的整数.最终结果是一个不大于 n 的数字,但是中间值对于python来说太大了.您该如何解决?
for n ≥ m with both values being integers ranging up to 1000. The end result is a number not much bigger than n but the intermediate values are much too large for python to cope with. How can you solve this?
我对函数的定义如下.
from scipy.misc import comb
def S(n,m):
return n+m-sum([k**(k - 1)*comb(n, k)*(n - k)**(n + m - k)/n**(n + m - 1) for k in xrange(1,n+1)])
例如,我为n=m=100
遇到的错误是
The error I get for n=m=100
, for example, is
RuntimeWarning: overflow encountered in multiply
return n+m-sum([k**(k - 1)*comb(n, k)*(n - k)**(n + m - k)/n**(n + m - 1) for k in xrange(1,n+1)])
[...]
OverflowError: long int too large to convert to float
推荐答案
Seems like the problem is in scipy's comb
definition. When I supply a homemade version, it works fine:
import math
def choose(n,k):
return math.factorial(n) / (math.factorial(k)*math.factorial(n-k))
comb = choose
def S(n,m):
return n+m-sum([k**(k - 1)*comb(n, k)*(n - k)**(n + m - k)/n**(n + m - 1) for k in xrange(1,n+1)])
print S(1000,1000)
结果(约1.5秒):
1844
作为编写自己的comb
的替代方法,请尝试将True
传递给comb
的可选exact
参数.似乎您会以其他方式返回浮动,这可能会使事情变得混乱.
As an alternative to writing your own comb
, try passing True
in for the optional exact
argument to comb
. Seems like you'll get a float back otherwise, which may mess things up.
这篇关于如何计算具有较大中间值的总和的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!