]> git.ipfire.org Git - thirdparty/coreutils.git/commitdiff
factor: prefer exact division
authorPaul Eggert <eggert@cs.ucla.edu>
Fri, 4 Jul 2025 06:11:26 +0000 (23:11 -0700)
committerPaul Eggert <eggert@cs.ucla.edu>
Thu, 10 Jul 2025 00:12:40 +0000 (17:12 -0700)
* src/factor.c (mp_factor_using_division, mp_factor_using_pollard_rho):
Use exact division when it suffices, as it’s typically faster.

src/factor.c

index 79eeabe8295ffc5943e5f487ae8c5eb559d8e059..849c684e6136a5c219b38fc2f00e8bd9d3b95eea 100644 (file)
@@ -987,7 +987,7 @@ mp_factor_using_division (mpz_t t)
     {
       for (m = 0; mpz_divisible_ui_p (t, d); m++)
         {
-          mpz_tdiv_q_ui (t, t, d);
+          mpz_divexact_ui (t, t, d);
           if (mp_finish_up_in_single (&factors, t, i, d))
             {
               mp_factor_insert_ui (&factors, d, m + 1);
@@ -1568,9 +1568,9 @@ mp_factor_using_pollard_rho (struct mp_factors *factors,
         mp_factor_using_pollard_rho (factors, gp, gn, a + 1);
     }
 
-  mpn_tdiv_qr (qp, tp, 0, mp, n, gp, gn);      /* could use divexact */
-  mp_size_t qn = n - gn + (qp[n - 1] != 0);
-  mpz_t q = MPZ_ROINIT_N (qp, qn);
+  mpz_t m = MPZ_ROINIT_N ((mp_limb_t *) mp, n), q;
+  mpz_init (q);
+  mpz_divexact (q, m, g);
 
   if (!mp_finish_in_single (factors, q))
     {
@@ -1579,10 +1579,13 @@ mp_factor_using_pollard_rho (struct mp_factors *factors,
       else
         {
           devmsg ("[composite factor--restarting pollard-rho] ");
-          mp_factor_using_pollard_rho (factors, qp, qn, a + 1);
+          mp_factor_using_pollard_rho (factors, mpz_limbs_read (q),
+                                       mp_size (q), a + 1);
         }
     }
 
+  mpz_clear (q);
+
  finish:
   free (scratch);
 }