/* From Press, et al., Numerical Recipes */ static void poisson_rejection (double lambda, double *p, size_t n) { double sq = sqrt(2.0*lambda); double alxm = log(lambda); double g = lambda*alxm - LGAMMA(lambda+1.0); size_t i; for (i = 0; i < n; i++) { double y, em, t; do { do { y = tan(M_PI*RUNI); em = sq * y + lambda; } while (em < 0.0); em = floor(em); t = 0.9*(1.0+y*y)*exp(em*alxm-flogfak(em)-g); } while (RUNI > t); p[i] = em; } }
/* for migrate this is defined in tools.h */ MYREAL logfac (long n) { /* log(n!) values were calculated with Mathematica with a precision of 30 digits */ switch (n) { case 0: return 0.; case 1: return 0.; case 2: return 0.693147180559945309417232121458; case 3: return 1.791759469228055000812477358381; case 4: return 3.1780538303479456196469416013; case 5: return 4.78749174278204599424770093452; case 6: return 6.5792512120101009950601782929; case 7: return 8.52516136106541430016553103635; case 8: return 10.60460290274525022841722740072; case 9: return 12.80182748008146961120771787457; case 10: return 15.10441257307551529522570932925; case 11: return 17.50230784587388583928765290722; case 12: return 19.98721449566188614951736238706; default: return LGAMMA (n + 1.); } }