使用 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
伙计们,我正在尝试使用 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