public static double StudentDistribution(int k, double t) { if (Math.Abs(t - 0) < Eps) { return(.5); } if (t < -2) { return(.5 * IncompleteBeta.IncompleteBetaValue(.5 * k, .5, k / (k + t * t))); } var x = t < 0 ? -t : t; double rk = k; var z = 1 + x * x / rk; double tz; double f; double p; int j; if (k % 2 != 0) { var x_sqk = x / Math.Sqrt(rk); p = Math.Atan(x_sqk); if (k > 1) { f = 1; tz = 1; j = 3; while (j <= k - 2 & tz / f > Eps) { tz *= (j - 1) / (z * j); f += tz; j += 2; } p += f * x_sqk / z; } p *= 2 / Consts.pi; } else { f = tz = 1; j = 2; while (j <= k - 2 & tz / f > Eps) { tz *= (j - 1) / (z * j); f += tz; j += 2; } p = f * x / Math.Sqrt(z * rk); } return(.5 + .5 * (t < 0 ? -p : p)); }