void check_rand (void) { mpq_t x, y, want_add, want_sub; int i; gmp_randstate_ptr rands = RANDS; mpq_init (x); mpq_init (y); mpq_init (want_add); mpq_init (want_sub); for (i = 0; i < 500; i++) { mpz_errandomb (mpq_numref(x), rands, 512L); mpz_errandomb_nonzero (mpq_denref(x), rands, 512L); mpq_canonicalize (x); mpz_errandomb (mpq_numref(y), rands, 512L); mpz_errandomb_nonzero (mpq_denref(y), rands, 512L); mpq_canonicalize (y); refmpq_add (want_add, x, y); refmpq_sub (want_sub, x, y); check_all (x, y, want_add, want_sub); } mpq_clear (x); mpq_clear (y); mpq_clear (want_add); mpq_clear (want_sub); }
void check_random (int argc, char *argv[]) { gmp_randstate_ptr rands = RANDS; mpz_t a, c, d, ra, rc; int i; int want; int reps = 50000; if (argc >= 2) reps = atoi (argv[1]); mpz_init (a); mpz_init (c); mpz_init (d); mpz_init (ra); mpz_init (rc); for (i = 0; i < reps; i++) { mpz_errandomb (a, rands, 8*BITS_PER_MP_LIMB); MPZ_CHECK_FORMAT (a); mpz_errandomb (c, rands, 8*BITS_PER_MP_LIMB); MPZ_CHECK_FORMAT (c); mpz_errandomb_nonzero (d, rands, 8*BITS_PER_MP_LIMB); mpz_negrandom (a, rands); MPZ_CHECK_FORMAT (a); mpz_negrandom (c, rands); MPZ_CHECK_FORMAT (c); mpz_negrandom (d, rands); mpz_fdiv_r (ra, a, d); mpz_fdiv_r (rc, c, d); want = (mpz_cmp (ra, rc) == 0); check_one (a, c, d, want); mpz_sub (ra, ra, rc); mpz_sub (a, a, ra); MPZ_CHECK_FORMAT (a); check_one (a, c, d, 1); if (! mpz_pow2abs_p (d)) { refmpz_combit (a, urandom() % (8*BITS_PER_MP_LIMB)); check_one (a, c, d, 0); } } mpz_clear (a); mpz_clear (c); mpz_clear (d); mpz_clear (ra); mpz_clear (rc); }
int main (int argc, char **argv) { mpq_t op1, op2; mp_size_t size; int i; int reps = 10000; FILE *fp; int base; gmp_randstate_ptr rands; mpz_t bs; unsigned long bsi, size_range; size_t nread; tests_start (); rands = RANDS; mpz_init (bs); if (argc == 2) reps = atoi (argv[1]); mpq_init (op1); mpq_init (op2); fp = fopen (FILENAME, "w+"); for (i = 0; i < reps; i++) { mpz_urandomb (bs, rands, 32); size_range = mpz_get_ui (bs) % 10 + 2; mpz_urandomb (bs, rands, size_range); size = mpz_get_ui (bs); mpz_errandomb (mpq_numref(op1), rands, 512L); mpz_errandomb_nonzero (mpq_denref(op1), rands, 512L); mpq_canonicalize (op1); mpz_urandomb (bs, rands, 1); bsi = mpz_get_ui (bs); if ((bsi & 1) != 0) mpq_neg (op1, op1); mpz_urandomb (bs, rands, 16); bsi = mpz_get_ui (bs); base = bsi % 36 + 1; if (base == 1) base = 0; rewind (fp); if (mpq_out_str (fp, base, op1) == 0 || putc (' ', fp) == EOF || fflush (fp) != 0) { printf ("mpq_out_str write error\n"); abort (); } rewind (fp); nread = mpq_inp_str (op2, fp, base); if (nread == 0) { if (ferror (fp)) printf ("mpq_inp_str stream read error\n"); else printf ("mpq_inp_str data conversion error\n"); abort (); } if (nread != ftell(fp)) { printf ("mpq_inp_str nread doesn't match ftell\n"); printf (" nread %lu\n", (unsigned long) nread); printf (" ftell %ld\n", ftell(fp)); abort (); } if (mpq_cmp (op1, op2)) { printf ("ERROR\n"); printf ("op1 = "); debug_mp (op1, -16); printf ("op2 = "); debug_mp (op2, -16); printf ("base = %d\n", base); abort (); } } fclose (fp); unlink (FILENAME); mpz_clear (bs); mpq_clear (op1); mpq_clear (op2); tests_end (); exit (0); }