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

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

commit 5a80aebfb55ccb71bbe9d9678e7f3b99dbee928d
Author: Dana Jacobsen <d...@acm.org>
Date:   Mon Mar 18 18:20:57 2013 -0700

    Allow turning on/off gnufactor or pari
---
 examples/test-factor-gnufactor.pl | 99 +++++++++++++++++++++++++++------------
 1 file changed, 70 insertions(+), 29 deletions(-)

diff --git a/examples/test-factor-gnufactor.pl 
b/examples/test-factor-gnufactor.pl
index dc9c6af..8f0e9b9 100755
--- a/examples/test-factor-gnufactor.pl
+++ b/examples/test-factor-gnufactor.pl
@@ -14,6 +14,27 @@ $| = 1;  # fast pipes
 srand(87431);
 my $num = 1000;
 
+# Note: If you have factor from coreutils 8.20 or later (e.g. you're running
+# Fedora), then GNU factor will be very fast and support at least 128-bit
+# inputs (~44 digits).  Its growth is not great however, so 25+ digits starts
+# getting slow.  The authors wrote on a forum that a future version will
+# include a TinyQS, which should make it really rock for medium-size inputs.
+#
+# On the other hand, if you have the older factor (e.g. you're running
+# Ubuntu) then GNU factor uses trial division so will be very painful for
+# large numbers.  You'll probably want to turn it off here as it will be
+# many thousands of times slower than MPU and Pari.
+
+# A performance note: MPU and Pari get their results by calling a function.
+# GNU factor gets its result by multiple shells out to /usr/bin/factor with
+# the numbers as command line arguments.  This adds a lot of overhead that
+# has nothing to do with their implementation.  For comparison, try turning
+# on the MPU factor.pl script, and weep for Perl's startup cost.
+
+my $do_gnu = 1;
+my $do_pari = 1;
+my $use_mpu_factor_script = 0;
+
 my $rgen = sub {
   my $range = shift;
   return 0 if $range <= 0;
@@ -46,47 +67,56 @@ foreach my $digits (5 .. $maxdigits) {
 sub test_array {
   my @narray = @_;
   my($start, $mpusec, $gnusec, $parisec, $diff);
+  my(@mpuarray, @gnuarray, @pariarray);
 
   print ".";
   $start = [gettimeofday];
-  my @mpuarray = mpu_factors(@narray);
+  @mpuarray = mpu_factors(@narray);
   $mpusec = tv_interval($start);
 
-  print ".";
-  $start = [gettimeofday];
-  my @gnuarray = gnu_factors(@narray);
-  $gnusec = tv_interval($start);
+  if ($do_gnu) {
+    print ".";
+    $start = [gettimeofday];
+    @gnuarray = gnu_factors(@narray);
+    $gnusec = tv_interval($start);
+  }
 
-  print ".";
-  $start = [gettimeofday];
-  my @pariarray = pari_factors(@narray);
-  $parisec = tv_interval($start);
+  if ($do_pari) {
+    print ".";
+    $start = [gettimeofday];
+    @pariarray = pari_factors(@narray);
+    $parisec = tv_interval($start);
+  }
 
   print ".";
   die "MPU got ", scalar @mpuarray, " factors.  GNU factor got ",
-      scalar @gnuarray, "\n" unless $#mpuarray == $#gnuarray;
+      scalar @gnuarray, "\n" unless !$do_gnu || $#mpuarray == $#gnuarray;
   die "MPU got ", scalar @mpuarray, " factors.  Pari factor got ",
-      scalar @pariarray, "\n" unless $#mpuarray == $#pariarray;
+      scalar @pariarray, "\n" unless !$do_pari || $#mpuarray == $#pariarray;
   foreach my $n (@narray) {
     my @mpu  = @{shift @mpuarray};
-    my @gnu  = @{shift @gnuarray};
-    my @pari = @{shift @pariarray};
     die "mpu array is for the wrong n?" unless $n == shift @mpu;
-    die "gnu array is for the wrong n?" unless $n == shift @gnu;
-    die "pari array is for the wrong n?" unless $n == shift @pari;
-    $diff = diff \@mpu, \@gnu, { STYLE => 'Table' };
-    die "factor($n): MPU/GNU\n$diff\n" if length($diff) > 0;
-    my $diff = diff \@mpu, \@pari, { STYLE => 'Table' };
-    die "factor($n): MPU/Pari\n$diff\n" if length($diff) > 0;
+    if ($do_gnu) {
+      my @gnu  = @{shift @gnuarray};
+      die "gnu array is for the wrong n?" unless $n == shift @gnu;
+      $diff = diff \@mpu, \@gnu, { STYLE => 'Table' };
+      die "factor($n): MPU/GNU\n$diff\n" if length($diff) > 0;
+    }
+    if ($do_pari) {
+      my @pari = @{shift @pariarray};
+      die "pari array is for the wrong n?" unless $n == shift @pari;
+      my $diff = diff \@mpu, \@pari, { STYLE => 'Table' };
+      die "factor($n): MPU/Pari\n$diff\n" if length($diff) > 0;
+    }
   }
   print ".";
   # We should ignore the small digits, since we're comparing direct
   # Perl functions with multiple command line invocations.  It really
   # doesn't make sense until we're over 1ms per number.
-  printf "OK  MPU:%7.2f ms  GNU:%7.2f ms  Pari:%7.2f ms\n",
-         (($mpusec*1000) / scalar @narray),
-         (($gnusec*1000) / scalar @narray),
-         (($parisec*1000) / scalar @narray);
+  printf "OK  MPU:%8.3f ms", (($mpusec*1000) / scalar @narray);
+  printf("  GNU:%8.3f ms", (($gnusec*1000) / scalar @narray)) if $do_gnu;
+  printf("  Pari:%8.3f ms", (($parisec*1000) / scalar @narray)) if $do_pari;
+  print "\n";
 }
 
 sub gendigits {
@@ -109,7 +139,22 @@ sub gendigits {
 
 sub mpu_factors {
   my @piarray;
-  push @piarray, [$_, factor($_)] for @_;
+
+  if (!$use_mpu_factor_script) {
+    push @piarray, [$_, factor($_)] for @_;
+  } else {
+    my @ns = @_;
+    my $numpercommand = int( (4000-30)/(length($ns[-1])+1) );
+    while (@ns) {
+      my $cs = join(" ", '/usr/bin/factor', splice(@ns, 0, $numpercommand));
+      my $fout = qx{$cs};
+      my @flines = split(/\n/, $fout);
+      foreach my $fline (@flines) {
+        $fline =~ s/^(\d+): //;
+        push @piarray, [$1, split(/ /, $fline)];
+      }
+    }
+  }
   @piarray;
 }
 
@@ -119,11 +164,7 @@ sub gnu_factors {
   my $numpercommand = int( (4000-30)/(length($ns[-1])+1) );
 
   while (@ns) {
-    my $cs = '/usr/bin/factor';
-    foreach my $n (1 .. $numpercommand) {
-      last unless @ns;
-      $cs .= " " . shift @ns;
-    }
+    my $cs = join(" ", '/usr/bin/factor', splice(@ns, 0, $numpercommand));
     my $fout = qx{$cs};
     my @flines = split(/\n/, $fout);
     foreach my $fline (@flines) {

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

_______________________________________________
Pkg-perl-cvs-commits mailing list
Pkg-perl-cvs-commits@lists.alioth.debian.org
http://lists.alioth.debian.org/cgi-bin/mailman/listinfo/pkg-perl-cvs-commits

Reply via email to