void _fmpq_vec_randtest_uniq_sorted(fmpq * vec, flint_rand_t state, slong len, mp_bitcnt_t bits) { slong i; int do_again; /* if 2^bits < len we are too likely to have collision */ if (4 * n_sizeinbase(len, 2) > bits) { fprintf(stderr, "ERROR (_fmpq_vec_randtest_uniq_sorted): bits too small\n"); abort(); } _fmpq_vec_randtest(vec, state, len, bits); if (len <= 1) return; do { do_again = 0; _fmpq_vec_sort(vec, len); for (i = 0; i < len - 1; i++) { if (fmpq_equal(vec + i, vec + i + 1)) { fmpq_randtest(vec + i, state, bits); do_again = 1; } } } while (do_again); }
int main(void) { mp_limb_t n; int base, size1, size2; long rep; mpz_t t; char * str; flint_rand_t state; printf("sizeinbase...."); fflush(stdout); flint_randinit(state); mpz_init(t); str = flint_malloc((FLINT_BITS + 1) * sizeof(char)); for (rep = 0; rep < 10000; rep++) { n = n_randtest(state); base = 2 + n_randint(state, 34); size1 = n_sizeinbase(n, base); mpz_set_ui(t, n); mpz_get_str(str, base, t); size2 = strlen(str); if (size1 != size2) { printf("FAIL: n = %lu, base = %d\n", n, base); printf("n_sizeinbase: %d, strlen: %d\n", size1, size2); abort(); } } flint_free(str); mpz_clear(t); flint_randclear(state); printf("PASS\n"); return 0; }