void _nmod_poly_div_newton(mp_ptr Q, mp_srcptr A, slong lenA, mp_srcptr B, slong lenB, nmod_t mod) { const slong lenQ = lenA - lenB + 1; mp_ptr Arev, Brev; Arev = _nmod_vec_init(2 * lenQ); Brev = Arev + lenQ; _nmod_poly_reverse(Arev, A + (lenA - lenQ), lenQ, lenQ); if (lenB >= lenQ) { _nmod_poly_reverse(Brev, B + (lenB - lenQ), lenQ, lenQ); } else { _nmod_poly_reverse(Brev, B, lenB, lenB); flint_mpn_zero(Brev + lenB, lenQ - lenB); } _nmod_poly_div_series(Q, Arev, Brev, lenQ, mod); _nmod_poly_reverse(Q, Q, lenQ, lenQ); _nmod_vec_clear(Arev); }
void _nmod_poly_atan_series(mp_ptr g, mp_srcptr h, long n, nmod_t mod) { mp_ptr t, u; t = _nmod_vec_init(n); u = _nmod_vec_init(n); /* atan(h(x)) = integral(h'(x)/(1+h(x)^2)) */ _nmod_poly_mullow(u, h, n, h, n, n, mod); u[0] = 1UL; _nmod_poly_derivative(t, h, n, mod); t[n-1] = 0UL; _nmod_poly_div_series(g, t, u, n, mod); _nmod_poly_integral(g, g, n, mod); _nmod_vec_free(t); _nmod_vec_free(u); }
void _nmod_poly_tanh_series(mp_ptr f, mp_srcptr h, long n, nmod_t mod) { mp_ptr t, u; t = _nmod_vec_init(n); u = _nmod_vec_init(n); _nmod_vec_add(t, h, h, n, mod); _nmod_poly_exp_series(u, t, n, mod); _nmod_vec_set(t, u, n); t[0] = 0UL; u[0] = 2UL; _nmod_poly_div_series(f, t, u, n, mod); _nmod_vec_free(t); _nmod_vec_free(u); }