Commit 0167d0bb authored by Julien Puydt's avatar Julien Puydt

New upstream version 2.14.0

parent c1266acb
......@@ -22,10 +22,22 @@ acb_acos(acb_t res, const acb_t z, slong prec)
{
acb_t t;
acb_init(t);
acb_asin(res, z, prec);
acb_const_pi(t, prec);
acb_mul_2exp_si(t, t, -1);
acb_sub(res, t, res, prec);
acb_one(t);
if (arb_is_zero(acb_imagref(z))
&& arb_gt(acb_realref(z), acb_realref(t)))
{
/* pure imaginary on (1,inf) */
acb_asin(res, z, prec);
acb_neg(res, res);
arb_zero(acb_realref(res));
}
else
{
acb_asin(res, z, prec);
acb_const_pi(t, prec);
acb_mul_2exp_si(t, t, -1);
acb_sub(res, t, res, prec);
}
acb_clear(t);
}
}
......
......@@ -30,7 +30,20 @@ acb_acosh(acb_t res, const acb_t z, slong prec)
acb_sqrt(u, u, prec);
acb_mul(t, t, u, prec);
acb_add(t, t, z, prec);
acb_log(res, t, prec);
if (!arb_is_zero(acb_imagref(z)))
{
acb_log(res, t, prec);
}
else
{
/* pure imaginary on (-1,1) */
arb_abs(acb_realref(u), acb_realref(z));
arb_one(acb_imagref(u));
acb_log(res, t, prec);
if (arb_lt(acb_realref(u), acb_imagref(u)))
arb_zero(acb_realref(res));
}
acb_clear(t);
acb_clear(u);
......
This diff is collapsed.
/*
Copyright (C) 2013 Fredrik Johansson
Copyright (C) 2013, 2018 Fredrik Johansson
This file is part of Arb.
......@@ -21,6 +21,82 @@ int main()
flint_randinit(state);
/* check union */
for (iter = 0; iter < 10000 * arb_test_multiplier(); iter++)
{
acb_t a, b, c, x, ra, rb, rc, rx;
acb_init(a);
acb_init(b);
acb_init(c);
acb_init(x);
acb_init(ra);
acb_init(rb);
acb_init(rc);
acb_init(rx);
acb_randtest_precise(a, state, 1 + n_randint(state, 500), 1 + n_randint(state, 80));
acb_randtest_precise(b, state, 1 + n_randint(state, 500), 1 + n_randint(state, 80));
acb_randtest_precise(c, state, 1 + n_randint(state, 500), 1 + n_randint(state, 80));
acb_randtest(ra, state, 1 + n_randint(state, 500), 1 + n_randint(state, 80));
acb_randtest(rb, state, 1 + n_randint(state, 500), 1 + n_randint(state, 80));
acb_randtest(rc, state, 1 + n_randint(state, 500), 1 + n_randint(state, 80));
acb_randtest(rx, state, 1 + n_randint(state, 500), 1 + n_randint(state, 80));
acb_union(x, a, b, 2 + n_randint(state, 500));
acb_union(x, x, c, 2 + n_randint(state, 500));
acb_rsqrt(rx, x, 2 + n_randint(state, 500));
acb_rsqrt(ra, a, 2 + n_randint(state, 500));
acb_rsqrt(rb, b, 2 + n_randint(state, 500));
acb_rsqrt(rc, c, 2 + n_randint(state, 500));
if (!acb_overlaps(rx, ra))
{
flint_printf("FAIL: overlap a\n\n");
flint_printf("a = "); acb_printn(a, 50, 0); flint_printf("\n\n");
flint_printf("b = "); acb_printn(b, 50, 0); flint_printf("\n\n");
flint_printf("c = "); acb_printn(c, 50, 0); flint_printf("\n\n");
flint_printf("x = "); acb_printn(x, 50, 0); flint_printf("\n\n");
flint_printf("ra = "); acb_printn(ra, 50, 0); flint_printf("\n\n");
flint_printf("rx = "); acb_printn(rx, 50, 0); flint_printf("\n\n");
flint_abort();
}
if (!acb_overlaps(rx, rb))
{
flint_printf("FAIL: overlap b\n\n");
flint_printf("a = "); acb_printn(a, 50, 0); flint_printf("\n\n");
flint_printf("b = "); acb_printn(b, 50, 0); flint_printf("\n\n");
flint_printf("c = "); acb_printn(c, 50, 0); flint_printf("\n\n");
flint_printf("x = "); acb_printn(x, 50, ARB_STR_MORE); flint_printf("\n\n");
flint_printf("rb = "); acb_printn(rb, 50, ARB_STR_MORE); flint_printf("\n\n");
flint_printf("rx = "); acb_printn(rx, 50, ARB_STR_MORE); flint_printf("\n\n");
flint_abort();
}
if (!acb_overlaps(rx, rc))
{
flint_printf("FAIL: overlap c\n\n");
flint_printf("a = "); acb_printn(a, 50, 0); flint_printf("\n\n");
flint_printf("b = "); acb_printn(b, 50, 0); flint_printf("\n\n");
flint_printf("c = "); acb_printn(c, 50, 0); flint_printf("\n\n");
flint_printf("x = "); acb_printn(x, 50, 0); flint_printf("\n\n");
flint_printf("rc = "); acb_printn(rc, 50, 0); flint_printf("\n\n");
flint_printf("rx = "); acb_printn(rx, 50, 0); flint_printf("\n\n");
flint_abort();
}
acb_clear(a);
acb_clear(b);
acb_clear(c);
acb_clear(x);
acb_clear(ra);
acb_clear(rb);
acb_clear(rc);
acb_clear(rx);
}
/* check (a^(-1/2))^(-2) = a */
for (iter = 0; iter < 10000 * arb_test_multiplier(); iter++)
{
......
......@@ -27,7 +27,7 @@ _acb_vec_bluestein_factors(acb_ptr z, slong n, slong prec)
z2n = _acb_vec_init(2 * n);
_acb_vec_unit_roots(z2n, -2 * n, 2 * n, prec);
nmod_init(&n2, 2 * n);
nmod_init(&n2, FLINT_MAX(2 * n, 1));
for (k = 0, k2 = 0; k < n; k++)
{
......
......@@ -23,7 +23,7 @@ crt_init(crt_t c, ulong n)
else
fac.num = 0;
nmod_init(&c->n, n);
nmod_init(&c->n, FLINT_MAX(n, 1));
c->num = fac.num;
for (k = 0; k < fac.num; k++)
......
......@@ -47,6 +47,8 @@ void acb_dirichlet_zeta_jet(acb_t res, const acb_t s, int deflate, slong len, sl
void acb_dirichlet_hurwitz(acb_t res, const acb_t s, const acb_t a, slong prec);
void acb_dirichlet_stieltjes(acb_t res, const fmpz_t n, const acb_t a, slong prec);
typedef struct
{
acb_struct s;
......@@ -73,6 +75,8 @@ void _acb_dirichlet_euler_product_real_ui(arb_t res, ulong s,
void acb_dirichlet_eta(acb_t res, const acb_t s, slong prec);
void acb_dirichlet_xi(acb_t res, const acb_t s, slong prec);
void acb_dirichlet_pairing(acb_t res, const dirichlet_group_t G, ulong m, ulong n, slong prec);
void acb_dirichlet_pairing_char(acb_t res, const dirichlet_group_t G, const dirichlet_char_t a, const dirichlet_char_t b, slong prec);
......
This diff is collapsed.
/*
Copyright (C) 2018 Fredrik Johansson
This file is part of Arb.
Arb is free software: you can redistribute it and/or modify it under
the terms of the GNU Lesser General Public License (LGPL) as published
by the Free Software Foundation; either version 2.1 of the License, or
(at your option) any later version. See <http://www.gnu.org/licenses/>.
*/
#include "acb_dirichlet.h"
void acb_dirichlet_stieltjes_integral(acb_t res, const fmpz_t n, const acb_t a, slong prec);
void acb_dirichlet_stieltjes_em(acb_t res, const fmpz_t n, const acb_t a, slong prec);
int main()
{
slong iter;
flint_rand_t state;
flint_printf("stieltjes....");
fflush(stdout);
flint_randinit(state);
for (iter = 0; iter < 250 * arb_test_multiplier(); iter++)
{
acb_t b1, b2, a;
fmpz_t n;
slong prec1, prec2, acc1, acc2;
int alg1, alg2;
fmpz_init(n);
acb_init(b1);
acb_init(b2);
acb_init(a);
if (n_randint(state, 10) == 0)
{
acb_one(a);
fmpz_randtest(n, state, 1 + n_randint(state, 100));
fmpz_abs(n, n);
prec1 = 2 + n_randint(state, 100);
prec2 = 2 + n_randint(state, 100);
}
else if (n_randint(state, 7) != 0)
{
acb_one(a);
fmpz_randtest(n, state, 2 + n_randint(state, 12));
fmpz_abs(n, n);
prec1 = 2 + n_randint(state, 400);
prec2 = 2 + n_randint(state, 400);
}
else
{
acb_randtest_precise(a, state, 400, 3);
fmpz_randtest(n, state, 7);
fmpz_abs(n, n);
prec1 = 2 + n_randint(state, 400);
prec2 = 2 + n_randint(state, 400);
}
alg1 = n_randint(state, 3);
alg2 = n_randint(state, 3);
if (fmpz_cmp_ui(n, 40) >= 0)
{
alg1 = 1 + n_randint(state, 2);
alg2 = 1 + n_randint(state, 2);
}
else
{
alg1 = n_randint(state, 3);
alg2 = n_randint(state, 3);
}
if (alg1 == 0)
acb_dirichlet_stieltjes_em(b1, n, a, prec1);
else if (alg1 == 1)
acb_dirichlet_stieltjes_integral(b1, n, a, prec1);
else
acb_dirichlet_stieltjes(b1, n, a, prec1);
if (alg2 == 0)
acb_dirichlet_stieltjes_em(b2, n, a, prec2);
else if (alg2 == 1)
acb_dirichlet_stieltjes_integral(b2, n, a, prec2);
else
acb_dirichlet_stieltjes(b2, n, a, prec2);
if (!acb_overlaps(b1, b2))
{
flint_printf("FAIL: overlap\n\n");
flint_printf("iter = %wd, alg1 = %d, alg2 = %d\n\n", iter, alg1, alg2);
flint_printf("n = "); fmpz_print(n); flint_printf("\n\n");
flint_printf("a = "); acb_printn(a, 100, 0); flint_printf("\n\n");
flint_printf("b1 = "); acb_printn(b1, 1000, 0); flint_printf("\n\n");
flint_printf("b2 = "); acb_printn(b2, 1000, 0); flint_printf("\n\n");
flint_abort();
}
acc1 = acb_rel_accuracy_bits(b1);
acc2 = acb_rel_accuracy_bits(b2);
if (acb_is_one(a) && (acc1 < prec1 - 10 || acc2 < prec2 - 10))
{
flint_printf("FAIL: poor accuracy\n\n");
flint_printf("prec1 = %wd, acc1 = %wd\n", prec1, acc1);
flint_printf("prec2 = %wd, acc2 = %wd\n", prec2, acc2);
flint_printf("n = "); fmpz_print(n); flint_printf("\n\n");
flint_printf("b1 = "); acb_printn(b1, 500, 0); flint_printf("\n\n");
flint_printf("b2 = "); acb_printn(b2, 500, 0); flint_printf("\n\n");
flint_abort();
}
acb_clear(b1);
acb_clear(b2);
acb_clear(a);
fmpz_clear(n);
}
flint_randclear(state);
flint_cleanup();
flint_printf("PASS\n");
return EXIT_SUCCESS;
}
/*
Copyright (C) 2018 D.H.J Polymath
This file is part of Arb.
Arb is free software: you can redistribute it and/or modify it under
the terms of the GNU Lesser General Public License (LGPL) as published
by the Free Software Foundation; either version 2.1 of the License, or
(at your option) any later version. See <http://www.gnu.org/licenses/>.
*/
#include "acb_dirichlet.h"
int main()
{
slong iter;
flint_rand_t state;
flint_printf("xi....");
fflush(stdout);
flint_randinit(state);
for (iter = 0; iter < 500 * arb_test_multiplier(); iter++)
{
acb_t a, b, c;
slong prec1, prec2;
prec1 = 2 + n_randint(state, 100);
prec2 = 2 + n_randint(state, 100);
acb_init(a);
acb_init(b);
acb_init(c);
acb_randtest_precise(a, state, 1 + n_randint(state, 1000), 3);
acb_dirichlet_xi(b, a, prec1);
if (n_randint(state, 2))
{
acb_dirichlet_xi(c, a, prec2);
}
else /* test aliasing */
{
acb_set(c, a);
acb_dirichlet_xi(c, c, prec2);
}
if (!acb_overlaps(b, c))
{
flint_printf("FAIL: overlap\n\n");
flint_printf("a = "); acb_print(a); flint_printf("\n\n");
flint_printf("b = "); acb_print(b); flint_printf("\n\n");
flint_printf("c = "); acb_print(c); flint_printf("\n\n");
flint_abort();
}
/* check xi(s) = xi(1-s) */
acb_sub_ui(c, a, 1, prec1);
acb_neg(c, c);
acb_dirichlet_xi(c, c, prec1);
if (!acb_overlaps(b, c))
{
flint_printf("FAIL: functional equation\n\n");
flint_printf("a = "); acb_print(a); flint_printf("\n\n");
flint_printf("b = "); acb_print(b); flint_printf("\n\n");
flint_printf("c = "); acb_print(c); flint_printf("\n\n");
flint_abort();
}
acb_clear(a);
acb_clear(b);
acb_clear(c);
}
flint_randclear(state);
flint_cleanup();
flint_printf("PASS\n");
return EXIT_SUCCESS;
}
/*
Copyright (C) 2018 D.H.J Polymath
This file is part of Arb.
Arb is free software: you can redistribute it and/or modify it under
the terms of the GNU Lesser General Public License (LGPL) as published
by the Free Software Foundation; either version 2.1 of the License, or
(at your option) any later version. See <http://www.gnu.org/licenses/>.
*/
#include "acb_dirichlet.h"
static void
_acb_dirichlet_xi(acb_t res, const acb_t s, slong prec)
{
acb_t pi, z1, z2, z3;
acb_init(pi);
acb_init(z1);
acb_init(z2);
acb_init(z3);
/* (s-1) * pi^(-s/2) * gamma(1 + s/2) * zeta(s) */
acb_const_pi(pi, prec);
acb_mul_2exp_si(z1, s, -1);
acb_neg(z1, z1);
acb_pow(z1, pi, z1, prec);
acb_mul_2exp_si(z2, s, -1);
acb_add_ui(z2, z2, 1, prec);
acb_gamma(z2, z2, prec);
acb_zeta(z3, s, prec);
acb_sub_ui(res, s, 1, prec);
acb_mul(res, res, z1, prec);
acb_mul(res, res, z2, prec);
acb_mul(res, res, z3, prec);
acb_clear(pi);
acb_clear(z1);
acb_clear(z2);
acb_clear(z3);
}
void acb_dirichlet_xi(acb_t res, const acb_t s, slong prec)
{
if (!acb_is_finite(s))
{
acb_indeterminate(res);
}
else if (acb_is_one(s))
{
acb_one(res);
acb_mul_2exp_si(res, res, -1);
}
else if ((arf_sgn(arb_midref(acb_realref(s))) < 0 &&
!acb_contains_zero(s)) ||
(arb_contains_si(acb_realref(s), 1) && /* also intervals around s = 1 */
arb_contains_zero(acb_imagref(s))))
{
acb_sub_ui(res, s, 1, prec);
acb_neg(res, res);
_acb_dirichlet_xi(res, res, prec);
}
else
{
_acb_dirichlet_xi(res, s, prec);
}
}
......@@ -52,7 +52,8 @@ acb_dirichlet_zeta(acb_t res, const acb_t s, slong prec)
return;
}
if (arf_sgn(arb_midref(acb_realref(s))) < 0)
if ((arf_sgn(arb_midref(acb_realref(s))) < 0) &&
!acb_contains_zero(s))
{
acb_t t, u, v;
slong wp = prec + 6;
......
......@@ -111,14 +111,16 @@ void acb_hypgeom_bessel_j_0f1(acb_t res, const acb_t nu, const acb_t z, slong pr
void acb_hypgeom_bessel_j_asymp(acb_t res, const acb_t nu, const acb_t z, slong prec);
void acb_hypgeom_bessel_j(acb_t res, const acb_t nu, const acb_t z, slong prec);
void acb_hypgeom_bessel_i_0f1(acb_t res, const acb_t nu, const acb_t z, slong prec);
void acb_hypgeom_bessel_i_asymp(acb_t res, const acb_t nu, const acb_t z, slong prec);
void acb_hypgeom_bessel_i_0f1(acb_t res, const acb_t nu, const acb_t z, int scaled, slong prec);
void acb_hypgeom_bessel_i_asymp(acb_t res, const acb_t nu, const acb_t z, int scaled, slong prec);
void acb_hypgeom_bessel_i(acb_t res, const acb_t nu, const acb_t z, slong prec);
void acb_hypgeom_bessel_i_scaled(acb_t res, const acb_t nu, const acb_t z, slong prec);
void acb_hypgeom_bessel_k_0f1(acb_t res, const acb_t nu, const acb_t z, slong prec);
void acb_hypgeom_bessel_k_0f1_series(acb_poly_t res, const acb_poly_t n, const acb_poly_t z, slong len, slong prec);
void acb_hypgeom_bessel_k_asymp(acb_t res, const acb_t nu, const acb_t z, slong prec);
void acb_hypgeom_bessel_k_0f1(acb_t res, const acb_t nu, const acb_t z, int scaled, slong prec);
void acb_hypgeom_bessel_k_0f1_series(acb_poly_t res, const acb_poly_t n, const acb_poly_t z, int scaled, slong len, slong prec);
void acb_hypgeom_bessel_k_asymp(acb_t res, const acb_t nu, const acb_t z, int scaled, slong prec);
void acb_hypgeom_bessel_k(acb_t res, const acb_t nu, const acb_t z, slong prec);
void acb_hypgeom_bessel_k_scaled(acb_t res, const acb_t nu, const acb_t z, slong prec);
void acb_hypgeom_bessel_y(acb_t res, const acb_t nu, const acb_t z, slong prec);
void acb_hypgeom_bessel_jy(acb_t res1, acb_t res2, const acb_t nu, const acb_t z, slong prec);
......
......@@ -37,7 +37,7 @@ acb_hypgeom_0f1_asymp(acb_t res, const acb_t a, const acb_t z, int regularized,
if (neg)
acb_hypgeom_bessel_j_asymp(v, u, v, prec);
else
acb_hypgeom_bessel_i_asymp(v, u, v, prec);
acb_hypgeom_bessel_i_asymp(v, u, v, 0, prec);
acb_neg(u, u);
acb_pow(t, t, u, prec);
......
......@@ -227,7 +227,7 @@ acb_hypgeom_airy(acb_t ai, acb_t aip, acb_t bi, acb_t bip, const acb_t z, slong
zmag = fmpz_get_d(ARF_EXPREF(re));
else
zmag = fmpz_get_d(ARF_EXPREF(im));
zmag = (zmag + 1) * (1.0 / LOG2);
zmag = 3.0 * zmag + 1;
n = wp / (-zmag) + 1;
}
......@@ -246,7 +246,7 @@ acb_hypgeom_airy(acb_t ai, acb_t aip, acb_t bi, acb_t bip, const acb_t z, slong
{
x = fmpz_get_d(ARF_EXPREF(re));
y = fmpz_get_d(ARF_EXPREF(im));
zmag = (FLINT_MAX(x, y) - 2) * (1.0 / LOG2);
zmag = (FLINT_MAX(x, y) - 2) * LOG2;
n = asymp_pick_terms(wp, zmag);
n = FLINT_MAX(n, 1);
}
......
......@@ -13,7 +13,7 @@
void
acb_hypgeom_bessel_i_asymp_prefactors(acb_t A, acb_t B, acb_t C,
const acb_t nu, const acb_t z, slong prec)
const acb_t nu, const acb_t z, int scaled, slong prec)
{
acb_t t, u;
......@@ -53,15 +53,26 @@ acb_hypgeom_bessel_i_asymp_prefactors(acb_t A, acb_t B, acb_t C,
arb_union(acb_imagref(t), acb_imagref(t), acb_imagref(u), prec);
}
acb_exp_invexp(B, A, z, prec);
acb_mul(A, A, t, prec);
if (scaled)
{
acb_neg(u, z);
acb_mul_2exp_si(u, u, 1);
acb_exp(u, u, prec);
acb_mul(A, t, u, prec);
acb_one(B);
}
else
{
acb_exp_invexp(B, A, z, prec);
acb_mul(A, A, t, prec);
}
acb_clear(t);
acb_clear(u);
}
void
acb_hypgeom_bessel_i_asymp(acb_t res, const acb_t nu, const acb_t z, slong prec)
acb_hypgeom_bessel_i_asymp(acb_t res, const acb_t nu, const acb_t z, int scaled, slong prec)
{
acb_t A1, A2, C, U1, U2, s, t, u;
int is_real, is_imag;
......@@ -79,7 +90,7 @@ acb_hypgeom_bessel_i_asymp(acb_t res, const acb_t nu, const acb_t z, slong prec)
is_real = acb_is_real(nu) && acb_is_real(z)
&& (acb_is_int(nu) || arb_is_positive(acb_realref(z)));
if (!is_real && arb_is_zero(acb_realref(z)) && acb_is_int(nu))
if (!is_real && !scaled && arb_is_zero(acb_realref(z)) && acb_is_int(nu))
{
acb_mul_2exp_si(t, nu, -1);
......@@ -89,7 +100,10 @@ acb_hypgeom_bessel_i_asymp(acb_t res, const acb_t nu, const acb_t z, slong prec)
is_imag = 1;
}
acb_hypgeom_bessel_i_asymp_prefactors(A1, A2, C, nu, z, prec);
if (scaled)
is_imag = 0;
acb_hypgeom_bessel_i_asymp_prefactors(A1, A2, C, nu, z, scaled, prec);
/* todo: if Ap ~ 2^a and Am = 2^b and U1 ~ U2 ~ 1, change precision? */
......@@ -134,7 +148,7 @@ acb_hypgeom_bessel_i_asymp(acb_t res, const acb_t nu, const acb_t z, slong prec)
}
void
acb_hypgeom_bessel_i_0f1(acb_t res, const acb_t nu, const acb_t z, slong prec)
acb_hypgeom_bessel_i_0f1(acb_t res, const acb_t nu, const acb_t z, int scaled, slong prec)
{
acb_struct b[2];
acb_t w, c, t;
......@@ -143,7 +157,7 @@ acb_hypgeom_bessel_i_0f1(acb_t res, const acb_t nu, const acb_t z, slong prec)
{
acb_init(t);
acb_neg(t, nu);
acb_hypgeom_bessel_i_0f1(res, t, z, prec);
acb_hypgeom_bessel_i_0f1(res, t, z, scaled, prec);
acb_clear(t);
return;
}
......@@ -169,6 +183,13 @@ acb_hypgeom_bessel_i_0f1(acb_t res, const acb_t nu, const acb_t z, slong prec)
acb_hypgeom_pfq_direct(t, NULL, 0, b, 2, w, -1, prec);
if (scaled)
{
acb_neg(w, z);
acb_exp(w, w, prec);
acb_mul(t, t, w, prec);
}
acb_mul(res, t, c, prec);
acb_clear(b + 0);
......@@ -188,9 +209,26 @@ acb_hypgeom_bessel_i(acb_t res, const acb_t nu, const acb_t z, slong prec)
if (mag_cmp_2exp_si(zmag, 4) < 0 ||
(mag_cmp_2exp_si(zmag, 64) < 0 && 2 * mag_get_d(zmag) < prec))
acb_hypgeom_bessel_i_0f1(res, nu, z, prec);
acb_hypgeom_bessel_i_0f1(res, nu, z, 0, prec);
else
acb_hypgeom_bessel_i_asymp(res, nu, z, 0, prec);
mag_clear(zmag);
}
void
acb_hypgeom_bessel_i_scaled(acb_t res, const acb_t nu, const acb_t z, slong prec)
{
mag_t zmag;
mag_init(zmag);
acb_get_mag(zmag, z);
if (mag_cmp_2exp_si(zmag, 4) < 0 ||
(mag_cmp_2exp_si(zmag, 64) < 0 && 2 * mag_get_d(zmag) < prec))
acb_hypgeom_bessel_i_0f1(res, nu, z, 1, prec);
else
acb_hypgeom_bessel_i_asymp(res, nu, z, prec);
acb_hypgeom_bessel_i_asymp(res, nu, z, 1, prec);
mag_clear(zmag);
}
......
......@@ -12,7 +12,7 @@
#include "acb_hypgeom.h"
void
acb_hypgeom_bessel_k_asymp(acb_t res, const acb_t nu, const acb_t z, slong prec)
acb_hypgeom_bessel_k_asymp(acb_t res, const acb_t nu, const acb_t z, int scaled, slong prec)
{
acb_t t, a, b, w;
......@@ -32,9 +32,12 @@ acb_hypgeom_bessel_k_asymp(acb_t res, const acb_t nu, const acb_t z, slong prec)
acb_hypgeom_u_asymp(t, a, b, w, -1, prec);