Я реализую арифметическую библиотеку произвольной точности в C ++, и я довольно сильно застрял при реализации гамма-функции.
Используя эквивалентности gamma(n) = gamma(n - 1) * n
а также gamma(n) = gamma(n + 1) / n
соответственно могу получить рациональное число r
В диапазоне (1; 2]
для всех реальных ценностей x
,
Однако я не знаю, как оценить gamma(r)
, Для приближения Ланцоша (https://en.wikipedia.org/wiki/Lanczos_approximation), Мне нужны предварительно вычисленные значения p, которые вычисляют факториал нецелого значения (?!) И не могут быть вычислены динамически, исходя из моих текущих знаний … Предварительные вычисления значений для p не будут иметь большого смысла при реализации библиотека произвольной точности.
Есть ли алгоритмы, которые вычисляют gamma(r)
в разумные сроки с произвольной точностью? Спасибо за вашу помощь.
Приближение Спужа похож на приближение Ланцоша, но, вероятно, проще использовать для произвольной точности, так как вы можете установить желаемую ошибку.
Приближение Ланцоша выглядит не так уж плохо. Что именно вы подозреваете?
Части кода, которые рассчитывают p
, C
(Чебышевские полиномы) и (a + 1/2)!
могут быть реализованы как объекты с сохранением состояния, так что, например, вы можете рассчитать p(i)
от p(i-1)
и коэффициенты Чебышева и рассчитываются один раз, сохраняя их матрицу.