void fmpq_poly_randtest_unsigned(fmpq_poly_t poly, flint_rand_t state, long len, mp_bitcnt_t bits) { ulong m; m = n_randlimb(NULL); fmpq_poly_fit_length(poly, len); _fmpq_poly_set_length(poly, len); if (m & 1UL) { _fmpz_vec_randtest_unsigned(poly->coeffs, state, len, bits); } else { fmpz_t x; fmpz_init(x); fmpz_randtest_unsigned(x, state, bits / 2); _fmpz_vec_randtest_unsigned(poly->coeffs, state, len, (bits + 1) / 2); _fmpz_vec_scalar_mul_fmpz(poly->coeffs, poly->coeffs, len, x); fmpz_clear(x); } if (m & 2UL) { fmpz_randtest_not_zero(poly->den, state, FLINT_MAX(bits, 1)); fmpz_abs(poly->den, poly->den); fmpq_poly_canonicalise(poly); } else { fmpz_set_ui(poly->den, 1); _fmpq_poly_normalise(poly); } }
int main(void) { int i, result; flint_rand_t state; printf("get/set_fft...."); fflush(stdout); flint_randinit(state); /* convert back and forth and compare */ for (i = 0; i < 10000; i++) { fmpz * a, * b; mp_bitcnt_t bits; long len, limbs; mp_limb_t ** ii, * ptr; long i, bt; bits = n_randint(state, 300) + 1; len = n_randint(state, 300) + 1; limbs = 2*((bits - 1)/FLINT_BITS + 1); ii = flint_malloc((len + len*(limbs + 1))*sizeof(mp_limb_t)); ptr = (mp_limb_t *) ii + len; for (i = 0; i < len; i++, ptr += (limbs + 1)) ii[i] = ptr; a = _fmpz_vec_init(len); b = _fmpz_vec_init(len); _fmpz_vec_randtest(a, state, len, bits); bt = _fmpz_vec_get_fft(ii, a, limbs, len); for (i = 0; i < len; i++) mpn_normmod_2expp1(ii[i], limbs); _fmpz_vec_set_fft(b, len, ii, limbs, bt < 0); result = (_fmpz_vec_equal(a, b, len)); if (!result) { printf("FAIL:\n"); _fmpz_vec_print(a, len), printf("\n\n"); _fmpz_vec_print(b, len), printf("\n\n"); abort(); } _fmpz_vec_clear(a, len); _fmpz_vec_clear(b, len); } /* convert back and forth unsigned and compare */ for (i = 0; i < 10000; i++) { fmpz * a, * b; mp_bitcnt_t bits; long len, limbs; mp_limb_t ** ii, * ptr; long i, bt; bits = n_randint(state, 300) + 1; len = n_randint(state, 300) + 1; limbs = 2*((bits - 1)/FLINT_BITS + 1); ii = flint_malloc((len + len*(limbs + 1))*sizeof(mp_limb_t)); ptr = (mp_limb_t *) ii + len; for (i = 0; i < len; i++, ptr += (limbs + 1)) ii[i] = ptr; a = _fmpz_vec_init(len); b = _fmpz_vec_init(len); _fmpz_vec_randtest_unsigned(a, state, len, bits); bt = _fmpz_vec_get_fft(ii, a, limbs, len); _fmpz_vec_set_fft(b, len, ii, limbs, bt < 0); result = (_fmpz_vec_equal(a, b, len)); if (!result) { printf("FAIL:\n"); _fmpz_vec_print(a, len), printf("\n\n"); _fmpz_vec_print(b, len), printf("\n\n"); abort(); } _fmpz_vec_clear(a, len); _fmpz_vec_clear(b, len); } flint_randclear(state); _fmpz_cleanup(); printf("PASS\n"); return 0; }