#include "mpoly.h"
void mpoly_max_fields_ui_sp(ulong * max_fields, const ulong * poly_exps,
slong len, flint_bitcnt_t bits, const mpoly_ctx_t mctx)
{
slong i, N;
ulong * pmax, mask;
TMP_INIT;
FLINT_ASSERT(bits <= FLINT_BITS);
N = mpoly_words_per_exp_sp(bits, mctx);
mask = mpoly_overflow_mask_sp(bits);
TMP_START;
pmax = (ulong *) TMP_ALLOC(N*sizeof(ulong));
for (i = 0; i < N; i++)
pmax[i] = 0;
for (i = 0; i < len; i++)
mpoly_monomial_max(pmax, pmax, poly_exps + N*i, bits, N, mask);
mpoly_unpack_vec_ui(max_fields, pmax, bits, mctx->nfields, 1);
TMP_END;
}
void mpoly_max_fields_fmpz(fmpz * max_fields, const ulong * poly_exps,
slong len, flint_bitcnt_t bits, const mpoly_ctx_t mctx)
{
slong i, N;
ulong * pmax, mask;
TMP_INIT;
TMP_START;
N = mpoly_words_per_exp(bits, mctx);
pmax = (ulong *) TMP_ALLOC(N*sizeof(ulong));
for (i = 0; i < N; i++)
pmax[i] = 0;
if (bits <= FLINT_BITS)
{
mask = mpoly_overflow_mask_sp(bits);
for (i = 0; i < len; i++)
mpoly_monomial_max(pmax, pmax, poly_exps + N*i, bits, N, mask);
}
else
{
for (i = 0; i < len; i++)
mpoly_monomial_max_mp(pmax, pmax, poly_exps + N*i, bits, N);
}
mpoly_unpack_vec_fmpz(max_fields, pmax, bits, mctx->nfields, 1);
TMP_END;
}