Esempio n. 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);
}
Esempio n. 2
0
static void
_acb_gamma(acb_t y, const acb_t x, long prec, int inverse)
{
    int reflect;
    long r, n, wp;
    acb_t t, u, v;

    wp = prec + FLINT_BIT_COUNT(prec);

    acb_gamma_stirling_choose_param(&reflect, &r, &n, x, 1, 0, wp);

    acb_init(t);
    acb_init(u);
    acb_init(v);

    if (reflect)
    {
        /* gamma(x) = (rf(1-x, r) * pi) / (gamma(1-x+r) sin(pi x)) */
        acb_sub_ui(t, x, 1, wp);
        acb_neg(t, t);
        acb_rising_ui_rec(u, t, r, wp);
        arb_const_pi(acb_realref(v), wp);
        acb_mul_arb(u, u, acb_realref(v), wp);
        acb_add_ui(t, t, r, wp);
        acb_gamma_stirling_eval(v, t, n, 0, wp);
        acb_exp(v, v, wp);
        acb_sin_pi(t, x, wp);
        acb_mul(v, v, t, wp);
    }
    else
    {
        /* gamma(x) = gamma(x+r) / rf(x,r) */
        acb_add_ui(t, x, r, wp);
        acb_gamma_stirling_eval(u, t, n, 0, wp);
        acb_exp(u, u, prec);
        acb_rising_ui_rec(v, x, r, wp);
    }

    if (inverse)
        acb_div(y, v, u, prec);
    else
        acb_div(y, u, v, prec);

    acb_clear(t);
    acb_clear(u);
    acb_clear(v);
}
Esempio n. 3
0
void
acb_rising_ui(acb_t y, const acb_t x, ulong n, long prec)
{
    if (n < FLINT_MAX(prec, 100))
    {
        acb_rising_ui_rec(y, x, n, prec);
    }
    else
    {
        acb_t t;
        acb_init(t);
        acb_add_ui(t, x, n, prec);
        acb_gamma(t, t, prec);
        acb_rgamma(y, x, prec);
        acb_mul(y, y, t, prec);
        acb_clear(t);
    }
}
Esempio n. 4
0
void
acb_rising(acb_t y, const acb_t x, const acb_t n, long prec)
{
    if (acb_is_int(n) && arf_sgn(arb_midref(acb_realref(n))) >= 0 &&
        arf_cmpabs_ui(arb_midref(acb_realref(n)), FLINT_MAX(prec, 100)) < 0)
    {
        acb_rising_ui_rec(y, x,
            arf_get_si(arb_midref(acb_realref(n)), ARF_RND_DOWN), prec);
    }
    else
    {
        acb_t t;
        acb_init(t);
        acb_add(t, x, n, prec);
        acb_gamma(t, t, prec);
        acb_rgamma(y, x, prec);
        acb_mul(y, y, t, prec);
        acb_clear(t);
    }
}