``````(*
Daniel Doubrovkine - dblock@infomaniak.ch
part of the Expression Calculator 2.0 Multithread, destribute freely
http://www.infomaniak.ch/~dblock/express.htm
(ref. Wanner / Hairer - Analysis by it's History - University of Geneva)

calculating a factor of any defined value inclusing negative and positive
non integers! using Euler's (another swiss guy) Gamma function:
n!=Gamma(n+1) and (n-1)!=Gamma(n)/(n-1) for negative values
Gamma(Alpha):=Integral zero->infinity of x^(Alpha-1)*E^-x

in GammaIntegral function TOTAL PRECISION (not just approx!) is reached by
calculating an integral from 0 to 100 with a step if 0.01 from Gamma(4)
*)
function Gamma(alpha,step:extended):extended;
function GammaIntegral(alpha:extended):extended;
(*x^y:=e^(y*ln(x));*)
function Power(base, exponent: extended): extended;
begin
Power:=exp(exponent*ln(base));
end;
function IntegralStep(x: extended):extended;
begin
(*Gamma Integral Step...just to have less mess*)
IntegralStep:=power(x,alpha-1)/power(Exp(1),x);
end;
(*Gamma Integral*)
var
GammaTempIntegral:extended;
l: extended;
begin
l:=0;
GammaTempIntegral:=0;
while l<100 do begin
l:=l+Step;
GammaTempIntegral:=GammaTempIntegral+IntegralStep(l)*step;
end;
GammaIntegral:=GammaTempIntegral;
end;
(*Gamma*)
var
NewGamma: extended;
i: integer;
begin
if (alpha<=0) then begin
if (trunc(alpha)=alpha) then begin
writeln('factor results to infinite value');
halt;
end
else begin
NewGamma:=GammaIntegral(abs(1+frac(alpha))+1);
for i:=0 to trunc(abs(alpha))-1 do begin
NewGamma:=NewGamma/(frac(alpha)-i);
end;
Gamma:=NewGamma;
exit;
end
end  else begin
(*the following values return trailing decimals, this corrects it*)
if alpha=1 then Gamma:=1 else
if alpha=2 then Gamma:=1 else
if alpha=3 then Gamma:=2 else
Gamma:=GammaIntegral(alpha);
end
end;

function Factor(n: extended):extended;
begin
Factor:=Gamma(n+1,0.01);
end;

begin
writeln(Factor(6):0);
end.

``````