@@ -204,62 +204,36 @@ nmod_poly_cosh_series(nmod_poly_t g, const nmod_poly_t h, slong n)
204204}
205205
206206void
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
226214void
227215nmod_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
265239void
@@ -329,58 +303,32 @@ nmod_poly_sinh_series(nmod_poly_t g, const nmod_poly_t h, slong n)
329303}
330304
331305void
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
350313void
351314nmod_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