1 /*
2 Copyright (C) 2015 Fredrik Johansson
3 Copyright (C) 2020 D.H.J. Polymath
4
5 This file is part of Arb.
6
7 Arb is free software: you can redistribute it and/or modify it under
8 the terms of the GNU Lesser General Public License (LGPL) as published
9 by the Free Software Foundation; either version 2.1 of the License, or
10 (at your option) any later version. See <http://www.gnu.org/licenses/>.
11 */
12
13 #include "acb.h"
14
15 void
acb_csc_pi(acb_t res,const acb_t z,slong prec)16 acb_csc_pi(acb_t res, const acb_t z, slong prec)
17 {
18 if (acb_contains_zero(z) || !acb_is_finite(z))
19 {
20 acb_indeterminate(res);
21 }
22 else if (arb_is_zero(acb_imagref(z)))
23 {
24 arb_csc_pi(acb_realref(res), acb_realref(z), prec);
25 arb_zero(acb_imagref(res));
26 }
27 else if (arb_is_zero(acb_realref(z)))
28 {
29 arb_const_pi(acb_realref(res), prec);
30 arb_mul(acb_imagref(res), acb_imagref(z), acb_realref(res), prec);
31 arb_csch(acb_imagref(res), acb_imagref(res), prec);
32 arb_neg(acb_imagref(res), acb_imagref(res));
33 arb_zero(acb_realref(res));
34 }
35 else
36 {
37 if (arf_cmpabs_2exp_si(arb_midref(acb_imagref(z)), 0) > 0)
38 {
39 acb_t t;
40 acb_init(t);
41
42 if (arf_sgn(arb_midref(acb_imagref(z))) < 0)
43 {
44 acb_neg(t, z);
45 acb_exp_pi_i(t, t, prec + 4);
46 acb_mul(res, t, t, prec + 4);
47 acb_sub_ui(res, res, 1, prec + 4);
48 acb_div(res, t, res, prec);
49 acb_neg(res, res);
50 }
51 else
52 {
53 acb_exp_pi_i(t, z, prec + 4);
54 acb_mul(res, t, t, prec + 4);
55 acb_sub_ui(res, res, 1, prec + 4);
56 acb_div(res, t, res, prec);
57 }
58
59 acb_mul_2exp_si(res, res, 1);
60 acb_mul_onei(res, res);
61 acb_clear(t);
62 }
63 else
64 {
65 acb_sin_pi(res, z, prec + 4);
66 acb_inv(res, res, prec);
67 }
68 }
69 }
70
71