Skip to content

Commit 513311e

Browse files
Make _nmod_poly_sin_series, _nmod_poly_cos_series wrap generics
1 parent dc0c558 commit 513311e

3 files changed

Lines changed: 30 additions & 86 deletions

File tree

doc/source/nmod_poly.rst

Lines changed: 6 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -2431,23 +2431,19 @@ of polynomial multiplication.
24312431

24322432
Set `g = \operatorname{asinh}(h) + O(x^n)`.
24332433

2434-
.. function:: void _nmod_poly_sin_series(nn_ptr g, nn_srcptr h, slong n, nmod_t mod)
2434+
.. function:: void _nmod_poly_sin_series(nn_ptr g, nn_srcptr h, slong hlen, slong n, nmod_t mod)
24352435

2436-
Set `g = \operatorname{sin}(h) + O(x^n)`. Assumes `n > 0` and that `h`
2437-
is zero-padded as necessary to length `n`. Aliasing of `g` and `h` is
2438-
allowed. The value is computed using the identity
2439-
`\sin(x) = 2 \tan(x/2)) / (1 + \tan^2(x/2)).`
2436+
Set `g = \operatorname{sin}(h) + O(x^n)`. Assumes `n > 0` and `hlen > 0`.
2437+
Aliasing of `g` and `h` is allowed.
24402438

24412439
.. function:: void nmod_poly_sin_series(nmod_poly_t g, const nmod_poly_t h, slong n)
24422440

24432441
Set `g = \operatorname{sin}(h) + O(x^n)`.
24442442

2445-
.. function:: void _nmod_poly_cos_series(nn_ptr g, nn_srcptr h, slong n, nmod_t mod)
2443+
.. function:: void _nmod_poly_cos_series(nn_ptr g, nn_srcptr h, slong hlen, slong n, nmod_t mod)
24462444

2447-
Set `g = \operatorname{cos}(h) + O(x^n)`. Assumes `n > 0` and that `h`
2448-
is zero-padded as necessary to length `n`. Aliasing of `g` and `h` is
2449-
allowed. The value is computed using the identity
2450-
`\cos(x) = (1-\tan^2(x/2)) / (1 + \tan^2(x/2)).`
2445+
Set `g = \operatorname{cos}(h) + O(x^n)`. Assumes `n > 0` and `hlen > 0`.
2446+
Aliasing of `g` and `h` is allowed.`
24512447

24522448
.. function:: void nmod_poly_cos_series(nmod_poly_t g, const nmod_poly_t h, slong n)
24532449

src/nmod_poly.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -854,10 +854,10 @@ void nmod_poly_tan_series(nmod_poly_t g, const nmod_poly_t h, slong n);
854854
void _nmod_poly_asin_series(nn_ptr g, nn_srcptr h, slong hlen, slong n, nmod_t mod);
855855
void nmod_poly_asin_series(nmod_poly_t g, const nmod_poly_t h, slong n);
856856

857-
void _nmod_poly_sin_series(nn_ptr g, nn_srcptr h, slong n, nmod_t mod);
857+
void _nmod_poly_sin_series(nn_ptr g, nn_srcptr h, slong hlen, slong n, nmod_t mod);
858858
void nmod_poly_sin_series(nmod_poly_t g, const nmod_poly_t h, slong n);
859859

860-
void _nmod_poly_cos_series(nn_ptr g, nn_srcptr h, slong n, nmod_t mod);
860+
void _nmod_poly_cos_series(nn_ptr g, nn_srcptr h, slong hlen, slong n, nmod_t mod);
861861
void nmod_poly_cos_series(nmod_poly_t g, const nmod_poly_t h, slong n);
862862

863863
void _nmod_poly_asinh_series(nn_ptr g, nn_srcptr h, slong hlen, slong n, nmod_t mod);

src/nmod_poly/trig_series.c

Lines changed: 22 additions & 74 deletions
Original file line numberDiff line numberDiff line change
@@ -204,62 +204,36 @@ nmod_poly_cosh_series(nmod_poly_t g, const nmod_poly_t h, slong n)
204204
}
205205

206206
void
207-
_nmod_poly_cos_series(nn_ptr g, nn_srcptr h, slong n, nmod_t mod)
207+
_nmod_poly_cos_series(nn_ptr g, nn_srcptr h, slong hlen, slong n, nmod_t mod)
208208
{
209-
nn_ptr t, u;
210-
211-
t = _nmod_vec_init(n);
212-
u = _nmod_vec_init(n);
213-
214-
/* cos(x) = (1-tan(x/2)^2)/(1+tan(x/2)^2) */
215-
_nmod_vec_scalar_mul_nmod(u, h, n, n_invmod(UWORD(2), mod.n), mod);
216-
_nmod_poly_tan_series(t, u, n, n, mod);
217-
_nmod_poly_mullow(u, t, n, t, n, n, mod);
218-
_nmod_vec_neg(t, u, n, mod);
219-
t[0] = u[0] = UWORD(1);
220-
_nmod_poly_div_series(g, t, n, u, n, n, mod);
221-
222-
_nmod_vec_clear(t);
223-
_nmod_vec_clear(u);
209+
gr_ctx_t ctx;
210+
_gr_ctx_init_nmod(ctx, &mod);
211+
GR_MUST_SUCCEED(_gr_poly_cos_series(g, h, hlen, n, ctx));
224212
}
225213

226214
void
227215
nmod_poly_cos_series(nmod_poly_t g, const nmod_poly_t h, slong n)
228216
{
229-
nn_ptr h_coeffs;
230-
slong h_len = h->length;
217+
slong hlen = h->length;
231218

232-
if (h_len > 0 && h->coeffs[0] != UWORD(0))
219+
if (hlen > 0 && h->coeffs[0] != UWORD(0))
233220
{
234221
flint_throw(FLINT_ERROR, "Exception (nmod_poly_cos_series). Constant term != 0.\n");
235222
}
236223

237-
if (h_len == 1 || n < 2)
224+
if (n <= 1 || hlen <= 1)
238225
{
239-
nmod_poly_zero(g);
240-
if (n > 0)
241-
nmod_poly_set_coeff_ui(g, 0, UWORD(1));
226+
if (n == 0)
227+
nmod_poly_zero(g);
228+
else
229+
nmod_poly_one(g);
242230
return;
243231
}
244232

245233
nmod_poly_fit_length(g, n);
246-
247-
if (h_len < n)
248-
{
249-
h_coeffs = _nmod_vec_init(n);
250-
flint_mpn_copyi(h_coeffs, h->coeffs, h_len);
251-
flint_mpn_zero(h_coeffs + h_len, n - h_len);
252-
}
253-
else
254-
h_coeffs = h->coeffs;
255-
256-
_nmod_poly_cos_series(g->coeffs, h_coeffs, n, h->mod);
257-
258-
if (h_len < n)
259-
_nmod_vec_clear(h_coeffs);
260-
234+
_nmod_poly_cos_series(g->coeffs, h->coeffs, hlen, n, h->mod);
261235
g->length = n;
262-
_nmod_poly_normalise(g);
236+
_nmod_poly_normalise(g);
263237
}
264238

265239
void
@@ -329,58 +303,32 @@ nmod_poly_sinh_series(nmod_poly_t g, const nmod_poly_t h, slong n)
329303
}
330304

331305
void
332-
_nmod_poly_sin_series(nn_ptr g, nn_srcptr h, slong n, nmod_t mod)
306+
_nmod_poly_sin_series(nn_ptr g, nn_srcptr h, slong hlen, slong n, nmod_t mod)
333307
{
334-
nn_ptr t, u;
335-
336-
t = _nmod_vec_init(n);
337-
u = _nmod_vec_init(n);
338-
339-
/* sin(x) = 2*tan(x/2)/(1+tan(x/2)^2) */
340-
_nmod_vec_scalar_mul_nmod(u, h, n, n_invmod(2, mod.n), mod);
341-
_nmod_poly_tan_series(t, u, n, n, mod);
342-
_nmod_poly_mullow(u, t, n, t, n, n, mod); u[0] = UWORD(1);
343-
_nmod_poly_div_series(g, t, n, u, n, n, mod);
344-
_nmod_vec_add(g, g, g, n, mod);
345-
346-
_nmod_vec_clear(t);
347-
_nmod_vec_clear(u);
308+
gr_ctx_t ctx;
309+
_gr_ctx_init_nmod(ctx, &mod);
310+
GR_MUST_SUCCEED(_gr_poly_sin_series(g, h, hlen, n, ctx));
348311
}
349312

350313
void
351314
nmod_poly_sin_series(nmod_poly_t g, const nmod_poly_t h, slong n)
352315
{
353-
nn_ptr h_coeffs;
354-
slong h_len = h->length;
316+
slong hlen = h->length;
355317

356-
if (h_len > 0 && h->coeffs[0] != UWORD(0))
318+
if (hlen > 0 && h->coeffs[0] != UWORD(0))
357319
{
358320
flint_throw(FLINT_ERROR, "Exception (nmod_poly_sin_series). Constant term != 0.\n");
359321
}
360322

361-
if (h_len == 1 || n < 2)
323+
if (hlen <= 1 || n <= 1)
362324
{
363325
nmod_poly_zero(g);
364326
return;
365327
}
366328

367329
nmod_poly_fit_length(g, n);
368-
369-
if (h_len < n)
370-
{
371-
h_coeffs = _nmod_vec_init(n);
372-
flint_mpn_copyi(h_coeffs, h->coeffs, h_len);
373-
flint_mpn_zero(h_coeffs + h_len, n - h_len);
374-
}
375-
else
376-
h_coeffs = h->coeffs;
377-
378-
_nmod_poly_sin_series(g->coeffs, h_coeffs, n, h->mod);
379-
380-
if (h_len < n)
381-
_nmod_vec_clear(h_coeffs);
382-
383-
g->length = n;
330+
_nmod_poly_sin_series(g->coeffs, h->coeffs, hlen, n, h->mod);
331+
_nmod_poly_set_length(g, n);
384332
_nmod_poly_normalise(g);
385333
}
386334

0 commit comments

Comments
 (0)