void fmpq_poly_derivative(fmpq_poly_t res, const fmpq_poly_t poly) { slong len = poly->length; if (len < 2) { fmpq_poly_zero(res); return; } fmpq_poly_fit_length(res, len - 1); _fmpq_poly_derivative(res->coeffs, res->den, poly->coeffs, poly->den, len); _fmpq_poly_set_length(res, len - 1); }
void _fmpq_poly_log_series(fmpz * g, fmpz_t gden, const fmpz * f, const fmpz_t fden, long n) { fmpz * f_diff; fmpz * f_inv; fmpz_t f_diff_den; fmpz_t f_inv_den; f_diff = _fmpz_vec_init(n); f_inv = _fmpz_vec_init(n); fmpz_init(f_diff_den); fmpz_init(f_inv_den); _fmpq_poly_derivative(f_diff, f_diff_den, f, fden, n); _fmpq_poly_inv_series(f_inv, f_inv_den, f, fden, n); _fmpq_poly_mullow(g, gden, f_diff, f_diff_den, n - 1, f_inv, f_inv_den, n - 1, n - 1); _fmpq_poly_integral(g, gden, g, gden, n); _fmpz_vec_clear(f_diff, n); _fmpz_vec_clear(f_inv, n); fmpz_clear(f_diff_den); fmpz_clear(f_inv_den); }