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