46 private double[] pp =
new double[36];
47 private int[] llref = { 0 };
48 private static double[] staticPP =
new double[36];
49 private static int[] staticllref = { 0 };
68 init(dist.getLambda());
72 return tiac(stream, lambda, pp, llref);
80 return tiac(s, lambda, staticPP, staticllref);
83 private void init(
double lam) {
85 for (
int i = 0; i < pp.length; i++)
110 private static int tiac(
RandomStream s,
double lambda,
double[] pp,
int[] llref) {
111 final double a0 = -0.5000000002;
112 final double a1 = 0.3333333343;
113 final double a2 = -0.2499998565;
114 final double a3 = 0.1999997049;
115 final double a4 = -0.1666848753;
116 final double a5 = 0.1428833286;
117 final double a6 = -0.1241963125;
118 final double a7 = 0.1101687109;
119 final double a8 = -0.1142650302;
120 final double a9 = 0.1055093006;
122 final int fac[] = { 1, 1, 2, 6, 24, 120, 720, 5040, 40320, 362880 };
127 int m = lambda > 1 ? (int) lambda : 1;
130 p0 = q = p = Math.exp(-lambda);
140 i = (u > 0.458) ? Math.min(ll, m) : 1;
141 for (k = i; k <= ll; k++)
149 for (k = ll + 1; k <= 35; k++) {
150 p *= lambda / (double) k;
163 double sl = Math.sqrt(lambda);
164 double d = 6 * lambda * lambda;
165 int l = (int) (lambda - 1.1484);
168 double omega = 0.3989423 / sl;
169 double b1 = 0.416666666667e-1 / lambda;
170 double b2 = 0.3 * b1 * b1;
171 double c3 = 0.1428571 * b1 * b2;
172 double c2 = b2 - 15.0 * c3;
173 double c1 = b1 - 6.0 * b2 + 45.0 * c3;
174 double c0 = 1.0 - b1 + 3.0 * b2 - 15.0 * c3;
175 double c = 0.1069 / lambda;
177 double t, g, lambda_k;
178 double gx, gy, px, py, x, xx, delta, v;
188 t = NormalDist.inverseF(0, 1, s.nextDouble());
198 lambda_k = lambda - k;
199 if (d * u >= lambda_k * lambda_k * lambda_k)
205 py = Math.exp(k * Math.log(lambda)) / fac[k];
207 delta = 0.83333333333e-1 / (double) k;
208 delta = delta - 4.8 * delta * delta * delta * (1. - 1. / (3.5 * k * k));
209 v = (lambda_k) / (
double) k;
210 if (Math.abs(v) > 0.25)
211 px = k * Math.log(1. + v) - lambda_k - delta;
214 px *= ((((((((a9 * v + a8) * v + a7) * v + a6) * v + a5) * v + a4) * v + a3) * v + a2) * v + a1) * v
218 py = 0.3989422804 / Math.sqrt((
double) k);
220 x = (0.5 - lambda_k) / sl;
223 gy = omega * (((c3 * xx + c2) * xx + c1) * xx + c0);
227 if (gy * (1.0 - u) <= py * Math.exp(px - gx))
234 e = -Math.log(s.nextDouble());
237 sign = u < 0 ? -1 : 1;
239 }
while (t <= -0.6744);
240 k = (int) (lambda + sl * t);
241 lambda_k = lambda - k;
246 py = Math.exp(k * Math.log(lambda)) / fac[k];
248 delta = 0.83333333333e-1 / (double) k;
249 delta = delta - 4.8 * delta * delta * delta * (1.0 - 1.0 / (3.5 * k * k));
250 v = lambda_k / (double) k;
251 if (Math.abs(v) > 0.25)
252 px = k * Math.log(1. + v) - lambda_k - delta;
255 px *= ((((((((a9 * v + a8) * v + a7) * v + a6) * v + a5) * v + a4) * v + a3) * v + a2) * v + a1) * v
259 py = 0.3989422804 / Math.sqrt((
double) k);
261 x = (0.5 - lambda_k) / sl;
264 gy = omega * (((c3 * xx + c2) * xx + c1) * xx + c0);
268 if (c * sign * u <= py * Math.exp(px + e) - gy * Math.exp(gx + e))
275 for (
int i = 0; i < staticPP.length; i++)