mini-gmp and mpq

Bradley Lucier lucier at
Sun Apr 29 18:24:53 UTC 2018

On 04/28/2018 04:16 AM, Marco Bodrato wrote:

> Finally, the mini-mpq code is in the development library.
> I'll be happy if you want to test it or write any comment about it.

I haven't tested the code, but I have examined it.

I would suggest testing whether a and b are identical in

mpq_mul (mpq_t r, const mpq_t a, const mpq_t b)

because then you can avoid two gcd's (you can just square the numerator 
and denominator to get the result) and it's only a few extra lines of code.

You have the code:

static void
mpq_canonical_sign (mpq_t r)
   int cmp = mpq_denref (r)->_mp_size;
   if (cmp <= 0)
       if (cmp == 0)
	gmp_die("mpq: Fraction with zero denominator.");
       mpz_neg (mpq_denref (r), mpq_denref (r));
       mpz_neg (mpq_numref (r), mpq_numref (r));

static void
mpq_helper_canonicalize (mpq_t r, const mpq_t c, mpz_t g)
   if (mpq_numref (c)->_mp_size == 0)
     mpq_set_ui (r, 0, 1);
       mpz_gcd (g, mpq_numref (c), mpq_denref (c));
       mpz_tdiv_q (mpq_numref (r), mpq_numref (c), g);
       mpz_tdiv_q (mpq_denref (r), mpq_denref (c), g);
       mpq_canonical_sign (r);

mpq_canonicalize (mpq_t r)
   mpz_t t;
   mpz_init (t);
   mpq_helper_canonicalize (r, r, t);
   mpz_clear (t);

As far as I can see, only

mpq_inv (mpq_t r, const mpq_t q)

calls mpq_canonical_sign (as does mpq_canonicalize_helper, of course) 
and only

mpq_mul (mpq_t r, const mpq_t a, const mpq_t b)

calls mpq_helper_canonicalize (as does mpq_canonicalize, of course). 
Nothing calls

mpq_canonicalize (mpq_t r)

My preference would be to put explicit calls to the needed gcd's into 
mpq_mul instead of calling mpq_helper_canonicalize (which seems a 
roundabout way to get the needed gcd's) and do the sign flipping 
explicitly in mpq_inv if needed, then you could get rid of these 
"canonical" procedures.


More information about the gmp-devel mailing list