mpz reuse test takes too much time

Niels Möller nisse at
Sat Dec 3 08:32:33 UTC 2016

"Marco Bodrato" <bodrato at> writes:

>> ! #define GCDEXT_CHECK2(i1, i2) do {					\
>> ! 	    mpz_gcdext (res1, res2, NULL, i1, i2);			\
>> ! 	    MPZ_CHECK_FORMAT (res1);					\
>> ! 	    MPZ_CHECK_FORMAT (res2);					\
>> ! 	    if (mpz_cmp (ref1, res1) != 0 || mpz_cmp (ref2, res2) != 0)	\
>> ! 	      FAIL2 (mpz_gcdext, i1, i2, NULL);				\
>> ! 	  } while (0)
> Should we check both mpz_gcdext (res1, res2, NULL, i1, i2); and mpz_gcdext
> (res1, NULL, res2, i2, i1) in this macro?

Hmm, you changed the code to not only allow G to be NULL, but allow NULL
S too? 

I think that's unnecessary. As you say, mpz_gcdext(G, NULL, NULL, A, B)
is better done as mpz_gcd(G, A, B), and mpz_gcdext(*, NULL, T, A, B) is
equivalent to mpz_gcdext(*, T, NULL, B, A). (Maybe in the latter case,
return value can differ in some corner case, so I'm not sure it's 100%
equivalent, but in general swapping the inputs A and B implies swapping
of the S and T outputs).

So allowing NULL S adds more cases to implement and test, with no gain
in functionality.

> Since we currently support NULL also for the first argument, should we
> check also the cases
> mpz_gcdext (NULL, x, y, x, y);
> mpz_gcdext (NULL, y, x, x, y);
> mpz_gcdext (NULL, s, y, x, y); mpz_gcdext (NULL, y, t, y, x);
> mpz_gcdext (NULL, s, x, x, y); mpz_gcdext (NULL, x, t, y, x);

> mpz_gcdext (NULL, NULL, y, x, y); mpz_gcdext (NULL, x, NULL, x, y);
> mpz_gcdext (NULL, NULL, x, x, y); mpz_gcdext (NULL, y, NULL, x, y); ?
Maybe, except for the above two.


Niels Möller. PGP-encrypted email is preferred. Keyid 368C6677.
Internet email is subject to wholesale government surveillance.

More information about the gmp-devel mailing list