diff options
author | Niels M?ller <nisse@lysator.liu.se> | 2016-12-02 21:06:53 +0100 |
---|---|---|
committer | Niels M?ller <nisse@lysator.liu.se> | 2016-12-02 21:06:53 +0100 |
commit | 52e399330089fd3484b7f3340a652a620e120dc8 (patch) | |
tree | 9d0c6844093fbb15eaf51f13bf39fda130a247e2 /tests/mpz | |
parent | 0e9cf090a8fb9e8a0c2730232133be5f7c601954 (diff) | |
download | gmp-52e399330089fd3484b7f3340a652a620e120dc8.tar.gz |
Test additional cases of reuse for mpz_gcd and mpz_gcdext.
Diffstat (limited to 'tests/mpz')
-rw-r--r-- | tests/mpz/reuse.c | 142 |
1 files changed, 76 insertions, 66 deletions
diff --git a/tests/mpz/reuse.c b/tests/mpz/reuse.c index 3d46bd5e8..004d342aa 100644 --- a/tests/mpz/reuse.c +++ b/tests/mpz/reuse.c @@ -467,91 +467,101 @@ main (int argc, char **argv) MPZ_CHECK_FORMAT (ref2); MPZ_CHECK_FORMAT (ref3); +#define GCDEXT_CHECK(t, i1,i2) do { \ + mpz_gcdext (res1, res2, t ? res3 : NULL, i1, i2); \ + MPZ_CHECK_FORMAT (res1); \ + MPZ_CHECK_FORMAT (res2); \ + MPZ_CHECK_FORMAT (res3); \ + if (mpz_cmp (ref1, res1) != 0 || mpz_cmp (ref2, res2) != 0 \ + || mpz_cmp (ref3, res3) != 0) \ + FAIL2 (mpz_gcdext, i1, i2, NULL); \ + } while(0) + mpz_set (res1, in1); - mpz_gcdext (res1, res2, res3, res1, in2); - MPZ_CHECK_FORMAT (res1); - MPZ_CHECK_FORMAT (res2); - MPZ_CHECK_FORMAT (res3); - if (mpz_cmp (ref1, res1) != 0 || mpz_cmp (ref2, res2) != 0 - || mpz_cmp (ref3, res3) != 0) - FAIL2 (mpz_gcdext, in1, in2, NULL); + GCDEXT_CHECK (1, res1, in2); mpz_set (res2, in1); - mpz_gcdext (res1, res2, res3, res2, in2); - MPZ_CHECK_FORMAT (res1); - MPZ_CHECK_FORMAT (res2); - MPZ_CHECK_FORMAT (res3); - if (mpz_cmp (ref1, res1) != 0 || mpz_cmp (ref2, res2) != 0 - || mpz_cmp (ref3, res3) != 0) - FAIL2 (mpz_gcdext, in1, in2, NULL); + GCDEXT_CHECK (1, res2, in2); mpz_set (res3, in1); - mpz_gcdext (res1, res2, res3, res3, in2); - MPZ_CHECK_FORMAT (res1); - MPZ_CHECK_FORMAT (res2); - MPZ_CHECK_FORMAT (res3); - if (mpz_cmp (ref1, res1) != 0 || mpz_cmp (ref2, res2) != 0 - || mpz_cmp (ref3, res3) != 0) - FAIL2 (mpz_gcdext, in1, in2, NULL); + GCDEXT_CHECK (1, res3, in2); mpz_set (res1, in2); - mpz_gcdext (res1, res2, res3, in1, res1); - MPZ_CHECK_FORMAT (res1); - MPZ_CHECK_FORMAT (res2); - MPZ_CHECK_FORMAT (res3); - if (mpz_cmp (ref1, res1) != 0 || mpz_cmp (ref2, res2) != 0 - || mpz_cmp (ref3, res3) != 0) - FAIL2 (mpz_gcdext, in1, in2, NULL); + GCDEXT_CHECK (1, in1, res1); mpz_set (res2, in2); - mpz_gcdext (res1, res2, res3, in1, res2); - MPZ_CHECK_FORMAT (res1); - MPZ_CHECK_FORMAT (res2); - MPZ_CHECK_FORMAT (res3); - if (mpz_cmp (ref1, res1) != 0 || mpz_cmp (ref2, res2) != 0 - || mpz_cmp (ref3, res3) != 0) - FAIL2 (mpz_gcdext, in1, in2, NULL); + GCDEXT_CHECK (1, in1, res2); mpz_set (res3, in2); - mpz_gcdext (res1, res2, res3, in1, res3); - MPZ_CHECK_FORMAT (res1); - MPZ_CHECK_FORMAT (res2); - MPZ_CHECK_FORMAT (res3); - if (mpz_cmp (ref1, res1) != 0 || mpz_cmp (ref2, res2) != 0 - || mpz_cmp (ref3, res3) != 0) - FAIL2 (mpz_gcdext, in1, in2, NULL); + GCDEXT_CHECK (1, in1, res3); mpz_set (res1, in1); - mpz_gcdext (res1, res2, NULL, res1, in2); - MPZ_CHECK_FORMAT (res1); - MPZ_CHECK_FORMAT (res2); - if (mpz_cmp (ref1, res1) != 0 || mpz_cmp (ref2, res2) != 0 - || mpz_cmp (ref3, res3) != 0) - FAIL2 (mpz_gcdext, in1, in2, NULL); + mpz_set (res2, in2); + GCDEXT_CHECK (1, res1, res2); + + mpz_set (res1, in1); + mpz_set (res3, in2); + GCDEXT_CHECK (1, res1, res3); mpz_set (res2, in1); - mpz_gcdext (res1, res2, NULL, res2, in2); - MPZ_CHECK_FORMAT (res1); - MPZ_CHECK_FORMAT (res2); - if (mpz_cmp (ref1, res1) != 0 || mpz_cmp (ref2, res2) != 0 - || mpz_cmp (ref3, res3) != 0) - FAIL2 (mpz_gcdext, in1, in2, NULL); + mpz_set (res3, in2); + GCDEXT_CHECK (1, res2, res3); + + mpz_set (res2, in1); + mpz_set (res1, in2); + GCDEXT_CHECK (1, res2, res1); + mpz_set (res3, in1); mpz_set (res1, in2); - mpz_gcdext (res1, res2, NULL, in1, res1); - MPZ_CHECK_FORMAT (res1); - MPZ_CHECK_FORMAT (res2); - if (mpz_cmp (ref1, res1) != 0 || mpz_cmp (ref2, res2) != 0 - || mpz_cmp (ref3, res3) != 0) - FAIL2 (mpz_gcdext, in1, in2, NULL); + GCDEXT_CHECK (1, res3, res1); + mpz_set (res3, in1); mpz_set (res2, in2); - mpz_gcdext (res1, res2, NULL, in1, res2); - MPZ_CHECK_FORMAT (res1); - MPZ_CHECK_FORMAT (res2); - if (mpz_cmp (ref1, res1) != 0 || mpz_cmp (ref2, res2) != 0 - || mpz_cmp (ref3, res3) != 0) - FAIL2 (mpz_gcdext, in1, in2, NULL); + GCDEXT_CHECK(1, res3, res2); + + mpz_set (res1, in1); + GCDEXT_CHECK (0, res1, in2); + + mpz_set (res2, in1); + GCDEXT_CHECK (0, res2, in2); + + mpz_set (res1, in2); + GCDEXT_CHECK (0, in1, res1); + + mpz_set (res2, in2); + GCDEXT_CHECK (0, in1, res2); +#undef GCDEXT_CHECK + /* Identical inputs, gcd(in1, in1). Then the result should be + gcd = abs(in1), s = 0, t = sgn(in1). */ + mpz_abs (ref1, in1); + mpz_set_ui (ref2, 0); + mpz_set_si (ref3, mpz_sgn(in1)); + +#define GCDEXT_CHECK_SAME(t, i) do { \ + mpz_gcdext(res1, res2, t ? res3 : NULL, i, i); \ + MPZ_CHECK_FORMAT (res1); \ + MPZ_CHECK_FORMAT (res2); \ + MPZ_CHECK_FORMAT (res3); \ + if (mpz_cmp (ref1, res1) != 0 || mpz_cmp (ref2, res2) != 0 \ + || mpz_cmp (ref3, res3) != 0) \ + FAIL2 (mpz_gcdext, i, i, NULL); \ + } while(0) + + mpz_set (res1, in1); + GCDEXT_CHECK_SAME (1, res1); + + mpz_set(res2, in1); + GCDEXT_CHECK_SAME (1, res2); + + mpz_set(res3, in1); + GCDEXT_CHECK_SAME (1, res3); + + mpz_set (res1, in1); + GCDEXT_CHECK_SAME (0, res1); + + mpz_set(res2, in1); + GCDEXT_CHECK_SAME (0, res2); +#undef GCDEXT_CHECK_SAME } /* Don't run mpz_powm for huge exponents or when undefined. */ |