[libmath-prime-util-perl] 24/54: Add perfect power test in factoring

Partha P. Mukherjee ppm-guest at moszumanska.debian.org
Thu May 21 18:52:08 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 fa0226e6d2c26aad7a36cb5371f48d9b0b835fac
Author: Dana Jacobsen <dana at acm.org>
Date:   Tue Feb 11 17:22:04 2014 -0800

    Add perfect power test in factoring
---
 Changes  |  7 +++++++
 factor.c | 22 ++++++++++++++++++++++
 2 files changed, 29 insertions(+)

diff --git a/Changes b/Changes
index fedc152..eb94700 100644
--- a/Changes
+++ b/Changes
@@ -6,6 +6,13 @@ Revision history for Perl module Math::Prime::Util
 
     - is_power         Returns max k if n=p^k.  See Pari 2.4.x.
 
+    [FUNCTIONALITY AND PERFORMANCE]
+
+    - Factoring powers is much faster.
+
+    [OTHER]
+
+    - Added some Project Euler examples.
 
 0.37  2014-01-26
 
diff --git a/factor.c b/factor.c
index cce32fb..f23c227 100644
--- a/factor.c
+++ b/factor.c
@@ -81,6 +81,28 @@ int factor(UV n, UV *factors)
       factors[nfactors++] = n;
     return nfactors;
   }
+  /* Perfect powers.  Factor root only once. */
+  {
+    int i, j, k = powerof(n);
+    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" );
+      if (is_prob_prime(p)) {
+        for (j = 0; j < k; j++)
+          factors[nfactors++] = p;
+        return nfactors;
+      } else {
+        int nsmallfactors = nfactors;
+        nfactors = factor(p, factors+nsmallfactors);
+        for (i = nfactors; i >= 0; i--)
+          for (j = 0; j < k; j++)
+            factors[nsmallfactors+k*i+j] = factors[nsmallfactors+i];
+        return nsmallfactors + k*nfactors;
+      }
+    }
+  }
 
   {
   UV tofac_stack[MPU_MAX_FACTORS+1];

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