Skip to content

Commit 290bd1b

Browse files
Merge pull request #2672 from fredrik-johansson/series
Overhaul tan-like functions of power series
2 parents d709179 + 89c8aa1 commit 290bd1b

27 files changed

Lines changed: 1227 additions & 181 deletions

doc/source/gr_poly.rst

Lines changed: 53 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1178,10 +1178,26 @@ Power series special functions
11781178
int _gr_poly_cos_pi_series(gr_ptr c, gr_srcptr h, slong hlen, slong n, gr_ctx_t ctx)
11791179
int gr_poly_cos_pi_series(gr_poly_t c, const gr_poly_t h, slong n, gr_ctx_t ctx)
11801180

1181-
Compute `s = \sin(h)`, `c = \cos(h)` as power series truncated to length `m`,
1181+
Compute `s = \sin(h)`, `c = \cos(h)` as power series truncated to length `n`,
11821182
or `s = \sin(\pi h)`, `c = \cos(\pi h)` for the ``pi`` variants.
11831183
The underscore methods allow aliasing.
11841184

1185+
.. function:: int _gr_poly_tan_series(gr_ptr f, gr_srcptr h, slong hlen, slong n, gr_ctx_t ctx)
1186+
int gr_poly_tan_series(gr_poly_t f, const gr_poly_t h, slong n, gr_ctx_t ctx)
1187+
int _gr_poly_tanh_series(gr_ptr f, gr_srcptr h, slong hlen, slong n, gr_ctx_t ctx)
1188+
int gr_poly_tanh_series(gr_poly_t f, const gr_poly_t h, slong n, gr_ctx_t ctx)
1189+
int _gr_poly_cot_series(gr_ptr f, gr_srcptr h, slong hlen, slong n, gr_ctx_t ctx)
1190+
int gr_poly_cot_series(gr_poly_t f, const gr_poly_t h, slong n, gr_ctx_t ctx)
1191+
int _gr_poly_coth_series(gr_ptr f, gr_srcptr h, slong hlen, slong n, gr_ctx_t ctx)
1192+
int gr_poly_coth_series(gr_poly_t f, const gr_poly_t h, slong n, gr_ctx_t ctx)
1193+
int _gr_poly_tan_pi_series(gr_ptr f, gr_srcptr h, slong hlen, slong n, gr_ctx_t ctx)
1194+
int gr_poly_tan_pi_series(gr_poly_t f, const gr_poly_t h, slong n, gr_ctx_t ctx)
1195+
int _gr_poly_cot_pi_series(gr_ptr f, gr_srcptr h, slong hlen, slong n, gr_ctx_t ctx)
1196+
int gr_poly_cot_pi_series(gr_poly_t f, const gr_poly_t h, slong n, gr_ctx_t ctx)
1197+
1198+
Compute the respective trigonometric and hyperbolic functions of power series
1199+
truncated to length `n`. The underscore methods allow aliasing.
1200+
11851201
.. function:: int _gr_poly_sin_cos_series_basecase(gr_ptr s, gr_ptr c, gr_srcptr h, slong hlen, slong n, int times_pi, gr_ctx_t ctx)
11861202
int gr_poly_sin_cos_series_basecase(gr_poly_t s, gr_poly_t c, const gr_poly_t h, slong n, int times_pi, gr_ctx_t ctx)
11871203
int _gr_poly_sin_cos_series_tangent(gr_ptr s, gr_ptr c, gr_srcptr h, slong hlen, slong n, int times_pi, gr_ctx_t ctx)
@@ -1207,15 +1223,42 @@ Power series special functions
12071223

12081224
The *newton* version uses Newton iteration for `\exp(ih)`. The complex
12091225
parts are represented formally; complex arithmetic is not required.
1210-
The *cutoff* parameter specifies the cutoff for using the basecase
1211-
algorithm.
1212-
1213-
.. function:: int _gr_poly_tan_series_basecase(gr_ptr f, gr_srcptr h, slong hlen, slong n, gr_ctx_t ctx)
1214-
int gr_poly_tan_series_basecase(gr_poly_t f, const gr_poly_t h, slong n, gr_ctx_t ctx)
1215-
int _gr_poly_tan_series_newton(gr_ptr f, gr_srcptr h, slong hlen, slong n, slong cutoff, gr_ctx_t ctx)
1216-
int gr_poly_tan_series_newton(gr_poly_t f, const gr_poly_t h, slong n, slong cutoff, gr_ctx_t ctx)
1217-
int _gr_poly_tan_series(gr_ptr f, gr_srcptr h, slong hlen, slong n, gr_ctx_t ctx)
1218-
int gr_poly_tan_series(gr_poly_t f, const gr_poly_t h, slong n, gr_ctx_t ctx)
1226+
The *cutoff* parameter specifies the initial length to compute with the
1227+
basecase algorithm.
1228+
1229+
.. function:: int _gr_poly_tan_series_basecase(gr_ptr f, gr_srcptr h, slong hlen, slong n, int func, gr_ctx_t ctx)
1230+
int gr_poly_tan_series_basecase(gr_poly_t f, const gr_poly_t h, slong n, int func, gr_ctx_t ctx)
1231+
int _gr_poly_tan_series_newton(gr_ptr f, gr_srcptr h, slong hlen, slong n, slong cutoff, int func, gr_ctx_t ctx)
1232+
int gr_poly_tan_series_newton(gr_poly_t f, const gr_poly_t h, slong n, slong cutoff, int func, gr_ctx_t ctx)
1233+
int _gr_poly_tan_series_sine_cosine(gr_ptr f, gr_srcptr h, slong hlen, slong n, int func, gr_ctx_t ctx)
1234+
int gr_poly_tan_series_sine_cosine(gr_poly_t res, const gr_poly_t h, slong len, int func, gr_ctx_t ctx)
1235+
int _gr_poly_tan_series_exponential(gr_ptr f, gr_srcptr h, slong hlen, slong n, int func, gr_ctx_t ctx)
1236+
int gr_poly_tan_series_exponential(gr_poly_t res, const gr_poly_t h, slong len, int func, gr_ctx_t ctx)
1237+
1238+
Various algorithms to compute tangent-like functions of power series.
1239+
The *func* parameter specifies the function as follows:
1240+
1241+
* 0 - tan
1242+
* 1 - tanh
1243+
* 2 - cot
1244+
* 3 - coth
1245+
* 4 - tan_pi
1246+
* 5 - tanh_pi (not currently implemented)
1247+
* 6 - cot_pi
1248+
* 7 - coth_pi (not currently implemented)
1249+
1250+
The *basecase* algorithm uses an `O(n^2)` recurrence for the coefficients.
1251+
The *newton* algorithm uses Newton iteration to invert the integral
1252+
defining the corresponding inverse function; the *cutoff* parameter
1253+
specifies the initial length to compute with the basecase algorithm.
1254+
The *sine_cosine* algorithm computes the function as a quotient of
1255+
a sine and cosine; for the hyperbolic functions this algorithm requires that
1256+
the ring contains the imaginary unit.
1257+
The *exponential* algorithm computes the function as a quotient of
1258+
`\pm 1` plus an exponential, where the sign of the exponent is chosen
1259+
(if possible) so that the exponential is small. For the trigonometric
1260+
functions this algorithm requires that the ring contains the imaginary unit.
1261+
12191262

12201263
Modular arithmetic and composition
12211264
--------------------------------------------------------------------------------

doc/source/gr_series.rst

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -128,6 +128,11 @@ directly.
128128
int gr_series_mod_sin_cos(gr_poly_t res1, gr_poly_t res2, const gr_poly_t x, gr_ctx_t ctx)
129129
int gr_series_mod_sin_cos_pi(gr_poly_t res1, gr_poly_t res2, const gr_poly_t x, gr_ctx_t ctx)
130130
int gr_series_mod_tan(gr_poly_t res, const gr_poly_t x, gr_ctx_t ctx)
131+
int gr_series_mod_tanh(gr_poly_t res, const gr_poly_t x, gr_ctx_t ctx)
132+
int gr_series_mod_cot(gr_poly_t res, const gr_poly_t x, gr_ctx_t ctx)
133+
int gr_series_mod_coth(gr_poly_t res, const gr_poly_t x, gr_ctx_t ctx)
134+
int gr_series_mod_tan_pi(gr_poly_t res, const gr_poly_t x, gr_ctx_t ctx)
135+
int gr_series_mod_cot_pi(gr_poly_t res, const gr_poly_t x, gr_ctx_t ctx)
131136
int gr_series_mod_asin(gr_poly_t res, const gr_poly_t x, gr_ctx_t ctx)
132137
int gr_series_mod_acos(gr_poly_t res, const gr_poly_t x, gr_ctx_t ctx)
133138
int gr_series_mod_atan(gr_poly_t res, const gr_poly_t x, gr_ctx_t ctx)
@@ -260,6 +265,11 @@ directly.
260265
int gr_series_sin_cos(gr_series_t res1, gr_series_t res2, const gr_series_t x, gr_ctx_t ctx)
261266
int gr_series_sin_cos_pi(gr_series_t res1, gr_series_t res2, const gr_series_t x, gr_ctx_t ctx)
262267
int gr_series_tan(gr_series_t res, const gr_series_t x, gr_ctx_t ctx)
268+
int gr_series_tanh(gr_series_t res, const gr_series_t x, gr_ctx_t ctx)
269+
int gr_series_cot(gr_series_t res, const gr_series_t x, gr_ctx_t ctx)
270+
int gr_series_coth(gr_series_t res, const gr_series_t x, gr_ctx_t ctx)
271+
int gr_series_tan_pi(gr_series_t res, const gr_series_t x, gr_ctx_t ctx)
272+
int gr_series_cot_pi(gr_series_t res, const gr_series_t x, gr_ctx_t ctx)
263273
int gr_series_asin(gr_series_t res, const gr_series_t x, gr_ctx_t ctx)
264274
int gr_series_acos(gr_series_t res, const gr_series_t x, gr_ctx_t ctx)
265275
int gr_series_atan(gr_series_t res, const gr_series_t x, gr_ctx_t ctx)

doc/source/nmod_poly.rst

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2451,9 +2451,7 @@ of polynomial multiplication.
24512451

24522452
.. function:: void _nmod_poly_tan_series(nn_ptr g, nn_srcptr h, slong hlen, slong n, nmod_t mod)
24532453

2454-
Set `g = \operatorname{tan}(h) + O(x^n)`. Assumes `n > 0` and that `h`
2455-
is zero-padded as necessary to length `n`. Aliasing of `g` and `h` is
2456-
not allowed. Uses Newton iteration to invert the atan function.
2454+
Set `g = \operatorname{tan}(h) + O(x^n)`. Assumes `n > 0` and `hlen > 0`.
24572455

24582456
.. function:: void nmod_poly_tan_series(nmod_poly_t g, const nmod_poly_t h, slong n)
24592457

@@ -2480,11 +2478,9 @@ of polynomial multiplication.
24802478

24812479
Set `g = \operatorname{cosh}(h) + O(x^n)`.
24822480

2483-
.. function:: void _nmod_poly_tanh_series(nn_ptr g, nn_srcptr h, slong n, nmod_t mod)
2481+
.. function:: void _nmod_poly_tanh_series(nn_ptr g, nn_srcptr h, slong hlen, slong n, nmod_t mod)
24842482

2485-
Set `g = \operatorname{tanh}(h) + O(x^n)`. Assumes `n > 0` and that `h`
2486-
is zero-padded as necessary to length `n`. Uses the identity
2487-
`\tanh(x) = (e^{2x}-1)/(e^{2x}+1)`.
2483+
Set `g = \operatorname{tanh}(h) + O(x^n)`. Assumes `n > 0` and `hlen > 0`.
24882484

24892485
.. function:: void nmod_poly_tanh_series(nmod_poly_t g, const nmod_poly_t h, slong n)
24902486

src/acb_poly/cot_pi_series.c

Lines changed: 5 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
(at your option) any later version. See <https://www.gnu.org/licenses/>.
1010
*/
1111

12+
#include "gr_poly.h"
1213
#include "acb_poly.h"
1314

1415
void
@@ -23,51 +24,10 @@ _acb_poly_cot_pi_series(acb_ptr g, acb_srcptr h, slong hlen, slong len, slong pr
2324
}
2425
else
2526
{
26-
acb_ptr t, u;
27-
28-
t = _acb_vec_init(len);
29-
u = _acb_vec_init(len);
30-
31-
if (arf_cmpabs_2exp_si(arb_midref(acb_imagref(h)), 0) < 0)
32-
{
33-
_acb_poly_sin_cos_pi_series(t, u, h, hlen, len, prec);
34-
_acb_poly_div_series(g, u, len, t, len, len, prec);
35-
}
36-
else
37-
{
38-
_acb_vec_scalar_mul_2exp_si(t, h, hlen, 1);
39-
40-
if (arf_sgn(arb_midref(acb_imagref(h))) > 0)
41-
{
42-
acb_const_pi(u, prec);
43-
acb_mul_onei(u, u);
44-
_acb_vec_scalar_mul(t, t, hlen, u, prec);
45-
_acb_poly_exp_series(t, t, hlen, len, prec);
46-
acb_sub_ui(u, t, 1, prec);
47-
_acb_vec_set(u + 1, t + 1, len - 1);
48-
_acb_poly_div_series(g, t, len, u, len, len, prec);
49-
_acb_vec_scalar_mul_2exp_si(g, g, len, 1);
50-
acb_sub_ui(g, g, 1, prec);
51-
_acb_vec_scalar_mul_onei(g, g, len);
52-
}
53-
else
54-
{
55-
acb_const_pi(u, prec);
56-
acb_div_onei(u, u);
57-
_acb_vec_scalar_mul(t, t, hlen, u, prec);
58-
_acb_poly_exp_series(t, t, hlen, len, prec);
59-
acb_sub_ui(u, t, 1, prec);
60-
_acb_vec_set(u + 1, t + 1, len - 1);
61-
_acb_poly_div_series(g, t, len, u, len, len, prec);
62-
_acb_vec_scalar_mul_2exp_si(g, g, len, 1);
63-
acb_sub_ui(g, g, 1, prec);
64-
_acb_vec_scalar_mul_onei(g, g, len);
65-
_acb_vec_neg(g, g, len);
66-
}
67-
}
68-
69-
_acb_vec_clear(t, len);
70-
_acb_vec_clear(u, len);
27+
gr_ctx_t ctx;
28+
gr_ctx_init_complex_acb(ctx, prec);
29+
if (_gr_poly_cot_pi_series(g, h, hlen, len, ctx) != GR_SUCCESS)
30+
_acb_vec_indeterminate(g, len);
7131
}
7232
}
7333

src/acb_poly/tan_series.c

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -12,17 +12,12 @@
1212
#include "acb_poly.h"
1313
#include "gr_poly.h"
1414

15-
#define TAN_NEWTON_CUTOFF 20
16-
1715
void
1816
_acb_poly_tan_series(acb_ptr res, acb_srcptr h, slong hlen, slong len, slong prec)
1917
{
2018
gr_ctx_t ctx;
2119
gr_ctx_init_complex_acb(ctx, prec);
22-
23-
hlen = FLINT_MIN(hlen, len);
24-
25-
if (_gr_poly_tan_series_newton(res, h, hlen, len, TAN_NEWTON_CUTOFF, ctx) != GR_SUCCESS)
20+
if (_gr_poly_tan_series(res, h, hlen, len, ctx) != GR_SUCCESS)
2621
_acb_vec_indeterminate(res, len);
2722
}
2823

src/arb_poly/cot_pi_series.c

Lines changed: 5 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
(at your option) any later version. See <https://www.gnu.org/licenses/>.
1010
*/
1111

12+
#include "gr_poly.h"
1213
#include "arb_poly.h"
1314

1415
void
@@ -23,16 +24,10 @@ _arb_poly_cot_pi_series(arb_ptr g, arb_srcptr h, slong hlen, slong len, slong pr
2324
}
2425
else
2526
{
26-
arb_ptr t, u;
27-
28-
t = _arb_vec_init(len);
29-
u = _arb_vec_init(len);
30-
31-
_arb_poly_sin_cos_pi_series(t, u, h, hlen, len, prec);
32-
_arb_poly_div_series(g, u, len, t, len, len, prec);
33-
34-
_arb_vec_clear(t, len);
35-
_arb_vec_clear(u, len);
27+
gr_ctx_t ctx;
28+
gr_ctx_init_real_arb(ctx, prec);
29+
if (_gr_poly_cot_pi_series(g, h, hlen, len, ctx) != GR_SUCCESS)
30+
_arb_vec_indeterminate(g, len);
3631
}
3732
}
3833

src/arb_poly/tan_series.c

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -12,17 +12,12 @@
1212
#include "arb_poly.h"
1313
#include "gr_poly.h"
1414

15-
#define TAN_NEWTON_CUTOFF 20
16-
1715
void
1816
_arb_poly_tan_series(arb_ptr res, arb_srcptr h, slong hlen, slong len, slong prec)
1917
{
2018
gr_ctx_t ctx;
2119
gr_ctx_init_real_arb(ctx, prec);
22-
23-
hlen = FLINT_MIN(hlen, len);
24-
25-
if (_gr_poly_tan_series_newton(res, h, hlen, len, TAN_NEWTON_CUTOFF, ctx) != GR_SUCCESS)
20+
if (_gr_poly_tan_series(res, h, hlen, len, ctx) != GR_SUCCESS)
2621
_arb_vec_indeterminate(res, len);
2722
}
2823

src/gr/acb.c

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1188,6 +1188,8 @@ DEF_FUNC(cos)
11881188
DEF_FUNC(cos_pi)
11891189
DEF_FUNC_SING(tan)
11901190
DEF_FUNC_SING(cot)
1191+
DEF_FUNC_SING(tan_pi)
1192+
DEF_FUNC_SING(cot_pi)
11911193

11921194
DEF_FUNC(sinc)
11931195
DEF_FUNC(sinc_pi)
@@ -2343,7 +2345,9 @@ gr_method_tab_input _acb_methods_input[] =
23432345
{GR_METHOD_COS_PI, (gr_funcptr) _gr_acb_cos_pi},
23442346
{GR_METHOD_SIN_COS_PI, (gr_funcptr) _gr_acb_sin_cos_pi},
23452347
{GR_METHOD_TAN, (gr_funcptr) _gr_acb_tan},
2348+
{GR_METHOD_TAN_PI, (gr_funcptr) _gr_acb_tan_pi},
23462349
{GR_METHOD_COT, (gr_funcptr) _gr_acb_cot},
2350+
{GR_METHOD_COT_PI, (gr_funcptr) _gr_acb_cot_pi},
23472351
{GR_METHOD_SINC, (gr_funcptr) _gr_acb_sinc},
23482352
{GR_METHOD_SINC_PI, (gr_funcptr) _gr_acb_sinc_pi},
23492353
{GR_METHOD_SINH, (gr_funcptr) _gr_acb_sinh},

src/gr_generic/generic.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2874,6 +2874,7 @@ const gr_method_tab_input _gr_generic_methods[] =
28742874
{GR_METHOD_COS, (gr_funcptr) gr_generic_cos},
28752875
{GR_METHOD_SIN_COS, (gr_funcptr) gr_generic_sin_cos},
28762876
{GR_METHOD_TAN, (gr_funcptr) gr_generic_tan},
2877+
{GR_METHOD_TANH, (gr_funcptr) gr_generic_tanh},
28772878
{GR_METHOD_ASIN, (gr_funcptr) gr_generic_asin},
28782879
{GR_METHOD_ATAN, (gr_funcptr) gr_generic_atan},
28792880
{GR_METHOD_ASINH, (gr_funcptr) gr_generic_asinh},

src/gr_poly.h

Lines changed: 20 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -588,12 +588,28 @@ WARN_UNUSED_RESULT int gr_poly_sin_pi_series(gr_poly_t s, const gr_poly_t h, slo
588588
WARN_UNUSED_RESULT int gr_poly_cos_series(gr_poly_t c, const gr_poly_t h, slong n, gr_ctx_t ctx);
589589
WARN_UNUSED_RESULT int gr_poly_cos_pi_series(gr_poly_t c, const gr_poly_t h, slong n, gr_ctx_t ctx);
590590

591-
WARN_UNUSED_RESULT int _gr_poly_tan_series_basecase(gr_ptr f, gr_srcptr h, slong hlen, slong n, gr_ctx_t ctx);
592-
WARN_UNUSED_RESULT int gr_poly_tan_series_basecase(gr_poly_t f, const gr_poly_t h, slong n, gr_ctx_t ctx);
593-
WARN_UNUSED_RESULT int _gr_poly_tan_series_newton(gr_ptr f, gr_srcptr h, slong hlen, slong n, slong cutoff, gr_ctx_t ctx);
594-
WARN_UNUSED_RESULT int gr_poly_tan_series_newton(gr_poly_t f, const gr_poly_t h, slong n, slong cutoff, gr_ctx_t ctx);
591+
WARN_UNUSED_RESULT int _gr_poly_tan_series_basecase(gr_ptr f, gr_srcptr h, slong hlen, slong n, int func, gr_ctx_t ctx);
592+
WARN_UNUSED_RESULT int gr_poly_tan_series_basecase(gr_poly_t f, const gr_poly_t h, slong n, int func, gr_ctx_t ctx);
593+
WARN_UNUSED_RESULT int _gr_poly_tan_series_newton(gr_ptr f, gr_srcptr h, slong hlen, slong n, slong cutoff, int func, gr_ctx_t ctx);
594+
WARN_UNUSED_RESULT int gr_poly_tan_series_newton(gr_poly_t f, const gr_poly_t h, slong n, slong cutoff, int func, gr_ctx_t ctx);
595+
WARN_UNUSED_RESULT int _gr_poly_tan_series_sine_cosine(gr_ptr f, gr_srcptr h, slong hlen, slong n, int func, gr_ctx_t ctx);
596+
WARN_UNUSED_RESULT int gr_poly_tan_series_sine_cosine(gr_poly_t res, const gr_poly_t h, slong len, int func, gr_ctx_t ctx);
597+
WARN_UNUSED_RESULT int _gr_poly_tan_series_exponential(gr_ptr f, gr_srcptr h, slong hlen, slong n, int func, gr_ctx_t ctx);
598+
WARN_UNUSED_RESULT int gr_poly_tan_series_exponential(gr_poly_t res, const gr_poly_t h, slong len, int func, gr_ctx_t ctx);
599+
595600
WARN_UNUSED_RESULT int _gr_poly_tan_series(gr_ptr f, gr_srcptr h, slong hlen, slong n, gr_ctx_t ctx);
601+
WARN_UNUSED_RESULT int _gr_poly_tanh_series(gr_ptr f, gr_srcptr h, slong hlen, slong n, gr_ctx_t ctx);
602+
WARN_UNUSED_RESULT int _gr_poly_cot_series(gr_ptr f, gr_srcptr h, slong hlen, slong n, gr_ctx_t ctx);
603+
WARN_UNUSED_RESULT int _gr_poly_coth_series(gr_ptr f, gr_srcptr h, slong hlen, slong n, gr_ctx_t ctx);
604+
WARN_UNUSED_RESULT int _gr_poly_tan_pi_series(gr_ptr f, gr_srcptr h, slong hlen, slong n, gr_ctx_t ctx);
605+
WARN_UNUSED_RESULT int _gr_poly_cot_pi_series(gr_ptr f, gr_srcptr h, slong hlen, slong n, gr_ctx_t ctx);
596606
WARN_UNUSED_RESULT int gr_poly_tan_series(gr_poly_t f, const gr_poly_t h, slong n, gr_ctx_t ctx);
607+
WARN_UNUSED_RESULT int gr_poly_tanh_series(gr_poly_t f, const gr_poly_t h, slong n, gr_ctx_t ctx);
608+
WARN_UNUSED_RESULT int gr_poly_cot_series(gr_poly_t f, const gr_poly_t h, slong n, gr_ctx_t ctx);
609+
WARN_UNUSED_RESULT int gr_poly_coth_series(gr_poly_t f, const gr_poly_t h, slong n, gr_ctx_t ctx);
610+
WARN_UNUSED_RESULT int gr_poly_tan_pi_series(gr_poly_t f, const gr_poly_t h, slong n, gr_ctx_t ctx);
611+
WARN_UNUSED_RESULT int gr_poly_cot_pi_series(gr_poly_t f, const gr_poly_t h, slong n, gr_ctx_t ctx);
612+
597613

598614
/* Modular arithmetic and composition */
599615

0 commit comments

Comments
 (0)