2016-11-15 1 views
2

J'implémente une bibliothèque arithmétique de précision arbitraire en C++ et je suis plutôt bloqué lors de l'implémentation de la fonction gamma.Fonction gamma de précision arbitraire

En utilisant les gamma(n) = gamma(n - 1) * n et gamma(n) = gamma(n + 1)/n équivalences, respectivement, je peux obtenir un nombre rationnel r dans la gamme (1; 2] pour toutes les valeurs réelles x. Cependant, je ne sais pas comment évaluer gamma(r). Pour l'approximation de Lanczos (https://en.wikipedia.org/wiki/Lanczos_approximation), j'ai besoin de valeurs p précalculées qui arrivent à calculer une factorielle d'une valeur non entière (?!) Et ne peuvent pas être calculées dynamiquement avec mes connaissances actuelles ... Précomputing values ​​for p ne serait pas avoir beaucoup de sens lors de l'implémentation d'une bibliothèque de précision arbitraire.

Existe-t-il des algorithmes qui calculent gamma(r) dans un délai raisonnable avec une précision arbitraire? Merci de votre aide.

+0

Je présume que vous avez étudié http://functions.wolfram.com/GammaBetaErf/Gamma/introductions/Gamma/05/ et que vous n'avez pas trouvé ce dont vous avez besoin. –

+0

On dirait que c'est plus lié aux mathématiques qu'à la programmation ... Peut-être, il est préférable de poser des questions là-bas. –

+0

Je voudrais également regarder dans la source de MPFR pour voir ce qu'ils utilisent. –

Répondre

0

L'approximation de Lanczos ne semble pas trop mauvaise. Que soupçonnez-vous exactement?

parties de code qui calculent p, C (polynômes de Chebyshev) et (a + 1/2)! peuvent être mis en œuvre sous forme d'objets stateful de sorte que, par exemple, vous pouvez calculer p(i) de p(i-1) et coefficients de Chebyshev et être calculé une fois, le maintien de leur matrice.

1

Spouge's approximation est similaire à l'approximation de Lanczos, mais probablement plus facile à utiliser pour une précision arbitraire, car vous pouvez définir l'erreur désirée.