Пример #1
0
/* 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;
    }
}
Пример #2
0
/* 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.);
    }
}