1 /*
2 Copyright (C) 2016 Fredrik Johansson
3
4 This file is part of Arb.
5
6 Arb is free software: you can redistribute it and/or modify it under
7 the terms of the GNU Lesser General Public License (LGPL) as published
8 by the Free Software Foundation; either version 2.1 of the License, or
9 (at your option) any later version. See <http://www.gnu.org/licenses/>.
10 */
11
12 #include "arb_hypgeom.h"
13 #include "acb_hypgeom.h"
14
15 void
arb_hypgeom_erf(arb_t res,const arb_t z,slong prec)16 arb_hypgeom_erf(arb_t res, const arb_t z, slong prec)
17 {
18 if (!arb_is_finite(z))
19 {
20 arb_indeterminate(res);
21 }
22 else
23 {
24 acb_t t;
25 acb_init(t);
26 arb_set(acb_realref(t), z);
27 acb_hypgeom_erf(t, t, prec);
28 arb_swap(res, acb_realref(t));
29 acb_clear(t);
30 }
31 }
32
33 void
arb_hypgeom_erfc(arb_t res,const arb_t z,slong prec)34 arb_hypgeom_erfc(arb_t res, const arb_t z, slong prec)
35 {
36 if (!arb_is_finite(z))
37 {
38 arb_indeterminate(res);
39 }
40 else
41 {
42 acb_t t;
43 acb_init(t);
44 arb_set(acb_realref(t), z);
45 acb_hypgeom_erfc(t, t, prec);
46 arb_swap(res, acb_realref(t));
47 acb_clear(t);
48 }
49 }
50
51 void
arb_hypgeom_erfi(arb_t res,const arb_t z,slong prec)52 arb_hypgeom_erfi(arb_t res, const arb_t z, slong prec)
53 {
54 if (!arb_is_finite(z))
55 {
56 arb_indeterminate(res);
57 }
58 else
59 {
60 acb_t t;
61 acb_init(t);
62 arb_set(acb_realref(t), z);
63 acb_hypgeom_erfi(t, t, prec);
64 arb_swap(res, acb_realref(t));
65 acb_clear(t);
66 }
67 }
68
69 void
arb_hypgeom_fresnel(arb_t res1,arb_t res2,const arb_t z,int normalized,slong prec)70 arb_hypgeom_fresnel(arb_t res1, arb_t res2, const arb_t z, int normalized, slong prec)
71 {
72 if (!arb_is_finite(z))
73 {
74 if (res1 != NULL) arb_indeterminate(res1);
75 if (res2 != NULL) arb_indeterminate(res2);
76 }
77 else
78 {
79 acb_t t, u;
80 acb_init(t);
81 acb_init(u);
82 arb_set(acb_realref(t), z);
83 acb_hypgeom_fresnel(res1 ? t : NULL, res2 ? u : NULL, t, normalized, prec);
84 if (res1 != NULL) arb_swap(res1, acb_realref(t));
85 if (res2 != NULL) arb_swap(res2, acb_realref(u));
86 acb_clear(t);
87 acb_clear(u);
88 }
89 }
90
91 void
arb_hypgeom_ei(arb_t res,const arb_t z,slong prec)92 arb_hypgeom_ei(arb_t res, const arb_t z, slong prec)
93 {
94 if (!arb_is_finite(z))
95 {
96 arb_indeterminate(res);
97 }
98 else
99 {
100 acb_t t;
101 acb_init(t);
102 arb_set(acb_realref(t), z);
103 acb_hypgeom_ei(t, t, prec);
104 arb_swap(res, acb_realref(t));
105 acb_clear(t);
106 }
107 }
108
109 void
arb_hypgeom_si(arb_t res,const arb_t z,slong prec)110 arb_hypgeom_si(arb_t res, const arb_t z, slong prec)
111 {
112 if (!arb_is_finite(z))
113 {
114 arb_indeterminate(res);
115 }
116 else
117 {
118 acb_t t;
119 acb_init(t);
120 arb_set(acb_realref(t), z);
121 acb_hypgeom_si(t, t, prec);
122 arb_swap(res, acb_realref(t));
123 acb_clear(t);
124 }
125 }
126
127 void
arb_hypgeom_ci(arb_t res,const arb_t z,slong prec)128 arb_hypgeom_ci(arb_t res, const arb_t z, slong prec)
129 {
130 if (!arb_is_finite(z) || !arb_is_positive(z))
131 {
132 arb_indeterminate(res);
133 }
134 else
135 {
136 acb_t t;
137 acb_init(t);
138 arb_set(acb_realref(t), z);
139 acb_hypgeom_ci(t, t, prec);
140 arb_swap(res, acb_realref(t));
141 acb_clear(t);
142 }
143 }
144
145 void
arb_hypgeom_shi(arb_t res,const arb_t z,slong prec)146 arb_hypgeom_shi(arb_t res, const arb_t z, slong prec)
147 {
148 if (!arb_is_finite(z))
149 {
150 arb_indeterminate(res);
151 }
152 else
153 {
154 acb_t t;
155 acb_init(t);
156 arb_set(acb_realref(t), z);
157 acb_hypgeom_shi(t, t, prec);
158 arb_swap(res, acb_realref(t));
159 acb_clear(t);
160 }
161 }
162
163 void
arb_hypgeom_chi(arb_t res,const arb_t z,slong prec)164 arb_hypgeom_chi(arb_t res, const arb_t z, slong prec)
165 {
166 if (!arb_is_finite(z) || !arb_is_positive(z))
167 {
168 arb_indeterminate(res);
169 }
170 else
171 {
172 acb_t t;
173 acb_init(t);
174 arb_set(acb_realref(t), z);
175 acb_hypgeom_chi(t, t, prec);
176 arb_swap(res, acb_realref(t));
177 acb_clear(t);
178 }
179 }
180
181 void
arb_hypgeom_li(arb_t res,const arb_t z,int offset,slong prec)182 arb_hypgeom_li(arb_t res, const arb_t z, int offset, slong prec)
183 {
184 if (!arb_is_finite(z) || !arb_is_nonnegative(z))
185 {
186 arb_indeterminate(res);
187 }
188 else
189 {
190 acb_t t;
191 acb_init(t);
192 arb_set(acb_realref(t), z);
193 acb_hypgeom_li(t, t, offset, prec);
194 arb_swap(res, acb_realref(t));
195 acb_clear(t);
196 }
197 }
198
199 void
arb_hypgeom_0f1(arb_t res,const arb_t a,const arb_t z,int regularized,slong prec)200 arb_hypgeom_0f1(arb_t res, const arb_t a, const arb_t z, int regularized, slong prec)
201 {
202 acb_t t, u;
203 acb_init(t);
204 acb_init(u);
205 arb_set(acb_realref(t), a);
206 arb_set(acb_realref(u), z);
207 acb_hypgeom_0f1(t, t, u, regularized, prec);
208 if (acb_is_finite(t) && acb_is_real(t))
209 arb_swap(res, acb_realref(t));
210 else
211 arb_indeterminate(res);
212 acb_clear(t);
213 acb_clear(u);
214 }
215
216 void
arb_hypgeom_m(arb_t res,const arb_t a,const arb_t b,const arb_t z,int regularized,slong prec)217 arb_hypgeom_m(arb_t res, const arb_t a, const arb_t b, const arb_t z, int regularized, slong prec)
218 {
219 acb_t t, u, v;
220 acb_init(t);
221 acb_init(u);
222 acb_init(v);
223 arb_set(acb_realref(t), a);
224 arb_set(acb_realref(u), b);
225 arb_set(acb_realref(v), z);
226 acb_hypgeom_m(t, t, u, v, regularized, prec);
227 if (acb_is_finite(t) && acb_is_real(t))
228 arb_swap(res, acb_realref(t));
229 else
230 arb_indeterminate(res);
231 acb_clear(t);
232 acb_clear(u);
233 acb_clear(v);
234 }
235
236 void
arb_hypgeom_1f1(arb_t res,const arb_t a,const arb_t b,const arb_t z,int regularized,slong prec)237 arb_hypgeom_1f1(arb_t res, const arb_t a, const arb_t b, const arb_t z, int regularized, slong prec)
238 {
239 arb_hypgeom_m(res, a, b, z, regularized, prec);
240 }
241
242 void
arb_hypgeom_u(arb_t res,const arb_t a,const arb_t b,const arb_t z,slong prec)243 arb_hypgeom_u(arb_t res, const arb_t a, const arb_t b, const arb_t z, slong prec)
244 {
245 acb_t t, u, v;
246 acb_init(t);
247 acb_init(u);
248 acb_init(v);
249 arb_set(acb_realref(t), a);
250 arb_set(acb_realref(u), b);
251 arb_set(acb_realref(v), z);
252 acb_hypgeom_u(t, t, u, v, prec);
253 if (acb_is_finite(t) && acb_is_real(t))
254 arb_swap(res, acb_realref(t));
255 else
256 arb_indeterminate(res);
257 acb_clear(t);
258 acb_clear(u);
259 acb_clear(v);
260 }
261
262 void
arb_hypgeom_2f1(arb_t res,const arb_t a,const arb_t b,const arb_t c,const arb_t z,int regularized,slong prec)263 arb_hypgeom_2f1(arb_t res, const arb_t a, const arb_t b, const arb_t c, const arb_t z, int regularized, slong prec)
264 {
265 acb_t t, u, v, w;
266 acb_init(t);
267 acb_init(u);
268 acb_init(v);
269 acb_init(w);
270 arb_set(acb_realref(t), a);
271 arb_set(acb_realref(u), b);
272 arb_set(acb_realref(v), c);
273 arb_set(acb_realref(w), z);
274 acb_hypgeom_2f1(t, t, u, v, w, regularized, prec);
275 if (acb_is_finite(t) && acb_is_real(t))
276 arb_swap(res, acb_realref(t));
277 else
278 arb_indeterminate(res);
279 acb_clear(t);
280 acb_clear(u);
281 acb_clear(v);
282 acb_clear(w);
283 }
284
285 void
arb_hypgeom_pfq(arb_t res,arb_srcptr a,slong p,arb_srcptr b,slong q,const arb_t z,int regularized,slong prec)286 arb_hypgeom_pfq(arb_t res, arb_srcptr a, slong p, arb_srcptr b, slong q, const arb_t z, int regularized, slong prec)
287 {
288 acb_ptr t;
289 slong i;
290 t = _acb_vec_init(p + q + 1);
291 for (i = 0; i < p; i++)
292 arb_set(acb_realref(t + i), a + i);
293 for (i = 0; i < q; i++)
294 arb_set(acb_realref(t + p + i), b + i);
295 arb_set(acb_realref(t + p + q), z);
296 acb_hypgeom_pfq(t, t, p, t + p, q, t + p + q, regularized, prec);
297 if (acb_is_finite(t) && acb_is_real(t))
298 arb_swap(res, acb_realref(t));
299 else
300 arb_indeterminate(res);
301 _acb_vec_clear(t, p + q + 1);
302 }
303
304 void
arb_hypgeom_bessel_j(arb_t res,const arb_t nu,const arb_t z,slong prec)305 arb_hypgeom_bessel_j(arb_t res, const arb_t nu, const arb_t z, slong prec)
306 {
307 acb_t t, u;
308 acb_init(t);
309 acb_init(u);
310 arb_set(acb_realref(t), nu);
311 arb_set(acb_realref(u), z);
312 acb_hypgeom_bessel_j(t, t, u, prec);
313 if (acb_is_finite(t) && acb_is_real(t))
314 arb_swap(res, acb_realref(t));
315 else
316 arb_indeterminate(res);
317 acb_clear(t);
318 acb_clear(u);
319 }
320
321 void
arb_hypgeom_bessel_y(arb_t res,const arb_t nu,const arb_t z,slong prec)322 arb_hypgeom_bessel_y(arb_t res, const arb_t nu, const arb_t z, slong prec)
323 {
324 acb_t t, u;
325 acb_init(t);
326 acb_init(u);
327 arb_set(acb_realref(t), nu);
328 arb_set(acb_realref(u), z);
329 acb_hypgeom_bessel_y(t, t, u, prec);
330 if (acb_is_finite(t) && acb_is_real(t))
331 arb_swap(res, acb_realref(t));
332 else
333 arb_indeterminate(res);
334 acb_clear(t);
335 acb_clear(u);
336 }
337
338 void
arb_hypgeom_bessel_jy(arb_t res1,arb_t res2,const arb_t nu,const arb_t z,slong prec)339 arb_hypgeom_bessel_jy(arb_t res1, arb_t res2, const arb_t nu, const arb_t z, slong prec)
340 {
341 acb_t t, u;
342 acb_init(t);
343 acb_init(u);
344 arb_set(acb_realref(t), nu);
345 arb_set(acb_realref(u), z);
346 acb_hypgeom_bessel_jy(t, u, t, u, prec);
347 if (acb_is_finite(t) && acb_is_real(t))
348 arb_swap(res1, acb_realref(t));
349 else
350 arb_indeterminate(res1);
351 if (acb_is_finite(u) && acb_is_real(u))
352 arb_swap(res2, acb_realref(u));
353 else
354 arb_indeterminate(res2);
355 acb_clear(t);
356 acb_clear(u);
357 }
358
359 void
arb_hypgeom_bessel_i(arb_t res,const arb_t nu,const arb_t z,slong prec)360 arb_hypgeom_bessel_i(arb_t res, const arb_t nu, const arb_t z, slong prec)
361 {
362 acb_t t, u;
363 acb_init(t);
364 acb_init(u);
365 arb_set(acb_realref(t), nu);
366 arb_set(acb_realref(u), z);
367 acb_hypgeom_bessel_i(t, t, u, prec);
368 if (acb_is_finite(t) && acb_is_real(t))
369 arb_swap(res, acb_realref(t));
370 else
371 arb_indeterminate(res);
372 acb_clear(t);
373 acb_clear(u);
374 }
375
376 void
arb_hypgeom_bessel_i_scaled(arb_t res,const arb_t nu,const arb_t z,slong prec)377 arb_hypgeom_bessel_i_scaled(arb_t res, const arb_t nu, const arb_t z, slong prec)
378 {
379 acb_t t, u;
380 acb_init(t);
381 acb_init(u);
382 arb_set(acb_realref(t), nu);
383 arb_set(acb_realref(u), z);
384 acb_hypgeom_bessel_i_scaled(t, t, u, prec);
385 if (acb_is_finite(t) && acb_is_real(t))
386 arb_swap(res, acb_realref(t));
387 else
388 arb_indeterminate(res);
389 acb_clear(t);
390 acb_clear(u);
391 }
392
393 void
arb_hypgeom_bessel_k(arb_t res,const arb_t nu,const arb_t z,slong prec)394 arb_hypgeom_bessel_k(arb_t res, const arb_t nu, const arb_t z, slong prec)
395 {
396 acb_t t, u;
397 acb_init(t);
398 acb_init(u);
399 arb_set(acb_realref(t), nu);
400 arb_set(acb_realref(u), z);
401 acb_hypgeom_bessel_k(t, t, u, prec);
402 if (acb_is_finite(t) && acb_is_real(t))
403 arb_swap(res, acb_realref(t));
404 else
405 arb_indeterminate(res);
406 acb_clear(t);
407 acb_clear(u);
408 }
409
410 void
arb_hypgeom_bessel_k_scaled(arb_t res,const arb_t nu,const arb_t z,slong prec)411 arb_hypgeom_bessel_k_scaled(arb_t res, const arb_t nu, const arb_t z, slong prec)
412 {
413 acb_t t, u;
414 acb_init(t);
415 acb_init(u);
416 arb_set(acb_realref(t), nu);
417 arb_set(acb_realref(u), z);
418 acb_hypgeom_bessel_k_scaled(t, t, u, prec);
419 if (acb_is_finite(t) && acb_is_real(t))
420 arb_swap(res, acb_realref(t));
421 else
422 arb_indeterminate(res);
423 acb_clear(t);
424 acb_clear(u);
425 }
426
427 void
arb_hypgeom_expint(arb_t res,const arb_t s,const arb_t z,slong prec)428 arb_hypgeom_expint(arb_t res, const arb_t s, const arb_t z, slong prec)
429 {
430 acb_t t, u;
431 acb_init(t);
432 acb_init(u);
433 arb_set(acb_realref(t), s);
434 arb_set(acb_realref(u), z);
435 acb_hypgeom_expint(t, t, u, prec);
436 if (acb_is_finite(t) && acb_is_real(t))
437 arb_swap(res, acb_realref(t));
438 else
439 arb_indeterminate(res);
440 acb_clear(t);
441 acb_clear(u);
442 }
443
444 void
arb_hypgeom_gamma_lower(arb_t res,const arb_t s,const arb_t z,int regularized,slong prec)445 arb_hypgeom_gamma_lower(arb_t res, const arb_t s, const arb_t z, int regularized, slong prec)
446 {
447 acb_t t, u;
448 acb_init(t);
449 acb_init(u);
450 arb_set(acb_realref(t), s);
451 arb_set(acb_realref(u), z);
452 acb_hypgeom_gamma_lower(t, t, u, regularized, prec);
453 if (acb_is_finite(t) && acb_is_real(t))
454 arb_swap(res, acb_realref(t));
455 else
456 arb_indeterminate(res);
457 acb_clear(t);
458 acb_clear(u);
459 }
460
461 void
arb_hypgeom_gamma_upper(arb_t res,const arb_t s,const arb_t z,int regularized,slong prec)462 arb_hypgeom_gamma_upper(arb_t res, const arb_t s, const arb_t z, int regularized, slong prec)
463 {
464 acb_t t, u;
465 acb_init(t);
466 acb_init(u);
467 arb_set(acb_realref(t), s);
468 arb_set(acb_realref(u), z);
469 acb_hypgeom_gamma_upper(t, t, u, regularized, prec);
470 if (acb_is_finite(t) && acb_is_real(t))
471 arb_swap(res, acb_realref(t));
472 else
473 arb_indeterminate(res);
474 acb_clear(t);
475 acb_clear(u);
476 }
477
478 void
arb_hypgeom_beta_lower(arb_t res,const arb_t a,const arb_t b,const arb_t z,int regularized,slong prec)479 arb_hypgeom_beta_lower(arb_t res, const arb_t a, const arb_t b, const arb_t z, int regularized, slong prec)
480 {
481 acb_t t, u, v;
482 acb_init(t);
483 acb_init(u);
484 acb_init(v);
485 arb_set(acb_realref(t), a);
486 arb_set(acb_realref(u), b);
487 arb_set(acb_realref(v), z);
488 acb_hypgeom_beta_lower(t, t, u, v, regularized, prec);
489 if (acb_is_finite(t) && acb_is_real(t))
490 arb_swap(res, acb_realref(t));
491 else
492 arb_indeterminate(res);
493 acb_clear(t);
494 acb_clear(u);
495 acb_clear(v);
496 }
497
498 void
arb_hypgeom_chebyshev_t(arb_t res,const arb_t nu,const arb_t z,slong prec)499 arb_hypgeom_chebyshev_t(arb_t res, const arb_t nu, const arb_t z, slong prec)
500 {
501 acb_t t, u;
502 acb_init(t);
503 acb_init(u);
504 arb_set(acb_realref(t), nu);
505 arb_set(acb_realref(u), z);
506 acb_hypgeom_chebyshev_t(t, t, u, prec);
507 if (acb_is_finite(t) && acb_is_real(t))
508 arb_swap(res, acb_realref(t));
509 else
510 arb_indeterminate(res);
511 acb_clear(t);
512 acb_clear(u);
513 }
514
515 void
arb_hypgeom_chebyshev_u(arb_t res,const arb_t nu,const arb_t z,slong prec)516 arb_hypgeom_chebyshev_u(arb_t res, const arb_t nu, const arb_t z, slong prec)
517 {
518 acb_t t, u;
519 acb_init(t);
520 acb_init(u);
521 arb_set(acb_realref(t), nu);
522 arb_set(acb_realref(u), z);
523 acb_hypgeom_chebyshev_u(t, t, u, prec);
524 if (acb_is_finite(t) && acb_is_real(t))
525 arb_swap(res, acb_realref(t));
526 else
527 arb_indeterminate(res);
528 acb_clear(t);
529 acb_clear(u);
530 }
531
532 void
arb_hypgeom_jacobi_p(arb_t res,const arb_t n,const arb_t a,const arb_t b,const arb_t z,slong prec)533 arb_hypgeom_jacobi_p(arb_t res, const arb_t n, const arb_t a, const arb_t b, const arb_t z, slong prec)
534 {
535 acb_t t, u, v, w;
536 acb_init(t);
537 acb_init(u);
538 acb_init(v);
539 acb_init(w);
540 arb_set(acb_realref(t), n);
541 arb_set(acb_realref(u), a);
542 arb_set(acb_realref(v), b);
543 arb_set(acb_realref(w), z);
544 acb_hypgeom_jacobi_p(t, t, u, v, w, prec);
545 if (acb_is_finite(t) && acb_is_real(t))
546 arb_swap(res, acb_realref(t));
547 else
548 arb_indeterminate(res);
549 acb_clear(t);
550 acb_clear(u);
551 acb_clear(v);
552 acb_clear(w);
553 }
554
555 void
arb_hypgeom_gegenbauer_c(arb_t res,const arb_t n,const arb_t m,const arb_t z,slong prec)556 arb_hypgeom_gegenbauer_c(arb_t res, const arb_t n, const arb_t m, const arb_t z, slong prec)
557 {
558 acb_t t, u, v;
559 acb_init(t);
560 acb_init(u);
561 acb_init(v);
562 arb_set(acb_realref(t), n);
563 arb_set(acb_realref(u), m);
564 arb_set(acb_realref(v), z);
565 acb_hypgeom_gegenbauer_c(t, t, u, v, prec);
566 if (acb_is_finite(t) && acb_is_real(t))
567 arb_swap(res, acb_realref(t));
568 else
569 arb_indeterminate(res);
570 acb_clear(t);
571 acb_clear(u);
572 acb_clear(v);
573 }
574
575 void
arb_hypgeom_laguerre_l(arb_t res,const arb_t n,const arb_t m,const arb_t z,slong prec)576 arb_hypgeom_laguerre_l(arb_t res, const arb_t n, const arb_t m, const arb_t z, slong prec)
577 {
578 acb_t t, u, v;
579 acb_init(t);
580 acb_init(u);
581 acb_init(v);
582 arb_set(acb_realref(t), n);
583 arb_set(acb_realref(u), m);
584 arb_set(acb_realref(v), z);
585 acb_hypgeom_laguerre_l(t, t, u, v, prec);
586 if (acb_is_finite(t) && acb_is_real(t))
587 arb_swap(res, acb_realref(t));
588 else
589 arb_indeterminate(res);
590 acb_clear(t);
591 acb_clear(u);
592 acb_clear(v);
593 }
594
595 void
arb_hypgeom_hermite_h(arb_t res,const arb_t nu,const arb_t z,slong prec)596 arb_hypgeom_hermite_h(arb_t res, const arb_t nu, const arb_t z, slong prec)
597 {
598 acb_t t, u;
599 acb_init(t);
600 acb_init(u);
601 arb_set(acb_realref(t), nu);
602 arb_set(acb_realref(u), z);
603 acb_hypgeom_hermite_h(t, t, u, prec);
604 if (acb_is_finite(t) && acb_is_real(t))
605 arb_swap(res, acb_realref(t));
606 else
607 arb_indeterminate(res);
608 acb_clear(t);
609 acb_clear(u);
610 }
611
612 void
arb_hypgeom_legendre_q(arb_t res,const arb_t n,const arb_t m,const arb_t z,int type,slong prec)613 arb_hypgeom_legendre_q(arb_t res, const arb_t n, const arb_t m, const arb_t z, int type, slong prec)
614 {
615 acb_t t, u, v;
616 acb_init(t);
617 acb_init(u);
618 acb_init(v);
619 arb_set(acb_realref(t), n);
620 arb_set(acb_realref(u), m);
621 arb_set(acb_realref(v), z);
622 acb_hypgeom_legendre_q(t, t, u, v, type, prec);
623 if (acb_is_finite(t) && acb_is_real(t))
624 arb_swap(res, acb_realref(t));
625 else
626 arb_indeterminate(res);
627 acb_clear(t);
628 acb_clear(u);
629 acb_clear(v);
630 }
631
632 void
arb_hypgeom_dilog(arb_t res,const arb_t z,slong prec)633 arb_hypgeom_dilog(arb_t res, const arb_t z, slong prec)
634 {
635 acb_t t;
636 acb_init(t);
637 arb_set(acb_realref(t), z);
638 acb_hypgeom_dilog(t, t, prec);
639 if (acb_is_finite(t) && acb_is_real(t))
640 arb_swap(res, acb_realref(t));
641 else
642 arb_indeterminate(res);
643 acb_clear(t);
644 }
645