]> git.ipfire.org Git - thirdparty/coreutils.git/commitdiff
factor: factor insertion simplifications
authorPaul Eggert <eggert@cs.ucla.edu>
Sat, 31 May 2025 01:58:21 +0000 (18:58 -0700)
committerPaul Eggert <eggert@cs.ucla.edu>
Thu, 10 Jul 2025 00:12:39 +0000 (17:12 -0700)
* src/factor.c (factor_insert_multiplicity):
Adjust to keep in sync with mp_factor_insert changes below,
by adding 1 to the index and using memmove to move.
(mp_factor_insert): Omit redundant call to mpz_cmp.
Prefer idx_t (always nonnegative) to ptrdiff_t,
by adding 1 to the indexes.
Prefer mpz_init_set to mpz_init+mpz_set.
Use memmove to move, rather than doing it by hand.

src/factor.c

index 2d91e9e4fca2d918d6b461b8e00b3cec1abe725d..2cf2ecde382bd3c64f0beada28e48b8bf67920dc 100644 (file)
@@ -532,27 +532,22 @@ factor_insert_multiplicity (struct factors *factors,
 
   /* Locate position for insert new or increment e.  */
   int i;
-  for (i = nfactors - 1; i >= 0; i--)
+  for (i = nfactors; 0 < i; i--)
     {
-      if (p[i] <= prime)
+      if (p[i - 1] < prime)
         break;
-    }
-
-  if (i < 0 || p[i] != prime)
-    {
-      for (int j = nfactors - 1; j > i; j--)
+      if (p[i - 1] == prime)
         {
-          p[j + 1] = p[j];
-          e[j + 1] = e[j];
+          e[i - 1] += m;
+          return;
         }
-      p[i + 1] = prime;
-      e[i + 1] = m;
-      factors->nfactors = nfactors + 1;
-    }
-  else
-    {
-      e[i] += m;
     }
+
+  factors->nfactors = nfactors + 1;
+  memmove (&p[i + 1], &p[i], (nfactors - i) * sizeof *p);
+  memmove (&e[i + 1], &e[i], (nfactors - i) * sizeof *e);
+  e[i] = m;
+  p[i] = prime;
 }
 
 #define factor_insert(f, p) factor_insert_multiplicity (f, p, 1)
@@ -619,40 +614,32 @@ mp_factor_insert (struct mp_factors *factors, mpz_t prime)
   idx_t nfactors = factors->nfactors;
   mpz_t *p = factors->p;
   mp_bitcnt_t *e = factors->e;
-  ptrdiff_t i;
+  idx_t i;
 
   /* Locate position for insert new or increment e.  */
-  for (i = nfactors - 1; i >= 0; i--)
+  for (i = nfactors; 0 < i; i--)
     {
-      if (mpz_cmp (p[i], prime) <= 0)
+      int sgn = mpz_cmp (p[i - 1], prime);
+      if (sgn < 0)
         break;
-    }
-
-  if (i < 0 || mpz_cmp (p[i], prime) != 0)
-    {
-      if (factors->nfactors == factors->nalloc)
-        {
-          p = xpalloc (p, &factors->nalloc, 1, -1, sizeof *p);
-          e = xireallocarray (e, factors->nalloc, sizeof *e);
-        }
-
-      mpz_init (p[nfactors]);
-      for (ptrdiff_t j = nfactors - 1; j > i; j--)
+      if (sgn == 0)
         {
-          mpz_set (p[j + 1], p[j]);
-          e[j + 1] = e[j];
+          e[i - 1]++;
+          return;
         }
-      mpz_set (p[i + 1], prime);
-      e[i + 1] = 1;
-
-      factors->p = p;
-      factors->e = e;
-      factors->nfactors = nfactors + 1;
     }
-  else
+
+  if (nfactors == factors->nalloc)
     {
-      e[i] += 1;
+      factors->p = p = xpalloc (p, &factors->nalloc, 1, -1, sizeof *p);
+      factors->e = e = xireallocarray (e, factors->nalloc, sizeof *e);
     }
+
+  factors->nfactors = nfactors + 1;
+  memmove (&p[i + 1], &p[i], (nfactors - i) * sizeof *p);
+  memmove (&e[i + 1], &e[i], (nfactors - i) * sizeof *e);
+  e[i] = 1;
+  mpz_init_set (p[i], prime);
 }
 
 static void