24#ifndef quantlib_binomial_distribution_h
25#define quantlib_binomial_distribution_h
27#include <ql/math/factorial.hpp>
28#include <ql/math/beta.hpp>
34 QL_REQUIRE(n>=k,
"n<k not allowed");
118 QL_REQUIRE(p>0,
"negative p not allowed");
119 QL_REQUIRE(p<1.0, "p>1.0 not allowed
");
122 logOneMinusP_ = std::log(1.0-p);
128 CumulativeBinomialDistribution::CumulativeBinomialDistribution(
129 Real p, BigNatural n)
132 QL_REQUIRE(p>=0, "negative p not allowed
");
133 QL_REQUIRE(p<=1.0, "p>1.0 not allowed
");
137 inline Real BinomialDistribution::operator()(BigNatural k) const {
139 if (k > n_) return 0.0;
143 return (k==n_ ? 1.0 : 0.0);
145 else if (logOneMinusP_==0.0)
146 return (k==0 ? 1.0 : 0.0);
148 return std::exp(binomialCoefficientLn(n_, k) +
149 k * logP_ + (n_-k) * logOneMinusP_);
160 inline Real PeizerPrattMethod2Inversion(Real z, BigNatural n) {
163 "n must be an odd number:
" << n << " not allowed
");
165 Real result = (z/(n+1.0/3.0+0.1/(n+1.0)));
167 result = std::exp(-result*(n+1.0/6.0));
168 result = 0.5 + (z>0 ? 1 : -1) * std::sqrt((0.25 * (1.0-result)));
Binomial probability distribution function.
BinomialDistribution(Real p, BigNatural n)
Real operator()(BigNatural k) const
QL_DEPRECATED typedef Real argument_type
QL_DEPRECATED typedef Real result_type
Cumulative binomial distribution function.
Real operator()(BigNatural k) const
QL_DEPRECATED typedef Real argument_type
QL_DEPRECATED typedef Real result_type
static Real ln(Natural n)
Real incompleteBetaFunction(Real a, Real b, Real x, Real accuracy, Integer maxIteration)
Incomplete Beta function.
Real binomialCoefficient(BigNatural n, BigNatural k)
Real binomialCoefficientLn(BigNatural n, BigNatural k)
unsigned QL_BIG_INTEGER BigNatural
large positive integer