double gsl_ran_gamma_mt (const gsl_rng * r, const double a, const double b) { /* assume a > 0 */ if (a < 1) { double u = gsl_rng_uniform_pos (r); return gsl_ran_gamma_mt (r, 1.0 + a, b) * pow (u, 1.0 / a); } { double x, v, u; double d = a - 1.0 / 3.0; double c = (1.0 / 3.0) / sqrt (d); while (1) { do { x = gsl_ran_gaussian_ziggurat (r, 1.0); v = 1.0 + c * x; } while (v <= 0); v = v * v * v; u = gsl_rng_uniform_pos (r); if (u < 1 - 0.0331 * x * x * x * x) break; if (log (u) < 0.5 * x * x + d * (1 - v + log (v))) break; } return b * d * v; } }
double rgamma(double a, double b) { return gsl_ran_gamma_mt(RANDOM_NUMBER, a, b); }
double test_gamma_mt_small (void) { return gsl_ran_gamma_mt (r_global, 0.92, 2.17); }
double test_gamma_mt_large (void) { return gsl_ran_gamma_mt (r_global, 20.0, 2.17); }
double test_gamma_mt_int (void) { return gsl_ran_gamma_mt (r_global, 10.0, 2.17); }
double test_gamma_mt (void) { return gsl_ran_gamma_mt (r_global, 2.5, 2.17); }
double poly_gamma_proposal_samp(gsl_rng * r, poly_gamma_proposal_param_t par) { double samp = par.theta+gsl_ran_gamma_mt(r, par.shape, par.scale); return samp; }