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


' FB 1.05.0 Win64
 
Const pi = 3.1415926535897932
Const e  = 2.7182818284590452
 
Function gammaStirling (x As Double) As Double
  Return Sqr(2.0 * pi / x) * ((x / e) ^ x)
End Function
 
Function gammaLanczos (x As Double) As Double
  Dim p(0 To 8) As Double = _ 
  { _
       0.99999999999980993, _ 
     676.5203681218851, _ 
   -1259.1392167224028, _			     	  
     771.32342877765313, _ 
    -176.61502916214059, _ 
      12.507343278686905, _
      -0.13857109526572012, _ 
       9.9843695780195716e-6, _
       1.5056327351493116e-7 _
  }
 
  Dim As Integer g = 7
  If x < 0.5 Then Return pi / (Sin(pi * x) * gammaLanczos(1-x))
  x -= 1
  Dim a As Double = p(0)
  Dim t As Double = x + g + 0.5
 
  For i As Integer = 1 To 8
    a += p(i) / (x + i)
  Next		 
 
  Return Sqr(2.0 * pi) * (t ^ (x + 0.5)) * Exp(-t) * a  
End Function
 
Print " x", "    Stirling",, "    Lanczos"
Print
For i As Integer = 1 To 20
   Dim As Double d = i / 10.0
   Print   Using "#.##"; d; 
   Print , Using "#.###############"; gammaStirling(d);
   Print , Using "#.###############"; gammaLanczos(d)
Next
Print
Print "Press any key to quit"
Sleep