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


 
program Gamma_function;
 
{$APPTYPE CONSOLE}
 
uses
  System.SysUtils,
  System.Math;
 
function lanczos7(z: double): Double;
begin
  var t := z + 6.5;
  var x := 0.99999999999980993 + 676.5203681218851 / z - 1259.1392167224028 / (z
    + 1) + 771.32342877765313 / (z + 2) - 176.61502916214059 / (z + 3) +
    12.507343278686905 / (z + 4) - 0.13857109526572012 / (z + 5) +
    9.9843695780195716e-6 / (z + 6) + 1.5056327351493116e-7 / (z + 7);
 
  Result := Sqrt(2) * Sqrt(pi) * Power(t, z - 0.5) * exp(-t) * x;
end;
 
begin
  var xs: TArray<double> := [-0.5, 0.1, 0.5, 1, 1.5, 2, 3, 10, 140, 170];
  writeln('    x              Lanczos7');
  for var x in xs do
    writeln(format('%5.1f %24.16g', [x, lanczos7(x)]));
  readln;
end.