[Gmp-commit] /var/hg/gmp: mpn/generic/perfpow.c (is_kth_power): Avoid NORMALI...

mercurial at gmplib.org mercurial at gmplib.org
Sun Jul 26 11:56:25 CEST 2026


details:   /var/hg/gmp/rev/b4d0ee7d9773
changeset: 18574:b4d0ee7d9773
user:      Marco Bodrato <bodrato at mail.dm.unipi.it>
date:      Sun Jul 26 11:54:09 2026 +0200
description:
mpn/generic/perfpow.c (is_kth_power): Avoid NORMALIZE, if the lenght
is not the expected one, it can't be the kth-root; don't check.

diffstat:

 mpn/generic/perfpow.c |  13 ++++++++-----
 1 files changed, 8 insertions(+), 5 deletions(-)

diffs (23 lines):

diff -r 02706696cbb3 -r b4d0ee7d9773 mpn/generic/perfpow.c
--- a/mpn/generic/perfpow.c	Thu Jul 23 11:03:20 2026 +0200
+++ b/mpn/generic/perfpow.c	Sun Jul 26 11:54:09 2026 +0200
@@ -158,11 +158,14 @@
       b = 1 + (f - 1) / k;
       rn = 1 + (b - 1) / GMP_LIMB_BITS;
       mpn_brootinv (rp, ip, rn, k, tp);
-      if ((b % GMP_LIMB_BITS) != 0)
-	rp[rn - 1] &= (CNST_LIMB(1) << (b % GMP_LIMB_BITS)) - 1;
-      MPN_NORMALIZE (rp, rn);
-      if (pow_equals (np, n, rp, rn, k, f, tp) != 0)
-	return 1;
+      mp_limb_t mask = CNST_LIMB(1) << (b - 1) % GMP_LIMB_BITS;
+      /* If the espected highest bit is not set, it's not the root. */
+      if ((rp [rn - 1] & mask) != 0)
+	{
+	  rp[rn - 1] &= (mask << 1) - CNST_LIMB (1);
+	  if (pow_equals (np, n, rp, rn, k, f, tp) != 0)
+	    return 1;
+	}
     }
   MPN_ZERO (rp, rn); /* Untrash rp */
   return 0;


More information about the gmp-commit mailing list