void power_mpz(ElementType& result, const ElementType& a, mpz_ptr n) const { if (is_zero(a)) { set_zero(result); return; } bool neg = false; if (mpz_sgn(n) < 0) { neg = true; mpz_neg(n, n); invert(result, a); } else copy(result, a); fmpz_t fn; fmpz_init_set_readonly(fn, n); fq_zech_pow(&result, &result, fn, mContext); fmpz_clear_readonly(fn); if (neg) mpz_neg(n, n); }
int main(void) { int i; flint_rand_t state; printf("init_set_readonly...."); fflush(stdout); flint_randinit(state); /* Create some small fmpz integers, clear the mpz_t */ for (i = 0; i < 100000; i++) { fmpz_t f; mpz_t z; *f = z_randint(state, COEFF_MAX + 1); mpz_init(z); fmpz_get_mpz(z, f); { fmpz_t g; fmpz_init_set_readonly(g, z); fmpz_clear_readonly(g); } mpz_clear(z); } /* Create some small fmpz integers, do *not* clear the mpz_t */ for (i = 0; i < 100000; i++) { fmpz_t f; mpz_t z; *f = z_randint(state, COEFF_MAX + 1); mpz_init(z); fmpz_get_mpz(z, f); { fmpz_t g; fmpz_init_set_readonly(g, z); } mpz_clear(z); } /* Create some more fmpz integers */ for (i = 0; i < 100000; i++) { fmpz_t f; mpz_t z; fmpz_init(f); fmpz_randtest(f, state, 2 * FLINT_BITS); mpz_init(z); fmpz_get_mpz(z, f); { fmpz_t g, h; fmpz_init_set_readonly(g, z); fmpz_init(h); fmpz_set_mpz(h, z); if (!fmpz_equal(g, h)) { printf("FAIL:\n\n"); printf("g = "), fmpz_print(g), printf("\n"); printf("h = "), fmpz_print(h), printf("\n"); gmp_printf("z = %Zd\n", z); } fmpz_clear_readonly(g); fmpz_clear(h); } fmpz_clear(f); mpz_clear(z); } flint_randclear(state); _fmpz_cleanup(); printf("PASS\n"); return 0; }