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


import math, strformat
 
const A = [
 1.00000000000000000000,  0.57721566490153286061, -0.65587807152025388108,
-0.04200263503409523553,  0.16653861138229148950, -0.04219773455554433675,
-0.00962197152787697356,  0.00721894324666309954, -0.00116516759185906511,
-0.00021524167411495097,  0.00012805028238811619, -0.00002013485478078824,
-0.00000125049348214267,  0.00000113302723198170, -0.00000020563384169776,
 0.00000000611609510448,  0.00000000500200764447, -0.00000000118127457049,
 0.00000000010434267117,  0.00000000000778226344, -0.00000000000369680562,
 0.00000000000051003703, -0.00000000000002058326, -0.00000000000000534812,
 0.00000000000000122678, -0.00000000000000011813,  0.00000000000000000119,
 0.00000000000000000141, -0.00000000000000000023,  0.00000000000000000002 ]
 
proc gamma(x: float): float =
  let y = x - 1
  result = A[^1]
  for n in countdown(A.high - 1, A.low):
    result = result * y + A[n]
  result = 1 / result
 
echo "Our gamma function     Nim gamma function      Difference"
echo "------------------     ------------------      ----------"
for i in 1..10:
  let val1 = gamma(i.toFloat / 3)
  let val2 = math.gamma(i.toFloat / 3)
  echo &"{val1:18.16f}     {val2:18.16f}     {val1 - val2:11.4e}"