#include "mpoly.h"
PUSH_OPTIONS
DIAGNOSTIC_IGNORE_MAYBE_UNINITIALIZED
void mpoly_min_fields_ui_sp(ulong * min_fields, const ulong * poly_exps,
slong len, flint_bitcnt_t bits, const mpoly_ctx_t mctx)
{
slong i, N;
ulong * pmin, mask;
TMP_INIT;
FLINT_ASSERT(len > 0);
FLINT_ASSERT(bits <= FLINT_BITS);
N = mpoly_words_per_exp_sp(bits, mctx);
mask = mpoly_overflow_mask_sp(bits);
TMP_START;
pmin = (ulong *) TMP_ALLOC(N*sizeof(ulong));
mpoly_monomial_set(pmin, poly_exps + N*(len - 1), N);
if (!mpoly_monomial_is_zero(pmin, N))
{
for (i = 0; i < len - 1; i++)
mpoly_monomial_min(pmin, pmin, poly_exps + N*i, bits, N, mask);
}
mpoly_unpack_vec_ui(min_fields, pmin, bits, mctx->nfields, 1);
TMP_END;
}
void mpoly_min_fields_fmpz(fmpz * min_fields, const ulong * poly_exps,
slong len, flint_bitcnt_t bits, const mpoly_ctx_t mctx)
{
slong i, N;
ulong * pmin, mask;
TMP_INIT;
FLINT_ASSERT(len > 0);
TMP_START;
N = mpoly_words_per_exp(bits, mctx);
pmin = (ulong *) TMP_ALLOC(N*sizeof(ulong));
mpoly_monomial_set(pmin, poly_exps + N*(len - 1), N);
if (!mpoly_monomial_is_zero(pmin, N))
{
if (bits <= FLINT_BITS)
{
mask = mpoly_overflow_mask_sp(bits);
for (i = 0; i < len - 1; i++)
mpoly_monomial_min(pmin, pmin, poly_exps + N*i, bits, N, mask);
}
else
{
for (i = 0; i < len - 1; i++)
mpoly_monomial_min_mp(pmin, pmin, poly_exps + N*i, bits, N);
}
}
mpoly_unpack_vec_fmpz(min_fields, pmin, bits, mctx->nfields, 1);
TMP_END;
}
POP_OPTIONS