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;
+}