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