lowRegGamma function
Implementation
double lowRegGamma(num a, num x) {
var aln = gammaLn(a);
var ap = a;
var sum = 1.0 / a;
var del = sum;
var b = x + 1.0 - a;
var c = 1.0 / 1.0e-30;
var d = 1.0 / b;
var h = d;
final max = (log(a >= 1 ? a : 1.0 / a) * 8.5 + a * 0.4 + 17).ceil();
if (x < 0 || a <= 0) {
return double.nan;
} else if (x < a + 1) {
for (var i = 1; i <= max; i++) {
sum += del *= x / ++ap;
}
return sum * exp(-x + a * log(x) - aln);
}
for (var i = 1; i <= max; i++) {
final an = -i * (i - a);
b += 2.0;
d = an * d + b;
c = b + an / c;
d = 1.0 / d;
h *= d * c;
}
return 1.0 - h * exp(-x + a * log(x) - (aln));
}