summaryrefslogtreecommitdiff
path: root/tests/mpz
diff options
context:
space:
mode:
authorNiels M?ller <nisse@lysator.liu.se>2016-12-02 21:06:53 +0100
committerNiels M?ller <nisse@lysator.liu.se>2016-12-02 21:06:53 +0100
commit52e399330089fd3484b7f3340a652a620e120dc8 (patch)
tree9d0c6844093fbb15eaf51f13bf39fda130a247e2 /tests/mpz
parent0e9cf090a8fb9e8a0c2730232133be5f7c601954 (diff)
downloadgmp-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.c142
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. */