[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