lowRegGamma function

double lowRegGamma(
  1. num a,
  2. num x
)

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));
}