#include "fmpz.h"
#include "fmpz_vec.h"
#include "fmpq_poly.h"
void
_fmpq_poly_sinh_series(fmpz * g, fmpz_t gden,
const fmpz * h, const fmpz_t hden, slong hlen, slong n)
{
fmpz * t;
fmpz_t tden;
t = _fmpz_vec_init(n);
fmpz_init(tden);
_fmpq_poly_exp_expinv_series(g, gden, t, tden, h, hden, hlen, n);
_fmpq_poly_sub(g, gden, g, gden, n, t, tden, n);
_fmpq_poly_scalar_div_ui(g, gden, g, gden, n, 2);
_fmpz_vec_clear(t, n);
fmpz_clear(tden);
}
void fmpq_poly_sinh_series(fmpq_poly_t res, const fmpq_poly_t poly, slong n)
{
if (poly->length && !fmpz_is_zero(poly->coeffs))
{
flint_throw(FLINT_ERROR, "Exception (fmpq_poly_sinh_series). Constant term != 0.\n");
}
if (poly->length == 0 || n < 2)
{
fmpq_poly_zero(res);
return;
}
fmpq_poly_fit_length(res, n);
_fmpq_poly_sinh_series(res->coeffs, res->den, poly->coeffs, poly->den, poly->length, n);
_fmpq_poly_set_length(res, n);
_fmpq_poly_normalise(res);
}