/// <inheritdoc /> public override double ProbabilityMass(int k) { if ((k < 0) || (k > n)) { return(0.0); } else { int nmk = n - k; if ((k > 16) && (nmk > 16)) { // For large arguments, use cancellation-corrected Stirling series to // avoid overflow and preserve accuracy. return(Stirling.BinomialProbability(p, k, q, nmk)); } else { // Otherwise, fall back to direct evaluation. return(AdvancedIntegerMath.BinomialCoefficient(n, k) * MoreMath.Pow(p, k) * MoreMath.Pow(q, n - k)); } } }