private static double pseries(double a, double b, double x)
{
double s, t, u, v, n, t1, z, ai;
ai = 1.0/a;
u = (1.0 - b)*x;
v = u/(a + 1.0);
t1 = v;
t = u;
n = 2.0;
s = 0.0;
z = MACHEP*ai;
while (Math.Abs(v) > z)
{
u = (n - b)*x/n;
t *= u;
v = t/(a + n);
s += v;
n += 1.0;
}
s += t1;
s += ai;
u = a * Math.Log(x);
if ((a + b) < MAXGAM && Math.Abs(u) < MAXLOG)
{
t = Gamma(a + b)/(Gamma(a)*Gamma(b));
s = s * t * Math.Pow(x, a);
}
else
{
t = LogGamma(a + b) - LogGamma(a) - LogGamma(b) + u + Math.Log(s);
if (t < MINLOG) s = 0.0;
else s = Math.Exp(t);
}
return s;
}