[libmath-prime-util-perl] 27/54: Only test for squares and cubes in factor. Lowers cost.

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


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

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

commit 26aaca2922d182d6c81380e903e3aadcb7984178
Author: Dana Jacobsen <dana at acm.org>
Date:   Wed Feb 12 17:28:38 2014 -0800

    Only test for squares and cubes in factor.  Lowers cost.
---
 factor.c                    | 10 ++++------
 t/92-release-pod-coverage.t |  1 +
 2 files changed, 5 insertions(+), 6 deletions(-)

diff --git a/factor.c b/factor.c
index f23c227..cf028e6 100644
--- a/factor.c
+++ b/factor.c
@@ -10,6 +10,7 @@
 #include "cache.h"
 #include "primality.h"
 #define FUNC_isqrt  1
+#define FUNC_icbrt  1
 #define FUNC_gcd_ui 1
 #define FUNC_is_perfect_square 1
 #define FUNC_clz 1
@@ -81,14 +82,11 @@ int factor(UV n, UV *factors)
       factors[nfactors++] = n;
     return nfactors;
   }
-  /* Perfect powers.  Factor root only once. */
+  /* Perfect squares and cubes.  Factor root only once. */
   {
-    int i, j, k = powerof(n);
+    int i, j, k = is_power(n,2) ? 2 : is_power(n,3) ? 3 : 1;
     if (k > 1) {
-      UV p = (k == 2) ? isqrt(n) : (UV) (pow(n, 1.0/(double)k) + 0.01);
-      UV pk = p*p;
-      for (i = 2; i < k; i++)  pk *= p;
-      MPUassert( pk == n, "incorrect root in factor" );
+      UV p = (k == 2) ? isqrt(n) : icbrt(n);
       if (is_prob_prime(p)) {
         for (j = 0; j < k; j++)
           factors[nfactors++] = p;
diff --git a/t/92-release-pod-coverage.t b/t/92-release-pod-coverage.t
index ba0a023..3d235d8 100644
--- a/t/92-release-pod-coverage.t
+++ b/t/92-release-pod-coverage.t
@@ -46,6 +46,7 @@ sub mpu_public_regex {
       is_almost_extra_strong_lucas_pseudoprime
       is_frobenius_underwood_pseudoprime
       is_aks_prime is_bpsw_prime
+      is_power
       miller_rabin miller_rabin_random
       lucas_sequence
       primes

-- 
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