#include "mpoly.h"
void mpoly_main_variable_split_LEX(slong * ind, ulong * pexp, const ulong * Aexp,
slong l1, slong Alen, const ulong * mults, slong num, slong Abits)
{
slong i, j = 0, s = 0;
ulong e, mask = (-UWORD(1)) >> (FLINT_BITS - Abits);
for (i = 0; i < Alen; i++)
{
slong top = Aexp[i] >> (Abits*num);
while (s < l1 - top)
ind[s++] = i;
e = 0;
for (j = num - 1; j >= 0; j--) {
e = (e * mults[j]) + ((Aexp[i] >> (j*Abits)) & mask);
}
pexp[i] = e;
}
while (s <= l1)
ind[s++] = Alen;
}
void mpoly_main_variable_split_DEG(slong * ind, ulong * pexp, const ulong * Aexp,
slong l1, slong Alen, ulong deg, slong num, slong Abits)
{
slong i, j = 0, s = 0;
ulong e, mask = (-UWORD(1)) >> (FLINT_BITS - Abits);
for (i = 0; i < Alen; i++)
{
slong top = Aexp[i] >> (Abits*num);
while (s < l1 - top)
ind[s++] = i;
e = 0;
for (j = num - 1; j >= 1; j--)
e = (e * deg) + ((Aexp[i] >> (j*Abits)) & mask);
pexp[i] = e;
}
while (s <= l1)
ind[s++] = Alen;
}