#include "fmpq_mpoly.h"
void fmpq_mpoly_divrem_ideal(fmpq_mpoly_struct ** Q, fmpq_mpoly_t R,
const fmpq_mpoly_t A, fmpq_mpoly_struct * const * B, slong len,
const fmpq_mpoly_ctx_t ctx)
{
slong i;
fmpz_t scale;
fmpq_t t;
fmpz_mpoly_struct ** Qarr, ** Barr;
TMP_INIT;
for (i = 0; i < len; i++)
{
if (fmpq_mpoly_is_zero(B[i], ctx))
{
flint_throw(FLINT_DIVZERO, "Divide by zero in fmpq_mpoly_divrem_ideal");
}
}
if (fmpq_mpoly_is_zero(A, ctx))
{
for (i = 0; i < len; i++)
fmpq_mpoly_zero(Q[i], ctx);
fmpq_mpoly_zero(R, ctx);
return;
}
TMP_START;
Qarr = (fmpz_mpoly_struct **) TMP_ALLOC(len*sizeof(fmpz_mpoly_struct *));
Barr = (fmpz_mpoly_struct **) TMP_ALLOC(len*sizeof(fmpz_mpoly_struct *));
for (i = 0; i < len; i++)
{
Qarr[i] = Q[i]->zpoly;
Barr[i] = B[i]->zpoly;
}
fmpz_init(scale);
fmpz_mpoly_quasidivrem_ideal_heap(scale, Qarr, R->zpoly,
A->zpoly, Barr, len, ctx->zctx);
fmpq_init(t);
fmpq_div_fmpz(t, A->content, scale);
for (i = 0; i < len; i++)
fmpq_div(Q[i]->content, t, B[i]->content);
fmpq_swap(t, R->content);
fmpq_clear(t);
fmpz_clear(scale);
for (i = 0; i < len; i++)
fmpq_mpoly_reduce(Q[i], ctx);
fmpq_mpoly_reduce(R, ctx);
TMP_END;
}