/*
Copyright (C) 2016 William Hart
Copyright (C) 2018 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
#include "flint.h"
#include "fmpz.h"
#include "fmpz_mpoly.h"
int _fmpz_mpoly_equal(fmpz * poly1, ulong * exps1,
const fmpz * poly2, const ulong * exps2, slong n, slong N)
{
slong i;
if (poly1 != poly2)
{
for (i = 0; i < n; i++)
{
if (!fmpz_equal(poly1 + i, poly2 + i))
return 0;
}
}
if (exps1 != exps2)
{
for (i = 0; i < n*N; i++)
{
if (exps1[i] != exps2[i])
return 0;
}
}
return 1;
}
int fmpz_mpoly_equal(const fmpz_mpoly_t poly1, const fmpz_mpoly_t poly2,
const fmpz_mpoly_ctx_t ctx)
{
ulong * ptr1 = poly1->exps, * ptr2 = poly2->exps;
slong max_bits, N;
int r, free1 = 0, free2 = 0;
if (poly1 == poly2)
return 1;
if (poly1->length != poly2->length)
return 0;
max_bits = FLINT_MAX(poly1->bits, poly2->bits);
N = mpoly_words_per_exp(max_bits, ctx->minfo);
if (max_bits > poly1->bits)
{
free1 = 1;
ptr1 = (ulong *) flint_malloc(N*poly1->length*sizeof(ulong));
mpoly_repack_monomials(ptr1, max_bits, poly1->exps, poly1->bits,
poly1->length, ctx->minfo);
}
if (max_bits > poly2->bits)
{
free2 = 1;
ptr2 = (ulong *) flint_malloc(N*poly2->length*sizeof(ulong));
mpoly_repack_monomials(ptr2, max_bits, poly2->exps, poly2->bits,
poly2->length, ctx->minfo);
}
r = _fmpz_mpoly_equal(poly1->coeffs, ptr1,
poly2->coeffs, ptr2, poly2->length, N);
if (free1)
flint_free(ptr1);
if (free2)
flint_free(ptr2);
return r;
}