static double ibetaDerivative()

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