使用python计算长序列

时间:2015-03-31 11:25:39

标签: python python-3.x sequence

伙计们,我正在尝试使用python

来解决这个等式

Equation

我们需要找到的是一个值N,该等式给出的结果为2.718。 到目前为止我所做的有小数问题的是:

import math
from decimal import Decimal
import scipy.misc

limit = 2.718
ris = 0
n = 1
while ris <= limit:
   ris = Decimal(n / math.pow(scipy.misc.factorial(n), 1/n))
   n= n + 1

   print(n,ris)

主要的问题是,在某一点上它开始只是打印零,我不知道它是否仍在计算但不再显示结果或它已经崩溃。

有什么想法解决这个问题吗?

2 个答案:

答案 0 :(得分:3)

这个解决方案使用的是幂运算符**,它比pow更快,因为它没有函数加载和调用的开销。

import math
from decimal import Decimal

limit = Decimal(2.718)

result = 0
n = Decimal(1)
one = Decimal(1)
n_factor = Decimal(n)

while result <= limit:
    result = n / Decimal(n_factor ** (one/n))
    n += 1
    n_factor *= n
    # print (n, result) # uncomment to see intermediate results

print ('Final', n, result)

注意:它不是最佳的,但至少它会计算N

注意#2:请参阅下面的评论,了解有关'scipy'和Zeros的问题的解释

答案 1 :(得分:3)

来自Tim Rijavec和同义词的有趣答案。这是一些进一步的想法。

正如同义词所示,问题是,n = 171 scipy.misc.factorial返回array(inf)。这是因为当您在没有其他参数的情况下调用此函数时,它会返回一个浮点数。您可以将其设置为返回精确的整数值:

>>> scipy.misc.factorial(171)
array(inf)
>>> scipy.misc.factorial(171, exact = True)
1241018070217667823424840524103103992616605577501693185388951803611996075221691752992751978120487585576464959501670387052809889858690710767331242032218484364310473577889968548278290754541561964852153468318044293239598173696899657235903947616152278558180061176365108428800000000000000000000000000000000000000000
>>> 

因此,如果您如此重写程序,则不会出现错误:

from decimal import Decimal
import scipy.misc

limit = Decimal(2.718)

ris = 0
n = 1
one = Decimal(1)

while ris <= limit:
   ris = n / Decimal(scipy.misc.factorial(n, exact= True) ** (one/n))
   n= n + 1

   print(n,ris)

但由于某种原因,它效率低下并且需要相当长的时间才能完成。在这种情况下,你可能想要缓解条件:

while abs(ris - limit) > 0.025:
   ris = n / Decimal(scipy.misc.factorial(n, exact= True) ** (one/n))
   n= n + 1