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