Beispiel #1
0
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);
}
Beispiel #2
0
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);
}