/*
Copyright (C) 2019 Daniel Schultz
This file is part of FLINT.
FLINT is free software: you can redistribute it and/or modify it under
the terms of the GNU Lesser General Public License (LGPL) as published
by the Free Software Foundation; either version 2.1 of the License, or
(at your option) any later version. See .
*/
#include
#include "flint.h"
#include "mpoly.h"
/* this file does not need to change with new orderings */
ulong mpoly_get_monomial_var_exp_ui_sp(const ulong * poly_exps,
slong var, flint_bitcnt_t bits, const mpoly_ctx_t mctx)
{
slong offset, shift;
mpoly_gen_offset_shift_sp(&offset, &shift, var, bits, mctx);
return (poly_exps[offset] >> shift) & ((-UWORD(1)) >> (FLINT_BITS - bits));
}
ulong mpoly_get_monomial_var_exp_ui_mp(const ulong * poly_exps,
slong var, flint_bitcnt_t bits, const mpoly_ctx_t mctx)
{
slong offset;
slong j;
ulong wpf = bits/FLINT_BITS;
ulong r, check;
offset = mpoly_gen_offset_mp(var, bits, mctx);
r = poly_exps[offset + 0];
check = 0;
for (j = 1; j < wpf; j++)
check |= poly_exps[offset + j];
if (check != 0)
flint_throw(FLINT_ERROR, "Exponent does not fit a ulong.");
return r;
}
slong mpoly_get_monomial_var_exp_si_mp(const ulong * poly_exps,
slong var, flint_bitcnt_t bits, const mpoly_ctx_t mctx)
{
slong offset;
slong j;
ulong wpf = bits/FLINT_BITS;
ulong r, check;
offset = mpoly_gen_offset_mp(var, bits, mctx);
r = poly_exps[offset + 0];
check = FLINT_SIGN_EXT(r);
for (j = 1; j < wpf; j++)
check |= poly_exps[offset + j];
if (check != 0)
flint_throw(FLINT_ERROR, "Exponent does not fit an slong.");
return (slong) r;
}