Гамма функция на python

def fac(x,n):
    i=1
    s=1
    while i<=n:
        s=s*((i+1)/i)**x*i/(x+i)
        i=i+1
    return s

print(fac(5,200000))#->119.99400022498341

Это код гамма функции. Работает вроде правильно, но сходимость медленная.


Ответы (1 шт):

Автор решения: CrazyElf

Просто ускорить код примерно в 40 раз можно с помощью Numba (ускорение и распараллеливание простых вычислений):

from numba import njit

@njit
def fac(x,n):
    s=1
    for i in range(1, n+1):
        s=s*((i+1)/i)**x*i/(x+i)
    return s

print(fac(5,100_000_000))
# 119.99998821343507
# 1 секунда

А дальше уже нужно в сторону математики смотреть - к чему эта формула сходится, кардинально тут улучшать в расчётах нечего чисто программными методами, потому что на каждом шаге меняется i и уменьшить вычисления между шагами алгоритма не получится. Кэширование тут тоже не поможет никак. Только математика.

→ Ссылка