#include "mpoly.h"
#include "fmpz_mod_mpoly.h"
void fmpz_mod_mpoly_fit_length_fit_bits(
fmpz_mod_mpoly_t A,
slong len,
flint_bitcnt_t bits,
const fmpz_mod_mpoly_ctx_t ctx)
{
slong i, N = mpoly_words_per_exp(A->bits, ctx->minfo);
if (len > A->coeffs_alloc)
{
slong old_alloc = A->coeffs_alloc;
slong new_alloc = FLINT_MAX(len, 2*old_alloc);
A->coeffs_alloc = new_alloc;
A->coeffs = (fmpz*) flint_realloc(A->coeffs, new_alloc*sizeof(fmpz));
for (i = old_alloc; i < new_alloc; i++)
fmpz_init(A->coeffs + i);
}
if (bits > A->bits)
{
slong newN = mpoly_words_per_exp(bits, ctx->minfo);
slong new_exps_alloc = newN*len;
ulong * t;
if (len < 1)
{
A->bits = bits;
return;
}
t = (ulong *) flint_malloc(new_exps_alloc*sizeof(ulong));
if (A->length > 0)
mpoly_repack_monomials(t, bits, A->exps, A->bits, A->length, ctx->minfo);
if (A->exps_alloc > 0)
flint_free(A->exps);
A->exps = t;
A->exps_alloc = new_exps_alloc;
A->bits = bits;
}
else
{
if (N*len > A->exps_alloc)
{
A->exps_alloc = FLINT_MAX(N*len, 2*A->exps_alloc);
A->exps = flint_realloc(A->exps, A->exps_alloc*sizeof(ulong));
}
}
}