Hello,

What would you think of adding mpq_mul_ui, mpq_div_ui, mpq_ui_div, and also the _z versions?

Something like (untested)

void
mpq_mul_ui (mpq_ptr prod, mpq_srcptr op, unsigned long m)
{
  unsigned long gcd_ui;

  if (SIZ (NUM (op)) == 0 || m == 0)
    {
      /* We special case this to simplify allocation logic; gcd(0,x) = x
         is a singular case for the allocations.  */
      SIZ (NUM (prod)) = 0;
      MPZ_NEWALLOC (DEN (prod), 1)[0] = 1;
      SIZ (DEN (prod)) = 1;
      return;
    }

#if 0
  if (m == 1)
    {
      if (prod != op)
        mpq_set (prod, op);
      return;
    }
#endif

  gcd_ui = mpz_gcd_ui (0, DEN (op), m);

#if 0
  if (gcd_ui == 1)
    {
      mpz_mul_ui (NUM (prod), NUM (op), m);
      if (prod != op)
        mpz_set (DEN (prod), DEN (op));
    }
#endif

  mpz_mul_ui (NUM (prod), NUM (op), m / gcd_ui);
  mpz_divexact_ui (DEN (prod), DEN (op), gcd_ui);
  // mpz_divexact_gcd (DEN (prod), DEN (op), gcd_z);
}


mpq_add_ui is easy to emulate with mpz_addmul_ui, but mpq_mul_ui is a bit harder (3 operations plus the need to handle 0 explicitly).

I can add similar code directly in gmpxx.h, but I first wanted to check if a C version was desirable.

--
Marc Glisse
_______________________________________________
gmp-devel mailing list
gmp-devel@gmplib.org
https://gmplib.org/mailman/listinfo/gmp-devel

Reply via email to