#include "fmpz_vec.h"
#include "fmpz_mod_poly.h"
#include "padic.h"
#include "padic_poly.h"
static void
_fmpz_vec_neg_mod(fmpz * a, const fmpz * b, slong len, const fmpz_t m)
{
slong i;
for (i = 0; i < len; i++)
{
fmpz_neg(a + i, b + i);
if (fmpz_sgn(a + i) < 0)
fmpz_add(a + i, a + i, m);
}
}
void padic_poly_neg(padic_poly_t f, const padic_poly_t g,
const padic_ctx_t ctx)
{
const slong len = g->length;
if (len == 0 || g->val >= padic_poly_prec(f))
{
padic_poly_zero(f);
}
else
{
fmpz_t pow;
int alloc;
padic_poly_fit_length(f, len);
_padic_poly_set_length(f, len);
f->val = g->val;
alloc = _padic_ctx_pow_ui(pow, padic_poly_prec(f) - f->val, ctx);
if (padic_poly_prec(f) >= padic_poly_prec(g))
{
_fmpz_vec_neg_mod(f->coeffs, g->coeffs, len, pow);
}
else
{
_fmpz_vec_scalar_mod_fmpz(f->coeffs, g->coeffs, len, pow);
_fmpz_vec_neg_mod(f->coeffs, f->coeffs, len, pow);
_padic_poly_normalise(f);
}
if (alloc)
fmpz_clear(pow);
}
}