]> git.ipfire.org Git - thirdparty/coreutils.git/commitdiff
factor: don’t give up before last prime in table
authorPaul Eggert <eggert@cs.ucla.edu>
Thu, 12 Jun 2025 20:45:57 +0000 (13:45 -0700)
committerPaul Eggert <eggert@cs.ucla.edu>
Thu, 10 Jul 2025 00:12:39 +0000 (17:12 -0700)
* src/factor.c (prime_p, prime2_p, mp_prime_p): Do not skip the
flag_prove_primality test for the last prime in the table, i.e.,
when r == PRIMES_PTAB_ENTRIES - 1.
(mp_prime_p): There is no longer a need for the ret1 label or goto.

src/factor.c

index a427f81c60c916c38f609728f4ada96d611c9144..97c14695c427c2fee341cfedf3f6a6d97bee9927 100644 (file)
@@ -1297,7 +1297,7 @@ prime_p (mp_limb_t n)
 
   /* Loop until Lucas proves our number prime, or Miller-Rabin proves our
      number composite.  */
-  for (idx_t r = 0; r < PRIMES_PTAB_ENTRIES; r++)
+  for (idx_t r = 0; ; r++)
     {
       bool is_prime;
 
@@ -1319,6 +1319,9 @@ prime_p (mp_limb_t n)
       if (is_prime)
         return true;
 
+      /* A Lucas prime test failure should not happen.  */
+      affirm (r < PRIMES_PTAB_ENTRIES);
+
       a += primes_diff[r];      /* Establish new base.  */
 
       /* The following is equivalent to redcify (a_prim, a, n).  It runs faster
@@ -1339,8 +1342,6 @@ prime_p (mp_limb_t n)
       if (!millerrabin (n, ni, a_prim, q, k, one))
         return false;
     }
-
-  affirm (!"Lucas prime test failure.  This should not happen");
 }
 
 static bool ATTRIBUTE_PURE
@@ -1394,7 +1395,7 @@ prime2_p (mp_limb_t n1, mp_limb_t n0)
 
   /* Loop until Lucas proves our number prime, or Miller-Rabin proves our
      number composite.  */
-  for (idx_t r = 0; r < PRIMES_PTAB_ENTRIES; r++)
+  for (idx_t r = 0; ; r++)
     {
       bool is_prime;
       mp_limb_t e[2];
@@ -1432,14 +1433,15 @@ prime2_p (mp_limb_t n1, mp_limb_t n0)
       if (is_prime)
         return true;
 
+      /* A Lucas prime test failure should not happen.  */
+      affirm (r < PRIMES_PTAB_ENTRIES);
+
       a += primes_diff[r];      /* Establish new base.  */
       redcify2 (a_prim[1], a_prim[0], a, n1, n0);
 
       if (!millerrabin2 (na, ni, a_prim, q, k, one))
         return false;
     }
-
-  affirm (!"Lucas prime test failure.  This should not happen");
 }
 
 static bool
@@ -1483,7 +1485,7 @@ mp_prime_p (mpz_t n)
 
   /* Loop until Lucas proves our number prime, or Miller-Rabin proves our
      number composite.  */
-  for (idx_t r = 0; r < PRIMES_PTAB_ENTRIES; r++)
+  for (idx_t r = 0; ; r++)
     {
       if (flag_prove_primality)
         {
@@ -1502,20 +1504,20 @@ mp_prime_p (mpz_t n)
         }
 
       if (is_prime)
-        goto ret1;
+        break;
+
+      /* A Lucas prime test failure should not happen.  */
+      affirm (r < PRIMES_PTAB_ENTRIES);
 
       mpz_add_ui (a, a, primes_diff[r]);        /* Establish new base.  */
 
       if (!mp_millerrabin (n, nm1, a, tmp, q, k))
         {
           is_prime = false;
-          goto ret1;
+          break;
         }
     }
 
-  affirm (!"Lucas prime test failure.  This should not happen");
-
- ret1:
   if (flag_prove_primality)
     mp_factor_clear (&factors);
  ret2: