in commons-numbers-gamma/src/main/java/org/apache/commons/numbers/gamma/BoostBeta.java [171:214]
static double ibetaDerivative(double a, double b, double x) {
//
// start with the usual error checks:
//
if (!(a > 0 && b > 0) || !(x >= 0 && x <= 1)) {
// Domain error
return Double.NaN;
}
//
// Now the corner cases:
//
if (x == 0) {
if (a > 1) {
return 0;
}
// a == 1 : return 1 / beta(a, b) == b
return a == 1 ? b : Double.POSITIVE_INFINITY;
} else if (x == 1) {
if (b > 1) {
return 0;
}
// b == 1 : return 1 / beta(a, b) == a
return b == 1 ? a : Double.POSITIVE_INFINITY;
}
// Update with extra edge cases
if (b == 1) {
// ibeta = x^a
return a * Math.pow(x, a - 1);
}
if (a == 1) {
// ibeta = 1 - (1-x)^b
if (x >= 0.5) {
return b * Math.pow(1 - x, b - 1);
}
return b * Math.exp(Math.log1p(-x) * (b - 1));
}
//
// Now the regular cases:
//
final double y = (1 - x) * x;
return ibetaPowerTerms(a, b, x, 1 - x, true, 1 / y);
}