使用 python 计算长序列

Use python to compute long sequence

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

来解这个方程

我们需要找到一个值 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)

主要问题是在某个时候它开始只是打印 Zeros,我不知道它是否仍在计算但不再显示结果或者它已经崩溃了。

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

此解决方案使用幂运算符 **,它比 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

的问题的解释

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

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

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