#include "fmpz.h"
#include "fmpz_vec.h"
#include "fmpz_mat.h"
#include "mpoly.h"
void mpoly_compose_mat_gen(fmpz_mat_t M, const slong * c,
const mpoly_ctx_t mctxB, const mpoly_ctx_t mctxAC)
{
slong i, gi, j;
fmpz * t;
FLINT_ASSERT(fmpz_mat_nrows(M) == mctxAC->nfields + 1);
FLINT_ASSERT(fmpz_mat_ncols(M) == mctxB->nfields);
fmpz_mat_zero(M);
t = _fmpz_vec_init(mctxAC->nfields);
for (i = 0; i < mctxB->nvars; i++)
{
gi = mpoly_gen_index(i, mctxB);
if (0 <= c[i] && c[i] < mctxAC->nfields)
{
mpoly_gen_fields_fmpz(t, c[i], mctxAC);
for (j = 0; j < mctxAC->nfields; j++)
fmpz_swap(fmpz_mat_entry(M, j, gi), t + j);
}
else
{
fmpz_one(fmpz_mat_entry(M, mctxAC->nfields, gi));
}
}
_fmpz_vec_clear(t, mctxAC->nfields);
}
void mpoly_compose_mat_fill_column(fmpz_mat_t M, const ulong * Cexp,
flint_bitcnt_t Cbits, slong Bvar, const mpoly_ctx_t mctxB,
const mpoly_ctx_t mctxAC)
{
slong Bidx = mpoly_gen_index(Bvar, mctxB);
slong j;
fmpz * t;
if (Cexp == NULL)
{
j = mctxAC->nfields;
fmpz_one(fmpz_mat_entry(M, j, Bidx));
for (j--; j >= 0; j--)
fmpz_zero(fmpz_mat_entry(M, j, Bidx));
return;
}
t = _fmpz_vec_init(mctxAC->nfields);
mpoly_unpack_vec_fmpz(t, Cexp, Cbits, mctxAC->nfields, 1);
j = mctxAC->nfields;
fmpz_zero(fmpz_mat_entry(M, j, Bidx));
for (j--; j >= 0; j--)
fmpz_swap(fmpz_mat_entry(M, j, Bidx), t + j);
_fmpz_vec_clear(t, mctxAC->nfields);
}