@@ -34,16 +34,11 @@ Translated to C++ by SciPy developers in 2024.
3434namespace xsf {
3535
3636template <typename T>
37- T sph_bessel_j (long n, T x) {
37+ T sph_bessel_j (uint64_t n, T x) {
3838 if (std::isnan (x)) {
3939 return x;
4040 }
4141
42- if (n < 0 ) {
43- set_error (" spherical_jn" , SF_ERROR_DOMAIN, nullptr );
44- return std::numeric_limits<T>::quiet_NaN ();
45- }
46-
4742 if ((x == std::numeric_limits<T>::infinity ()) || (x == -std::numeric_limits<T>::infinity ())) {
4843 return 0 ;
4944 }
@@ -71,7 +66,7 @@ T sph_bessel_j(long n, T x) {
7166 }
7267
7368 T sn;
74- for (int i = 0 ; i < n - 1 ; ++i) {
69+ for (uint64_t i = 0 ; i < n - 1 ; ++i) {
7570 sn = (2 * i + 3 ) * s1 / x - s0;
7671 s0 = s1;
7772 s1 = sn;
@@ -85,16 +80,11 @@ T sph_bessel_j(long n, T x) {
8580}
8681
8782template <typename T>
88- std::complex <T> sph_bessel_j (long n, std::complex <T> z) {
83+ std::complex <T> sph_bessel_j (uint64_t n, std::complex <T> z) {
8984 if (std::isnan (std::real (z)) || std::isnan (std::imag (z))) {
9085 return z;
9186 }
9287
93- if (n < 0 ) {
94- set_error (" spherical_jn" , SF_ERROR_DOMAIN, nullptr );
95- return std::numeric_limits<T>::quiet_NaN ();
96- }
97-
9888 if (std::real (z) == std::numeric_limits<T>::infinity () || std::real (z) == -std::numeric_limits<T>::infinity ()) {
9989 // https://dlmf.nist.gov/10.52.E3
10090 if (std::imag (z) == 0 ) {
@@ -121,7 +111,7 @@ std::complex<T> sph_bessel_j(long n, std::complex<T> z) {
121111}
122112
123113template <typename T>
124- T sph_bessel_j_jac (long n, T z) {
114+ T sph_bessel_j_jac (uint64_t n, T z) {
125115 if (n == 0 ) {
126116 return -sph_bessel_j (1 , z);
127117 }
@@ -136,25 +126,20 @@ T sph_bessel_j_jac(long n, T z) {
136126 }
137127
138128 // DLMF 10.51.2
139- return sph_bessel_j (n - 1 , z) - static_cast <T>(n + 1 ) * sph_bessel_j (n, z) / z;
129+ return sph_bessel_j (n - 1 , z) - ( static_cast <T>(n) + 1 ) * sph_bessel_j (n, z) / z;
140130}
141131
142132template <typename T>
143- T sph_bessel_y (long n, T x) {
133+ T sph_bessel_y (uint64_t n, T x) {
144134 T s0, s1, sn;
145- int idx;
135+ uint64_t idx;
146136
147137 if (std::isnan (x)) {
148138 return x;
149139 }
150140
151- if (n < 0 ) {
152- set_error (" spherical_yn" , SF_ERROR_DOMAIN, nullptr );
153- return std::numeric_limits<T>::quiet_NaN ();
154- }
155-
156141 if (x < 0 ) {
157- return std::pow (- 1 , n + 1 ) * sph_bessel_y (n, -x);
142+ return n % 2 == 0 ? - sph_bessel_y (n, -x) : sph_bessel_y (n, -x);
158143 }
159144
160145 if (x == std::numeric_limits<T>::infinity () || x == -std::numeric_limits<T>::infinity ()) {
@@ -188,19 +173,14 @@ T sph_bessel_y(long n, T x) {
188173 return sn;
189174}
190175
191- inline float sph_bessel_y (long n, float x) { return sph_bessel_y (n, static_cast <double >(x)); }
176+ inline float sph_bessel_y (uint64_t n, float x) { return sph_bessel_y (n, static_cast <double >(x)); }
192177
193178template <typename T>
194- std::complex <T> sph_bessel_y (long n, std::complex <T> z) {
179+ std::complex <T> sph_bessel_y (uint64_t n, std::complex <T> z) {
195180 if (std::isnan (std::real (z)) || std::isnan (std::imag (z))) {
196181 return z;
197182 }
198183
199- if (n < 0 ) {
200- set_error (" spherical_yn" , SF_ERROR_DOMAIN, nullptr );
201- return std::numeric_limits<T>::quiet_NaN ();
202- }
203-
204184 if (std::real (z) == 0 && std::imag (z) == 0 ) {
205185 // https://dlmf.nist.gov/10.52.E2
206186 return std::numeric_limits<T>::quiet_NaN ();
@@ -219,25 +199,20 @@ std::complex<T> sph_bessel_y(long n, std::complex<T> z) {
219199}
220200
221201template <typename T>
222- T sph_bessel_y_jac (long n, T x) {
202+ T sph_bessel_y_jac (uint64_t n, T x) {
223203 if (n == 0 ) {
224204 return -sph_bessel_y (1 , x);
225205 }
226206
227- return sph_bessel_y (n - 1 , x) - static_cast <T>(n + 1 ) * sph_bessel_y (n, x) / x;
207+ return sph_bessel_y (n - 1 , x) - ( static_cast <T>(n) + 1 ) * sph_bessel_y (n, x) / x;
228208}
229209
230210template <typename T>
231- T sph_bessel_i (long n, T x) {
211+ T sph_bessel_i (uint64_t n, T x) {
232212 if (std::isnan (x)) {
233213 return x;
234214 }
235215
236- if (n < 0 ) {
237- set_error (" spherical_in" , SF_ERROR_DOMAIN, nullptr );
238- return std::numeric_limits<T>::quiet_NaN ();
239- }
240-
241216 if (x == 0 ) {
242217 // https://dlmf.nist.gov/10.52.E1
243218 if (n == 0 ) {
@@ -249,7 +224,7 @@ T sph_bessel_i(long n, T x) {
249224 if (std::isinf (x)) {
250225 // https://dlmf.nist.gov/10.49.E8
251226 if (x == -std::numeric_limits<T>::infinity ()) {
252- return std::pow (- 1 , n) * std::numeric_limits<T>::infinity ();
227+ return n % 2 == 0 ? std::numeric_limits<T>:: infinity () : - std::numeric_limits<T>::infinity ();
253228 }
254229
255230 return std::numeric_limits<T>::infinity ();
@@ -259,16 +234,11 @@ T sph_bessel_i(long n, T x) {
259234}
260235
261236template <typename T>
262- std::complex <T> sph_bessel_i (long n, std::complex <T> z) {
237+ std::complex <T> sph_bessel_i (uint64_t n, std::complex <T> z) {
263238 if (std::isnan (std::real (z)) || std::isnan (std::imag (z))) {
264239 return z;
265240 }
266241
267- if (n < 0 ) {
268- set_error (" spherical_in" , SF_ERROR_DOMAIN, nullptr );
269- return std::numeric_limits<T>::quiet_NaN ();
270- }
271-
272242 if (std::abs (z) == 0 ) {
273243 // https://dlmf.nist.gov/10.52.E1
274244 if (n == 0 ) {
@@ -282,7 +252,7 @@ std::complex<T> sph_bessel_i(long n, std::complex<T> z) {
282252 // https://dlmf.nist.gov/10.52.E5
283253 if (std::imag (z) == 0 ) {
284254 if (std::real (z) == -std::numeric_limits<T>::infinity ()) {
285- return std::pow (- 1 , n) * std::numeric_limits<T>::infinity ();
255+ return n % 2 == 0 ? std::numeric_limits<T>:: infinity () : - std::numeric_limits<T>::infinity ();
286256 }
287257
288258 return std::numeric_limits<T>::infinity ();
@@ -295,7 +265,7 @@ std::complex<T> sph_bessel_i(long n, std::complex<T> z) {
295265}
296266
297267template <typename T>
298- T sph_bessel_i_jac (long n, T z) {
268+ T sph_bessel_i_jac (uint64_t n, T z) {
299269 if (n == 0 ) {
300270 return sph_bessel_i (1 , z);
301271 }
@@ -308,20 +278,15 @@ T sph_bessel_i_jac(long n, T z) {
308278 }
309279 }
310280
311- return sph_bessel_i (n - 1 , z) - static_cast <T>(n + 1 ) * sph_bessel_i (n, z) / z;
281+ return sph_bessel_i (n - 1 , z) - ( static_cast <T>(n) + 1 ) * sph_bessel_i (n, z) / z;
312282}
313283
314284template <typename T>
315- T sph_bessel_k (long n, T z) {
285+ T sph_bessel_k (uint64_t n, T z) {
316286 if (std::isnan (z)) {
317287 return z;
318288 }
319289
320- if (n < 0 ) {
321- set_error (" spherical_kn" , SF_ERROR_DOMAIN, nullptr );
322- return std::numeric_limits<T>::quiet_NaN ();
323- }
324-
325290 if (z == 0 ) {
326291 return std::numeric_limits<T>::infinity ();
327292 }
@@ -339,16 +304,11 @@ T sph_bessel_k(long n, T z) {
339304}
340305
341306template <typename T>
342- std::complex <T> sph_bessel_k (long n, std::complex <T> z) {
307+ std::complex <T> sph_bessel_k (uint64_t n, std::complex <T> z) {
343308 if (std::isnan (std::real (z)) || std::isnan (std::imag (z))) {
344309 return z;
345310 }
346311
347- if (n < 0 ) {
348- set_error (" spherical_kn" , SF_ERROR_DOMAIN, nullptr );
349- return std::numeric_limits<T>::quiet_NaN ();
350- }
351-
352312 if (std::abs (z) == 0 ) {
353313 return std::numeric_limits<T>::quiet_NaN ();
354314 }
@@ -370,12 +330,12 @@ std::complex<T> sph_bessel_k(long n, std::complex<T> z) {
370330}
371331
372332template <typename T>
373- T sph_bessel_k_jac (long n, T x) {
333+ T sph_bessel_k_jac (uint64_t n, T x) {
374334 if (n == 0 ) {
375335 return -sph_bessel_k (1 , x);
376336 }
377337
378- return -sph_bessel_k (n - 1 , x) - static_cast <T>(n + 1 ) * sph_bessel_k (n, x) / x;
338+ return -sph_bessel_k (n - 1 , x) - ( static_cast <T>(n) + 1 ) * sph_bessel_k (n, x) / x;
379339}
380340
381341} // namespace xsf
0 commit comments