[libmath-prime-util-perl] 20/55: Speedup for znprimroot

Partha P. Mukherjee ppm-guest at moszumanska.debian.org
Thu May 21 18:53:40 UTC 2015


This is an automated email from the git hooks/post-receive script.

ppm-guest pushed a commit to annotated tag v0.41
in repository libmath-prime-util-perl.

commit d51a718dd512fd0fe85ce8301302c6aedc092421
Author: Dana Jacobsen <dana at acm.org>
Date:   Fri May 2 16:13:28 2014 -0700

    Speedup for znprimroot
---
 util.c | 20 +++++++-------------
 1 file changed, 7 insertions(+), 13 deletions(-)

diff --git a/util.c b/util.c
index b914bad..6286f44 100644
--- a/util.c
+++ b/util.c
@@ -1460,19 +1460,13 @@ UV znprimroot(UV n) {
   if (n % 4 == 0)  return 0;
   if (is_prob_prime(n)) {
     phi = n-1;
-  } else {  /* Calculate Totient and Carmichael Lambda at same time */
-    UV lambda = 1;
-    nfactors = factor_exp(n, fac, exp);
-    phi = 1;
-    for (i = 0; i < nfactors; i++) {
-      UV pk = fac[i]-1;
-      for (j = 1; j < exp[i]; j++)
-        pk *= fac[i];
-      phi *= pk;
-      if (i == 0 && fac[0] == 2 && exp[0] > 2)  pk >>= 1;
-      lambda = lcm_ui(lambda, pk);
-    }
-    if (phi != lambda) return 0; /* prim root exists only if phi(n) = CL(n) */
+  } else {  /* prim root exists if n is 2, 4, p^a, or 2(p^a) for odd prime p */
+    if (n & 0x3) nfactors = factor_exp( (n&1) ? n : n>>1, fac, exp);
+    else         nfactors = 0;
+    if (nfactors != 1) return 0;
+    phi = fac[0]-1;  /* n = p^a for odd prime p.  Calculate totient. */
+    for (i = 1; i < exp[0]; i++)
+      phi *= fac[0];
   }
   nfactors = factor_exp(phi, fac, exp);
   for (i = 0; i < nfactors; i++)

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-perl/packages/libmath-prime-util-perl.git



More information about the Pkg-perl-cvs-commits mailing list