Ciao,

While we are looking at gcd, I propose a shorter version for gcd_11 in
mini-gmp.

Meanwhile, we can also define a gcd_1 function... even if this is not
really useful. It would not make sense to give public access to mpn_gcd_1,
because we don't have any division function for the mpn level in mini-gmp
:-)


*** /tmp/extdiff.qIjJF7/gmp.643c931da9bd/mini-gmp/mini-gmp.c    2019-08-22
15:14:09.000000000 +0200
--- /home/bodrato/gmp/mini-gmp/mini-gmp.c       2019-08-22 21:40:30.144348034 
+0200
***************
*** 2652,2680 ****
    while ( (v & 1) == 0)
      v >>= 1;

    while (u != v)
      {
        if (u > v)
!       {
!         u -= v;
!         do
!           u >>= 1;
!         while ( (u & 1) == 0);
!       }
!       else
!       {
!         v -= u;
!         do
!           v >>= 1;
!         while ( (v & 1) == 0);
!       }
      }
    return u << shift;
  }

  unsigned long
  mpz_gcd_ui (mpz_t g, const mpz_t u, unsigned long v)
  {
    mpz_t t;
    mpz_init_set_ui(t, v);
    mpz_gcd (t, u, t);
--- 2652,2679 ----
    while ( (v & 1) == 0)
      v >>= 1;

    while (u != v)
      {
        if (u > v)
!         MP_LIMB_T_SWAP (u, v);
!       v -= u;
!       do
!       v >>= 1;
!         while ( (v & 1) == 0);
      }
    return u << shift;
  }

+ static mp_limb_t
+ mpn_gcd_1 (mp_srcptr up, mp_size_t un, mp_limb_t v)
+ {
+   mpz_t t;
+   return mpn_gcd_11 (mpz_tdiv_ui (mpz_roinit_n (t, up, un), v), v);
+ }
+
  unsigned long
  mpz_gcd_ui (mpz_t g, const mpz_t u, unsigned long v)
  {
    mpz_t t;
    mpz_init_set_ui(t, v);
    mpz_gcd (t, u, t);
***************
*** 2750,2764 ****
          }
        if (c < 0)
          mpz_swap (tu, tv);

        if (tv->_mp_size == 1)
          {
!           mp_limb_t vl = tv->_mp_d[0];
!           mp_limb_t ul = mpz_tdiv_ui (tu, vl);
!           mpz_set_ui (g, mpn_gcd_11 (ul, vl));
            break;
          }
        mpz_sub (tu, tu, tv);
        }
    mpz_clear (tu);
    mpz_clear (tv);
--- 2749,2761 ----
          }
        if (c < 0)
          mpz_swap (tu, tv);

        if (tv->_mp_size == 1)
          {
!           mpz_set_ui (g, mpn_gcd_1 (tu->_mp_d, tu->_mp_size, tv->_mp_d[0]));
            break;
          }
        mpz_sub (tu, tu, tv);
        }
    mpz_clear (tu);
    mpz_clear (tv);


Ĝis,
m

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

Reply via email to