From 95e6949d0291bc5e92ca0027e3effce9b4856a0d Mon Sep 17 00:00:00 2001 From: p15-git-acc <37548430+p15-git-acc@users.noreply.github.com> Date: Tue, 22 Sep 2020 15:38:21 -0500 Subject: [PATCH] more special values --- acb_hypgeom/bessel_j.c | 8 ++++ acb_hypgeom/bessel_y.c | 9 ++++ arb/sinc_pi.c | 7 +++- arb/test/t-sinc_pi.c | 25 +++++++++++ arb_hypgeom/test/t-bessel_j.c | 79 +++++++++++++++++++++++++++++++++++ arb_hypgeom/test/t-bessel_y.c | 79 +++++++++++++++++++++++++++++++++++ 6 files changed, 205 insertions(+), 2 deletions(-) create mode 100644 arb_hypgeom/test/t-bessel_j.c create mode 100644 arb_hypgeom/test/t-bessel_y.c diff --git a/acb_hypgeom/bessel_j.c b/acb_hypgeom/bessel_j.c index db74a8cc..6653af93 100644 --- a/acb_hypgeom/bessel_j.c +++ b/acb_hypgeom/bessel_j.c @@ -98,6 +98,14 @@ acb_hypgeom_bessel_j_asymp(acb_t res, const acb_t nu, const acb_t z, slong prec) acb_t A1, A2, C, U1, U2, s, t, u; int is_real, is_imag; + /* zero at -inf and +inf when nu is finite */ + if (acb_is_finite(nu) && !acb_is_finite(z) && + acb_is_real(z) && !acb_contains_zero(z)) + { + acb_zero(res); + return; + } + acb_init(A1); acb_init(A2); acb_init(C); diff --git a/acb_hypgeom/bessel_y.c b/acb_hypgeom/bessel_y.c index f7961c5a..049f8b03 100644 --- a/acb_hypgeom/bessel_y.c +++ b/acb_hypgeom/bessel_y.c @@ -37,6 +37,15 @@ acb_hypgeom_bessel_jy(acb_t res1, acb_t res2, const acb_t nu, const acb_t z, slo { acb_t jnu, t, u, v; + /* both j and y are zero at -inf and +inf when nu is finite */ + if (acb_is_finite(nu) && !acb_is_finite(z) && + acb_is_real(z) && !acb_contains_zero(z)) + { + if (res1 != NULL) acb_zero(res1); + acb_zero(res2); + return; + } + acb_init(jnu); acb_init(t); acb_init(u); diff --git a/arb/sinc_pi.c b/arb/sinc_pi.c index dc7ae847..acc7bc8e 100644 --- a/arb/sinc_pi.c +++ b/arb/sinc_pi.c @@ -28,9 +28,12 @@ arb_sinc_pi(arb_t res, const arb_t x, slong prec) return; } - if (arb_is_zero(x)) + if (arb_is_int(x)) { - arb_one(res); + if (arb_is_zero(x)) + arb_one(res); + else + arb_zero(res); return; } diff --git a/arb/test/t-sinc_pi.c b/arb/test/t-sinc_pi.c index 4bd92086..1726d207 100644 --- a/arb/test/t-sinc_pi.c +++ b/arb/test/t-sinc_pi.c @@ -56,6 +56,31 @@ int main() flint_abort(); } + if (arb_is_int(x)) + { + if (arb_is_zero(x) && !arb_is_one(y)) + { + flint_printf("FAIL: zero\n"); + flint_printf("x = "); arb_printd(x, 30); flint_printf("\n\n"); + flint_printf("y = "); arb_printd(y, 30); flint_printf("\n\n"); + flint_abort(); + } + if (arb_is_positive(x) && !arb_is_zero(y)) + { + flint_printf("FAIL: positive integer\n"); + flint_printf("x = "); arb_printd(x, 30); flint_printf("\n\n"); + flint_printf("y = "); arb_printd(y, 30); flint_printf("\n\n"); + flint_abort(); + } + if (arb_is_negative(x) && !arb_is_zero(y)) + { + flint_printf("FAIL: negative integer\n"); + flint_printf("x = "); arb_printd(x, 30); flint_printf("\n\n"); + flint_printf("y = "); arb_printd(y, 30); flint_printf("\n\n"); + flint_abort(); + } + } + arb_clear(x); arb_clear(y); arb_clear(z); diff --git a/arb_hypgeom/test/t-bessel_j.c b/arb_hypgeom/test/t-bessel_j.c new file mode 100644 index 00000000..198edd69 --- /dev/null +++ b/arb_hypgeom/test/t-bessel_j.c @@ -0,0 +1,79 @@ +/* + Copyright (C) 2020 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 . +*/ + +#include "arb_hypgeom.h" + +int main() +{ + slong iter; + flint_rand_t state; + + flint_printf("bessel_j...."); + fflush(stdout); + + flint_randinit(state); + + for (iter = 0; iter < 1000 * arb_test_multiplier(); iter++) + { + arb_t x, y, nu; + slong prec; + + arb_init(x); + arb_init(y); + arb_init(nu); + + prec = 2 + n_randint(state, 200); + + arb_randtest(nu, state, 1 + n_randint(state, 200), 1 + n_randint(state, 100)); + + arb_pos_inf(x); + arb_hypgeom_bessel_j(y, nu, x, prec); + if (arb_is_finite(nu) && !arb_is_zero(y)) + { + flint_printf("FAIL: positive infinity\n\n"); + flint_printf("x = "); arb_printd(x, 50); flint_printf("\n\n"); + flint_printf("nu = "); arb_printd(nu, 50); flint_printf("\n\n"); + flint_printf("y = "); arb_printd(y, 50); flint_printf("\n\n"); + flint_abort(); + } + + arb_neg_inf(x); + arb_hypgeom_bessel_j(y, nu, x, prec); + if (arb_is_finite(nu) && !arb_is_zero(y)) + { + flint_printf("FAIL: negative infinity\n\n"); + flint_printf("x = "); arb_printd(x, 50); flint_printf("\n\n"); + flint_printf("nu = "); arb_printd(nu, 50); flint_printf("\n\n"); + flint_printf("y = "); arb_printd(y, 50); flint_printf("\n\n"); + flint_abort(); + } + + arb_indeterminate(x); + arb_hypgeom_bessel_j(y, nu, x, prec); + if (!arf_is_nan(arb_midref(y))) + { + flint_printf("FAIL: indeterminate\n\n"); + flint_printf("x = "); arb_printd(x, 50); flint_printf("\n\n"); + flint_printf("nu = "); arb_printd(nu, 50); flint_printf("\n\n"); + flint_printf("y = "); arb_printd(y, 50); flint_printf("\n\n"); + flint_abort(); + } + + arb_clear(x); + arb_clear(y); + arb_clear(nu); + } + + flint_randclear(state); + flint_cleanup(); + flint_printf("PASS\n"); + return EXIT_SUCCESS; +} diff --git a/arb_hypgeom/test/t-bessel_y.c b/arb_hypgeom/test/t-bessel_y.c new file mode 100644 index 00000000..ee3823e3 --- /dev/null +++ b/arb_hypgeom/test/t-bessel_y.c @@ -0,0 +1,79 @@ +/* + Copyright (C) 2020 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 . +*/ + +#include "arb_hypgeom.h" + +int main() +{ + slong iter; + flint_rand_t state; + + flint_printf("bessel_y...."); + fflush(stdout); + + flint_randinit(state); + + for (iter = 0; iter < 1000 * arb_test_multiplier(); iter++) + { + arb_t x, y, nu; + slong prec; + + arb_init(x); + arb_init(y); + arb_init(nu); + + prec = 2 + n_randint(state, 200); + + arb_randtest(nu, state, 1 + n_randint(state, 200), 1 + n_randint(state, 100)); + + arb_pos_inf(x); + arb_hypgeom_bessel_y(y, nu, x, prec); + if (arb_is_finite(nu) && !arb_is_zero(y)) + { + flint_printf("FAIL: positive infinity\n\n"); + flint_printf("x = "); arb_printd(x, 50); flint_printf("\n\n"); + flint_printf("nu = "); arb_printd(nu, 50); flint_printf("\n\n"); + flint_printf("y = "); arb_printd(y, 50); flint_printf("\n\n"); + flint_abort(); + } + + arb_neg_inf(x); + arb_hypgeom_bessel_y(y, nu, x, prec); + if (arb_is_finite(nu) && !arb_is_zero(y)) + { + flint_printf("FAIL: negative infinity\n\n"); + flint_printf("x = "); arb_printd(x, 50); flint_printf("\n\n"); + flint_printf("nu = "); arb_printd(nu, 50); flint_printf("\n\n"); + flint_printf("y = "); arb_printd(y, 50); flint_printf("\n\n"); + flint_abort(); + } + + arb_indeterminate(x); + arb_hypgeom_bessel_y(y, nu, x, prec); + if (!arf_is_nan(arb_midref(y))) + { + flint_printf("FAIL: indeterminate\n\n"); + flint_printf("x = "); arb_printd(x, 50); flint_printf("\n\n"); + flint_printf("nu = "); arb_printd(nu, 50); flint_printf("\n\n"); + flint_printf("y = "); arb_printd(y, 50); flint_printf("\n\n"); + flint_abort(); + } + + arb_clear(x); + arb_clear(y); + arb_clear(nu); + } + + flint_randclear(state); + flint_cleanup(); + flint_printf("PASS\n"); + return EXIT_SUCCESS; +}