/*--------------------------------------------------------------------------
Author: Thomas Nowotny
Institute: Institute for Nonlinear Dynamics
University of California San Diego
La Jolla, CA 92093-0402
email to: tnowotny@ucsd.edu
initial version: 2002-04-22
--------------------------------------------------------------------------*/
#include <cmath>
#include <cassert>
#ifndef LOGBINOM_CC
#define LOGBINOM_CC
long double logbinomial(long double n, long double k)
{
assert(n >= 0.0L);
assert(k >= 0.0L);
assert(k <= n);
long double x= 0.0L;
long double bi= 0.0L;
while (k > x)
{
bi+= logl(n-x);
bi-= logl(k-x);
x++;
}
return bi;
}
long double p_binomial_log(long double n, long double p, long double k)
{
assert(n >= 0.0L);
assert(k >= 0.0L);
assert(k <= n);
if (fabsl(p-1.0) < 1.0e-9L) {
if (fabsl(k-n) < 1.0e-9L) return 1.0L;
else return 0.0L;
}
if (p < 1.0e-9L) {
if (k < 1.0e-9L) return 1.0L;
else return 0.0L;
}
long double x= 0.0L;
long double bi= 0.0L;
while (k > x)
{
bi+= logl(n-x);
bi-= logl(k-x);
x++;
}
bi+= k*logl(p);
bi+= (n-k)*logl(1.0L-p);
return expl(bi);
}
#endif