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

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

commit 32c0cf3067f28f7d66188bf2e33e6319c1b54e2a
Author: Dana Jacobsen <d...@acm.org>
Date:   Sat Oct 20 03:31:30 2012 -0600

    Minor issues with huge inputs
---
 lib/Math/Prime/Util.pm    | 57 ++++++++++++++++++++++++++++-------------------
 lib/Math/Prime/Util/PP.pm |  7 +++---
 2 files changed, 37 insertions(+), 27 deletions(-)

diff --git a/lib/Math/Prime/Util.pm b/lib/Math/Prime/Util.pm
index b858b03..43eba86 100644
--- a/lib/Math/Prime/Util.pm
+++ b/lib/Math/Prime/Util.pm
@@ -197,7 +197,8 @@ sub _validate_positive_integer {
 sub _upgrade_to_float {
   my($n) = @_;
   return $n unless defined $Math::BigInt::VERSION || defined 
$Math::BigFloat::VERSION;
-  do { require Math::BigFloat; Math::BigFloat->import; } if defined 
$Math::BigInt::VERSION && !defined $Math::BigFloat::VERSION;
+  do { require Math::BigFloat; Math::BigFloat->import(try=>'GMP,Pari') }
+     if defined $Math::BigInt::VERSION && !defined $Math::BigFloat::VERSION;
   return Math::BigFloat->new($n);
 }
 
@@ -239,7 +240,8 @@ sub primes {
     if ($_HAVE_GMP) {
       $sref = Math::Prime::Util::GMP::primes($low,$high);
       # Convert the returned strings into BigInts
-      croak "Internal error: large value without bigint loaded." unless 
defined $Math::BigInt::VERSION;
+      croak "Internal error: large value without bigint loaded."
+            unless defined $Math::BigInt::VERSION;
       @$sref = map { Math::BigInt->new("$_") } @$sref;
       return $sref;
     }
@@ -566,8 +568,8 @@ sub primes {
     return random_nbit_prime($k) if $k <= $p0;
 
     eval {
-      require Math::BigInt;   Math::BigInt->import();
-      require Math::BigFloat; Math::BigFloat->import();
+      require Math::BigInt;   Math::BigInt->import(   try=>'GMP,Pari' );
+      require Math::BigFloat; Math::BigFloat->import( try=>'GMP,Pari' );
       1;
     } or do {
       croak "Cannot load Math::BigInt and Math::BigFloat";
@@ -913,6 +915,8 @@ sub miller_rabin {
 
 #############################################################################
 
+  # Oct 2012 note:  these numbers are old.
+  #
   # Timings for various combinations, given the current possibilities of:
   #    1) XS MR optimized (either x86-64, 32-bit on 64-bit mach, or half-word)
   #    2) XS MR non-optimized (big input not on 64-bit machine)
@@ -990,11 +994,11 @@ sub prime_count_approx {
   #
   # Also consider: http://trac.sagemath.org/sage_trac/ticket/8135
 
-  # return int( (prime_count_upper($x) + prime_count_lower($x)) / 2);
+  # my $result = int( (prime_count_upper($x) + prime_count_lower($x)) / 2);
 
-  # return int( LogarithmicIntegral($x) );
+  # my $result = int( LogarithmicIntegral($x) );
 
-  # return int( LogarithmicIntegral($x) - LogarithmicIntegral(sqrt($x))/2 );
+  # my $result = int(LogarithmicIntegral($x) - 
LogarithmicIntegral(sqrt($x))/2);
 
   my $result = RiemannR($x) + 0.5;
 
@@ -1240,7 +1244,7 @@ sub RiemannZeta {
   my($n) = @_;
   croak("Invalid input to ReimannZeta:  x must be > 0") if $n <= 0;
 
-  #return Math::Prime::Util::PP::RiemannZeta($n, 1e-30) if defined 
$bignum::VERSION || ref($n) eq 'Math::BigFloat';
+  #return Math::Prime::Util::PP::RiemannZeta($n) if defined $bignum::VERSION 
|| ref($n) eq 'Math::BigFloat';
   return Math::Prime::Util::PP::RiemannZeta($n) if !$_Config{'xs'};
   return _XS_RiemannZeta($n);
 }
@@ -1249,7 +1253,7 @@ sub RiemannR {
   my($n) = @_;
   croak("Invalid input to ReimannR:  x must be > 0") if $n <= 0;
 
-  return Math::Prime::Util::PP::RiemannR($n, 1e-30) if defined 
$bignum::VERSION || ref($n) eq 'Math::BigFloat';
+  return Math::Prime::Util::PP::RiemannR($n) if defined $bignum::VERSION || 
ref($n) eq 'Math::BigFloat';
   return Math::Prime::Util::PP::RiemannR($n) if !$_Config{'xs'};
   return _XS_RiemannR($n);
 
@@ -1264,7 +1268,7 @@ sub ExponentialIntegral {
   my($n) = @_;
   croak "Invalid input to ExponentialIntegral:  x must be != 0" if $n == 0;
 
-  return Math::Prime::Util::PP::ExponentialIntegral($n, 1e-30) if defined 
$bignum::VERSION || ref($n) eq 'Math::BigFloat';
+  return Math::Prime::Util::PP::ExponentialIntegral($n) if defined 
$bignum::VERSION || ref($n) eq 'Math::BigFloat';
   return Math::Prime::Util::PP::ExponentialIntegral($n) if !$_Config{'xs'};
   return _XS_ExponentialIntegral($n);
 }
@@ -1476,21 +1480,28 @@ is less than a millisecond, it's really not important 
in general (also, a
 future implementation may find a way to speed this up without the option).
 
 
-If you are using bigints, there are two performance suggestions.  The first
-is to install L<Math::Prime::Util::GMP>, as that will vastly increase the speed
-for many of the functions.  This does require the L<GMP|gttp://gmplib.org>
-library be installed on your system, but this increasingly comes pre-installed
-or easily available using the OS vendor package installation tool.  If you
-do not want to use that, I recommend L<Math::BigInt::GMP> or
-L<Math::BigInt::Pari> and then writing C<use bigint try =E<gt> 'GMP,Pari'>.
-Large modular exponentiation is much faster using the GMP or Pari backends.
-This is not so important if you installed L<Math::Prime::Util::GMP>, but it can
-still speed up large random Maurer primes.
+If you are using bigints, here are some performance suggestions:
+
+=over 4
+
+=item Install L<Math::Prime::Util::GMP>, as that will vastly increase the
+      speed of many of the functions.  This does require the
+      L<GMP|gttp://gmplib.org> library be installed on your system, but this
+      increasingly comes pre-installed or easily available using the OS vendor
+      package installation tool.
+
+=item Install and use L<Math::BigInt::GMP> or L<Math::BigInt::Pari>, then use
+      C<use bigint try =E<gt> 'GMP,Pari'> in your script, or on the command
+      line C<-Mbigint=lib,GMP>.  Large modular exponentiation is much faster
+      using the GMP or Pari backends, as are the math and approximation
+      functions when called with very large inputs.
 
+=item Having run these functions on many versions of Perl, if you're using
+      anything older than Perl 5.14, I would recommend you upgrade if you
+      are using bignums a lot.  There are some brittle behaviors on
+      5.12.4 and earlier with bignums.
 
-Having run these functions on many versions of Perl, if you're using anything
-older than Perl 5.14, I would recommend you upgrade if you are using bignums
-a lot.  There are some brittle behaviors on 5.12.4 and earlier with bignums.
+=back
 
 
 =head1 FUNCTIONS
diff --git a/lib/Math/Prime/Util/PP.pm b/lib/Math/Prime/Util/PP.pm
index 0750638..515b9fb 100644
--- a/lib/Math/Prime/Util/PP.pm
+++ b/lib/Math/Prime/Util/PP.pm
@@ -1281,14 +1281,13 @@ sub RiemannZeta {
   for my $k (2 .. 1000000) {
     my $term = (2*$k+1) ** -$x;
     $y = $term-$c; $t = $sum+$y; $c = ($t-$sum)-$y; $sum = $t;
-    last if abs($term/$sum) < $tol;
+    last if $term < abs($tol*$sum);
   }
   my $term = 3 ** -$x;
   $y = $term-$c; $t = $sum+$y; $c = ($t-$sum)-$y; $sum = $t;
   $t = 1.0 / (1.0 - (2 ** -$x));
   $sum *= $t;
-  $term = $t - 1.0;
-  $y = $term-$c; $t = $sum+$y; $c = ($t-$sum)-$y; $sum = $t;
+  $sum += ($t - 1.0);
 
   $sum;
 }
@@ -1316,7 +1315,7 @@ sub RiemannR {
     $part_term *= $flogx / $k;
     my $term = $part_term / ($k + $k * $zeta);
     $y = $term-$c; $t = $sum+$y; $c = ($t-$sum)-$y; $sum = $t;
-    last if abs($term) < $tol;
+    last if abs($term/$sum) < $tol;
   }
   $sum;
 }

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