1 /*
2     Copyright (C) 2012 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.h"
13 
14 void
arb_sin_pi(arb_t y,const arb_t x,slong prec)15 arb_sin_pi(arb_t y, const arb_t x, slong prec)
16 {
17     arb_t t;
18     arb_t u;
19     fmpz_t v;
20 
21     if (!arb_is_finite(x))
22     {
23         arb_indeterminate(y);
24         return;
25     }
26 
27     if (arf_cmpabs_2exp_si(arb_midref(x), FLINT_MAX(65536, (4*prec))) > 0)
28     {
29         arf_zero(arb_midref(y));
30         mag_one(arb_radref(y));
31         return;
32     }
33 
34     arb_init(t);
35     arb_init(u);
36     fmpz_init(v);
37 
38     arb_mul_2exp_si(t, x, 1);
39     arf_get_fmpz(v, arb_midref(t), ARF_RND_NEAR);
40     arb_sub_fmpz(t, t, v, prec);
41 
42     arb_const_pi(u, prec);
43     arb_mul(t, t, u, prec);
44     arb_mul_2exp_si(t, t, -1);
45 
46     switch (fmpz_fdiv_ui(v, 4))
47     {
48         case 0:
49             arb_sin(y, t, prec);
50             break;
51         case 1:
52             arb_cos(y, t, prec);
53             break;
54         case 2:
55             arb_sin(y, t, prec);
56             arb_neg(y, y);
57             break;
58         default:
59             arb_cos(y, t, prec);
60             arb_neg(y, y);
61             break;
62     }
63 
64     fmpz_clear(v);
65     arb_clear(t);
66     arb_clear(u);
67 }
68 
69 void
arb_cos_pi(arb_t y,const arb_t x,slong prec)70 arb_cos_pi(arb_t y, const arb_t x, slong prec)
71 {
72     arb_t t;
73     arb_t u;
74     fmpz_t v;
75 
76     if (!arb_is_finite(x))
77     {
78         arb_indeterminate(y);
79         return;
80     }
81 
82     if (arf_cmpabs_2exp_si(arb_midref(x), FLINT_MAX(65536, (4*prec))) > 0)
83     {
84         arf_zero(arb_midref(y));
85         mag_one(arb_radref(y));
86         return;
87     }
88 
89     arb_init(t);
90     arb_init(u);
91     fmpz_init(v);
92 
93     arb_mul_2exp_si(t, x, 1);
94     arf_get_fmpz(v, arb_midref(t), ARF_RND_NEAR);
95     arb_sub_fmpz(t, t, v, prec);
96 
97     arb_const_pi(u, prec);
98     arb_mul(t, t, u, prec);
99     arb_mul_2exp_si(t, t, -1);
100 
101     switch (fmpz_fdiv_ui(v, 4))
102     {
103         case 0:
104             arb_cos(y, t, prec);
105             break;
106         case 1:
107             arb_sin(y, t, prec);
108             arb_neg(y, y);
109             break;
110         case 2:
111             arb_cos(y, t, prec);
112             arb_neg(y, y);
113             break;
114         default:
115             arb_sin(y, t, prec);
116             break;
117     }
118 
119     fmpz_clear(v);
120     arb_clear(t);
121     arb_clear(u);
122 }
123 
124 void
arb_sin_cos_pi(arb_t s,arb_t c,const arb_t x,slong prec)125 arb_sin_cos_pi(arb_t s, arb_t c, const arb_t x, slong prec)
126 {
127     arb_t t;
128     arb_t u;
129     fmpz_t v;
130 
131     if (!arb_is_finite(x))
132     {
133         arb_indeterminate(s);
134         arb_indeterminate(c);
135         return;
136     }
137 
138     if (arf_cmpabs_2exp_si(arb_midref(x), FLINT_MAX(65536, (4*prec))) > 0)
139     {
140         arf_zero(arb_midref(s));
141         mag_one(arb_radref(s));
142         arf_zero(arb_midref(c));
143         mag_one(arb_radref(c));
144         return;
145     }
146 
147     arb_init(t);
148     arb_init(u);
149     fmpz_init(v);
150 
151     arb_mul_2exp_si(t, x, 1);
152     arf_get_fmpz(v, arb_midref(t), ARF_RND_NEAR);
153     arb_sub_fmpz(t, t, v, prec);
154 
155     arb_const_pi(u, prec);
156     arb_mul(t, t, u, prec);
157     arb_mul_2exp_si(t, t, -1);
158 
159     switch (fmpz_fdiv_ui(v, 4))
160     {
161         case 0:
162             arb_sin_cos(s, c, t, prec);
163             break;
164         case 1:
165             arb_sin_cos(c, s, t, prec);
166             arb_neg(c, c);
167             break;
168         case 2:
169             arb_sin_cos(s, c, t, prec);
170             arb_neg(s, s);
171             arb_neg(c, c);
172             break;
173         default:
174             arb_sin_cos(c, s, t, prec);
175             arb_neg(s, s);
176             break;
177     }
178 
179     fmpz_clear(v);
180     arb_clear(t);
181     arb_clear(u);
182 }
183 
184