[libmath-prime-util-perl] 02/29: Speedups for pure perl factoring of small numbers

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


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

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

commit 0540efda916ce5665f16122a4c62de1ed41a8d03
Author: Dana Jacobsen <dana at acm.org>
Date:   Mon Apr 22 14:42:33 2013 -0700

    Speedups for pure perl factoring of small numbers
---
 Changes                   |  4 ++++
 lib/Math/Prime/Util/PP.pm | 21 ++++++++++-----------
 2 files changed, 14 insertions(+), 11 deletions(-)

diff --git a/Changes b/Changes
index c2d3246..121078e 100644
--- a/Changes
+++ b/Changes
@@ -1,5 +1,9 @@
 Revision history for Perl extension Math::Prime::Util.
 
+0.27 xx April 2013
+
+    - Speedup pure Perl factoring of small numbers.
+
 0.26 21 April 2013
 
     - Pure Perl factoring:
diff --git a/lib/Math/Prime/Util/PP.pm b/lib/Math/Prime/Util/PP.pm
index 4207bd9..a1349f7 100644
--- a/lib/Math/Prime/Util/PP.pm
+++ b/lib/Math/Prime/Util/PP.pm
@@ -1122,16 +1122,17 @@ sub trial_factor {
   return @factors if $n < 4;
 
   my $limit = int( sqrt($n) + 0.001);
-  my $f = 3;
-  while ($f <= $limit) {
-    if ( ($n % $f) == 0) {
-      while ( ($n % $f) == 0) {
-        push @factors, $f;
-        $n = int($n/$f);
+  my $f = 7;
+  SEARCH: while ($f <= $limit) {
+    foreach my $finc (4, 2, 4, 2, 4, 6, 2, 6) {
+      if ( (($n % $f) == 0) && ($f <= $limit) ) {
+        do { push @factors, $f; $n = int($n/$f); } while (($n % $f) == 0);
+        $n = int($n->bstr) if ref($n) eq 'Math::BigInt' && $n <= ~0;
+        last SEARCH if $n == 1 || Math::Prime::Util::is_prob_prime($n);
+        $limit = int( sqrt($n) + 0.001);
       }
-      $limit = int( sqrt($n) + 0.001);
+      $f += $finc;
     }
-    $f += 2;
   }
   push @factors, $n  if $n > 1;
   @factors;
@@ -1139,8 +1140,6 @@ sub trial_factor {
 
 my $_holf_r;
 my @_fsublist = (
-  sub { my $n = shift; return ($n) unless $n < $_half_word;
-        holf_factor   ($n,      64*1024, $_holf_r); $_holf_r +=  64*1024; },
   sub { prho_factor   (shift,    8*1024, 3) },
   sub { pbrent_factor (shift,   32*1024, 1) },
   sub { pminus1_factor(shift,    10_000); },
@@ -1165,7 +1164,7 @@ sub factor {
   _validate_positive_integer($n);
   $n = $n->copy if ref($n) eq 'Math::BigInt';
 
-  return trial_factor($n) if $n < 100000;
+  return trial_factor($n) if $n < 1_000_000;
 
   my @factors = _basic_factor($n);
   return @factors if $n < 4;

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