Я сравнивал результат моего следующего вычисления Python с Mathematica: https://www.wolframalpha.com/input?i=sum+%28500+choose+r+%29%28-1%29%5Er+%2F%28r%21%29+%2C+r%3D0+to+500
import numpy as np
from decimal import *
import scipy.special
from scipy.special import factorial
getcontext().prec = 30
i = 500
sum(np.array([scipy.special.comb(Decimal(i), (r), exact=True)*pow(-1, r)/Decimal(factorial(r, exact=False)) for r in range(i+1)]))
Оба вычисления дают почти одинаковое значение до i = 400
, но после этого не сходятся, хотя я установил произвольную точность в своем коде Python через модуль decimal
. Расчет с помощью Mathematica кажется правильным. Могу я узнать, как мы можем получить такой же результат в Python, как и в Mathematica, для большего i
?
Проблема в том, что у вас в факториале точное значение=ложь.
>>> import numpy as np
>>> from decimal import *
>>> import scipy.special
>>> from scipy.special import factorial
>>> getcontext().prec = 30
>>>
>>> i = 500
>>> sum(np.array([scipy.special.comb(Decimal(i), (r), exact=True)*pow(-1, r)/Decimal(factorial(r, exact=False)) for r in range(i+1)]))
Decimal('-7.13859062099388393889008217957')
>>> sum(np.array([scipy.special.comb(Decimal(i), (r), exact=True)*pow(-1, r)/Decimal(factorial(r, exact=True)) for r in range(i+1)]))
Decimal('0.196589352363439561009074161963')
Обратите внимание, что факториал пересчитывается с нуля в цикле, что не очень эффективно. вы можете вычислить его самостоятельно или даже предварительно вычислить, создав список перед операцией. В этом случае это должно быть примерно в 10-20 раз быстрее. Почему вы используете
np.array
здесь?sum
Python уже хорошо справляется со своей задачей. Использование массива Numpy не сделает это быстрее (на самом деле это часто наоборот в таком случае) и здесь не удобнее.