#include "internal.h" /* * Ahrens, J. H., & Dieter, U. (1982). * Computer Generation of Poisson Deviates from Modified Normal Distributions. */ static double factorial[10] = {1., 1., 2., 6., 24., 120., 720., 5040., 40320., 362880.}; static double coeffs[9] = { -.500000000, +.333333333, -.249999856, +.200011780, -.166684875, +.142187833, -.124196313, +.125005956, -.114265030, }; static inline double log1pmx(double x, double off) { int i; double r, t; if(-0.25 < x && x < 0.25) { r = 0; t = 1; for(i=0;i=L) return K; stepS: U = rng·random(); if(d*U >= (mu-K)*(mu-K)*(mu-K)) return K; stepP: if(G < 0) goto stepE; stepQ: c = procf(mu, s, K, &px, &py, &fx, &fy); stepE: E = rng·exponential(1.0); U = rng·random(); U = U + U - 1; T = 1.8 + copysign(E,U); if(T < 0.6744) goto stepE; K = floor(mu + s*T); c = procf(mu, s, K, &px, &py, &fx, &fy); stepH: if(c*fabs(U) > (py*exp(px + E) - fy*exp(fx + E))) goto stepE; return K; } uint64 rng·poisson(double mean) { int64 n; double z; if(mean<10.0) { for(n=0, z=rng·exponential(1.0); z