Ciao,

Il 2022-01-23 01:34 Marc Glisse ha scritto:
Hello,

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

I tried to think to the mini-mpq version of the _z flavor.

diff -r ed0406cf3c70 mini-gmp/mini-mpq.c
--- a/mini-gmp/mini-mpq.c       Wed Feb 02 19:16:36 2022 +0100
+++ b/mini-gmp/mini-mpq.c       Tue Feb 08 10:04:55 2022 +0100
@@ -395,6 +395,30 @@
 }

 void
+mpq_mul_z (mpq_t r, const mpq_t a, const mpz_t b)
+{
+  mpq_t t;
+  static const mp_limb_t u = 1;
+
+ mpq_mul (r, a, mpq_roinit_normal_nn (t, b->_mp_d, b->_mp_size, &u, 1));
+}
+
+void
+mpq_z_div (mpq_t r, const mpz_t b, const mpq_t a)
+{
+  mpq_t t;
+  mpq_mul_z (r, mpq_roinit_zz (t, mpq_denref (a), mpq_numref (a)), b);
+}
+
+void
+mpq_div_z (mpq_t r, const mpq_t a, const mpz_t b)
+{
+  mpq_t t;
+  mpq_z_div (r, b, a);
+  mpq_inv (r, r);
+}
+
+void
 mpq_div_2exp (mpq_t r, const mpq_t q, mp_bitcnt_t e)
 {
   mp_bitcnt_t z = mpz_scan1 (mpq_numref (q), 0);



It seems simple enough. It should support (but I'm not sure!) the reuse cases
mpq_mul_z (B, A, mpq_denref (B))
and
mpq_mul_z (A, A, Z)

but I fear it would not support

mpq_mul_z (A, A, mpq_denref (A))
or
mpq_mul_z (A, A, mpq_numref (A))

Those are actually equivalent respectively to

mpz_set_ui (mpq_denref (A), 1);
and
mpz_mul (mpq_numref (A), mpq_numref (A), mpq_numref (A))

But I think we should support all reuse cases, shouldn't we?

Ĝis,
m
_______________________________________________
gmp-devel mailing list
gmp-devel@gmplib.org
https://gmplib.org/mailman/listinfo/gmp-devel

Reply via email to