/* 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 "nmod_mpoly.h" #include "ulong_extras.h" int main(void) { slong i, j, k; int result; FLINT_TEST_INIT(state); flint_printf("get/set_term_exp_si...."); fflush(stdout); /* check set and get match */ for (i = 0; i < 100 * flint_test_multiplier(); i++) { nmod_mpoly_ctx_t ctx; nmod_mpoly_t f; slong nvars, len, index; flint_bitcnt_t exp_bits; mp_limb_t modulus; modulus = UWORD(2) + n_randint(state, -UWORD(2)); nmod_mpoly_ctx_init_rand(ctx, state, 20, modulus); nmod_mpoly_init(f, ctx); nvars = nmod_mpoly_ctx_nvars(ctx); len = n_randint(state, 50) + 1; exp_bits = n_randint(state, 200) + 2; nmod_mpoly_randtest_bits(f, state, len, exp_bits, ctx); if (nmod_mpoly_is_zero(f, ctx)) nmod_mpoly_one(f, ctx); for (j = 0; j < 10; j++) { slong * exp1 = (slong *) flint_malloc(nvars*sizeof(slong)); slong * exp2 = (slong *) flint_malloc(nvars*sizeof(slong)); for (k = 0; k < nvars; k++) { slong bits = n_randint(state, FLINT_BITS - 1) + 1; exp1[k] = n_randbits(state, bits); } index = n_randint(state, f->length); nmod_mpoly_set_term_exp_ui(f, index, (ulong *) exp1, ctx); if (!mpoly_monomials_valid_test(f->exps, f->length, f->bits, ctx->minfo)) flint_throw(FLINT_ERROR, "Polynomial exponents invalid"); if (mpoly_monomials_overflow_test(f->exps, f->length, f->bits, ctx->minfo)) flint_throw(FLINT_ERROR, "Polynomial exponents overflow"); nmod_mpoly_get_term_exp_si(exp2, f, index, ctx); result = 1; for (k = 0; k < nvars; k++) { result = result && exp1[k] == exp2[k] && exp1[k] == nmod_mpoly_get_term_var_exp_si(f, index, k, ctx); } if (!result) { flint_printf("FAIL\ncheck set and get match\ni = %wd, j = %wd\n", i, j); flint_abort(); } flint_free(exp1); flint_free(exp2); } nmod_mpoly_clear(f, ctx); nmod_mpoly_ctx_clear(ctx); } FLINT_TEST_CLEANUP(state); flint_printf("PASS\n"); return 0; }