如何计算具有较大中间值的总和 [英] How to compute sum with large intermediate values

查看:71
本文介绍了如何计算具有较大中间值的总和的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想计算

用于 n m ,两个值都是不超过1000的整数.最终结果是一个不大于 n 的数字,但是中间值对于python来说太大了.您该如何解决?

for nm 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

推荐答案

问题似乎出在scipy的

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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆