void acb_lgamma(acb_t y, const acb_t x, long prec) { int reflect; long r, n, wp; acb_t t, u; wp = prec + FLINT_BIT_COUNT(prec); acb_gamma_stirling_choose_param(&reflect, &r, &n, x, 0, 0, wp); /* log(gamma(x)) = log(gamma(x+r)) - log(rf(x,r)) */ acb_init(t); acb_init(u); acb_add_ui(t, x, r, wp); acb_gamma_stirling_eval(u, t, n, 0, wp); acb_rising_ui_rec(t, x, r, prec); acb_log(t, t, prec); _acb_log_rising_correct_branch(t, t, x, r, wp); acb_sub(y, u, t, prec); acb_clear(t); acb_clear(u); }
static __inline__ void _log_rising_ui_series(acb_ptr t, const acb_t x, slong r, slong len, slong prec) { acb_struct f[2]; slong rflen; acb_init(f); acb_init(f + 1); acb_set(f, x); acb_one(f + 1); rflen = FLINT_MIN(len, r + 1); _acb_poly_rising_ui_series(t, f, FLINT_MIN(2, len), r, rflen, prec); _acb_poly_log_series(t, t, rflen, len, prec); _acb_log_rising_correct_branch(t, t, x, r, prec); acb_clear(f); acb_clear(f + 1); }