public static double LowerIncomplete(double a, double x)
{
if (a <= 0)
return 1.0;
if (x <= 0)
return 0.0;
if (x > 1.0 && x > a)
return 1.0 - UpperIncomplete(a, x);
double ax = a * Math.Log(x) - x - Log(a);
if (ax < -Constants.LogMax)
return 0.0;
ax = Math.Exp(ax);
double r = a;
double c = 1.0;
double ans = 1.0;
do
{
r += 1.0;
c *= x / r;
ans += c;
} while (c / ans > Constants.DoubleEpsilon);
return ans * ax / a;
}