Task

Implement one algorithm (or more) to compute the Gamma (



Γ


{\displaystyle \Gamma }

) function (in the real field only).

If your language has the function as built-in or you know a library which has it, compare your implementation's results with the results of the built-in/library function.

The Gamma function can be defined as:

  



Γ
(
x
)
=


∫

0


∞



t

x
−
1



e

−
t


d
t



{\displaystyle \Gamma (x)=\displaystyle \int _{0}^{\infty }t^{x-1}e^{-t}dt}


This suggests a straightforward (but inefficient) way of computing the 



Γ


{\displaystyle \Gamma }

 through numerical integration.



Better suggested methods:

 Lanczos approximation
 Stirling's approximation


#lang racket
(define (gamma number)
  (if (> 1/2 number)
      (/ pi (* (sin (* pi number))
               (gamma (- 1.0 number))))
      (let ((n (sub1 number))
            (c '(0.99999999999980993 676.5203681218851 -1259.1392167224028
                 771.32342877765313 -176.61502916214059 12.507343278686905
	             -0.13857109526572012 9.9843695780195716e-6 1.5056327351493116e-7)))
        (* (sqrt (* pi 2))
           (expt (+ n 7 0.5) (+ n 0.5))
           (exp (- (+ n 7 0.5)))
           (+ (car c)
              (apply +
                (for/list ((i (in-range (length (cdr c)))) (x (in-list (cdr c))))
                  (/ x (+ 1 n i)))))))))
 
(map gamma '(0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1.0))
;->
;'(9.513507698668736
;  4.590843711998802
;  2.9915689876875904
;  2.218159543757687
;  1.7724538509055159
;  1.489192248812818
;  1.2980553326475577
;  1.1642297137253037
;  1.068628702119319
;  1.0)