[libmath-prime-util-perl] 16/35: Speedups for pure perl testing

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


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

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

commit ee69ab7813cf44f75ddd3fd557e0a004b459cbe5
Author: Dana Jacobsen <dana at acm.org>
Date:   Tue Oct 29 16:10:00 2013 -0700

    Speedups for pure perl testing
---
 lib/Math/Prime/Util.pm                  | 15 +++++++--------
 lib/Math/Prime/Util/PP.pm               | 18 +++++++++++-------
 lib/Math/Prime/Util/PrimalityProving.pm |  1 +
 t/19-moebius.t                          | 11 +++++++++--
 t/50-factoring.t                        |  9 +++++++++
 t/81-bignum.t                           |  4 ++--
 6 files changed, 39 insertions(+), 19 deletions(-)

diff --git a/lib/Math/Prime/Util.pm b/lib/Math/Prime/Util.pm
index dae7acb..600ed21 100644
--- a/lib/Math/Prime/Util.pm
+++ b/lib/Math/Prime/Util.pm
@@ -1418,10 +1418,12 @@ sub mertens {
     my $inner_sum = 0;
     my $lower = int($u/$m) + 1;
     my $last_nmk = int($n/($m*$lower));
-    my ($this_k, $next_k) = (0, int($n/($m*1)));
+    my ($denom, $this_k, $next_k) = ($m, 0, int($n/($m*1)));
     for my $nmk (1 .. $last_nmk) {
-      $this_k = $next_k;
-      $next_k = int($n/($m*($nmk+1)));
+      $denom += $m;
+      $this_k = int($n/$denom);
+      next if $this_k == $next_k;
+      ($this_k, $next_k) = ($next_k, $this_k);
       $inner_sum += $M[$nmk] * ($this_k - $next_k);
     }
     $sum -= $mu[$m] * $inner_sum;
@@ -1678,12 +1680,9 @@ sub partitions {
   if ($_HAVE_GMP && defined &Math::Prime::Util::GMP::partitions) {
     return Math::BigInt->new( '' . Math::Prime::Util::GMP::partitions($n) );
   }
-  my @part = (Math::BigInt->bone);
-  my @pent = (1);
   my $d = int(sqrt($n+1));
-  foreach my $i ( 1 .. $d ) {
-    push @pent, int(($i*(3*$i+1))/2), int((($i+1)*(3*$i+2))/2);
-  }
+  my @pent = (1, map { ($_*(3*$_+1))>>1, (($_+1)*(3*$_+2))>>1 } 1 .. $d);
+  my @part = (Math::BigInt->bone);
   foreach my $j (scalar @part .. $n) {
     my ($psum1, $psum2, $k) = (Math::BigInt->bzero, Math::BigInt->bzero, 1);
     foreach my $p (@pent) {
diff --git a/lib/Math/Prime/Util/PP.pm b/lib/Math/Prime/Util/PP.pm
index 6d3d085..67bc7e7 100644
--- a/lib/Math/Prime/Util/PP.pm
+++ b/lib/Math/Prime/Util/PP.pm
@@ -145,10 +145,14 @@ sub _is_prime7 {  # n must not be divisible by 2, 3, or 5
     return 2;
   }
 
-  return 0 if !($n %  7) || !($n % 11) || !($n % 13) || !($n % 17) ||
-              !($n % 19) || !($n % 23) || !($n % 29) || !($n % 31) ||
-              !($n % 37) || !($n % 41) || !($n % 43) || !($n % 47) ||
-              !($n % 53) || !($n % 59);
+  if (ref($n) eq 'Math::BigInt') {
+    return 0 unless Math::BigInt::bgcd($n, "64092011671807087969")->is_one;
+  } else {
+    return 0 if !($n %  7) || !($n % 11) || !($n % 13) || !($n % 17) ||
+                !($n % 19) || !($n % 23) || !($n % 29) || !($n % 31) ||
+                !($n % 37) || !($n % 41) || !($n % 43) || !($n % 47) ||
+                !($n % 53) || !($n % 59);
+  }
 
   if ($n <= 1_000_000) {
     my $limit = int(sqrt($n));
@@ -792,9 +796,7 @@ sub miller_rabin {
   _validate_positive_integer($n);
   croak "No bases given to miller_rabin" unless @bases;
 
-  return 0 if ($n == 0) || ($n == 1);
-  return 1 if ($n == 2) || ($n == 3);
-  return 0 if !($n % 2);
+  return $n >> 1 if $n <= 3;
 
   # Die on invalid bases
   foreach my $base (@bases) { croak "Base $base is invalid" if $base < 2 }
@@ -803,6 +805,7 @@ sub miller_rabin {
 
   if ( ref($n) eq 'Math::BigInt' ) {
 
+    return 0 if $n->is_even;
     my $nminus1 = $n->copy->bdec();
     my $s = 0;
     my $d = $nminus1->copy;
@@ -829,6 +832,7 @@ sub miller_rabin {
 
   } else {
 
+   return 0 unless $n & 1;
    my $s = 0;
    my $d = $n - 1;
    while ( ($d & 1) == 0 ) {
diff --git a/lib/Math/Prime/Util/PrimalityProving.pm b/lib/Math/Prime/Util/PrimalityProving.pm
index 9e73fd5..83c72eb 100644
--- a/lib/Math/Prime/Util/PrimalityProving.pm
+++ b/lib/Math/Prime/Util/PrimalityProving.pm
@@ -129,6 +129,7 @@ sub primality_proof_bls75 {
   my @factors = (2);
   croak "BLS75 error: n-1 not even" unless $nm1->is_even();
   my $trial_B = 20000;
+  $trial_B = 500 if ! prime_get_config->{'xs'};
   {
     while ($B->is_even) { $B /= 2; $A *= 2; }
     my @tf = Math::Prime::Util::PP::trial_factor($B, $trial_B);
diff --git a/t/19-moebius.t b/t/19-moebius.t
index b5b5160..9db14d4 100644
--- a/t/19-moebius.t
+++ b/t/19-moebius.t
@@ -41,6 +41,9 @@ my %big_mertens = (
   1000000 =>  212,
  10000000 => 1037,
 );
+if (!$extra && !Math::Prime::Util::prime_get_config->{'xs'}) {
+  delete $big_mertens{10000000};
+}
 if ($extra && $use64) {
   %big_mertens = ( %big_mertens,
           2 =>  0,      # A087987, mertens at primorials
@@ -143,7 +146,7 @@ my %chebyshev1 = (
        4 =>       1.79175946922805,
        5 =>       3.40119738166216,
      243 =>     226.593507136467,
- 1234567 => 1233272.80087825,
+  123456 =>  123034.091739914,
 );
 my %chebyshev2 = (
        0 =>       0,
@@ -153,8 +156,12 @@ my %chebyshev2 = (
        4 =>       2.484906649788,
        5 =>       4.0943445622221,
      243 =>     245.274469978683,
- 1234567 => 1234515.17962833,
+  123456 =>  123435.148054491
 );
+if ($extra) {
+  $chebyshev1{1234567} = 1233272.80087825;
+  $chebyshev2{1234567} = 1234515.17962833;
+}
 
 my @A002322 = (0,1,1,2,2,4,2,6,2,6,4,10,2,12,6,4,4,16,6,18,4,6,10,22,2,20,12,18,6,28,4,30,8,10,16,12,6,36,18,12,4,40,6,42,10,12,22,46,4,42,20,16,12,52,18,20,6,18,28,58,4,60,30,6,16,12,10,66,16,22,12,70,6,72,36,20,18,30,12,78,4,54,40,82,6,16,42,28,10,88,12,12,22,30,46,36,8,96,42,30,20,100,16,102,12,12,52,106,18,108,20,36,12,112,18,44,28,12,58,48,4,110,60,40,30,100,6,126,32,42,12,130,10,18,66,36,16,136,22,138,12,46,70,60,12,28,72,42,36,148,20,150,18,48,30,60,12,156,78,52,8,66,54,162,40,20, [...]
 
diff --git a/t/50-factoring.t b/t/50-factoring.t
index 32af300..4cc339d 100644
--- a/t/50-factoring.t
+++ b/t/50-factoring.t
@@ -50,6 +50,15 @@ push @testn, @testn64 if $use64;
 push @testn, qw/9999986200004761 99999989237606677 999999866000004473/
       if $use64 && $extra;
 
+# For time savings, trim these if we're pure Perl.
+if (    !$extra
+     && !Math::Prime::Util::prime_get_config->{'xs'}
+     && !Math::Prime::Util::prime_get_config->{'gmp'} ) {
+  @testn = grep {    $_ != 10023859281455311421
+                  && $_ != 3369738766071892021
+                } @testn;
+}
+
 my %all_factors = (
 1234567890 => [1,2,3,5,6,9,10,15,18,30,45,90,3607,3803,7214,7606,10821,11409,18035,19015,21642,22818,32463,34227,36070,38030,54105,57045,64926,68454,108210,114090,162315,171135,324630,342270,13717421,27434842,41152263,68587105,82304526,123456789,137174210,205761315,246913578,411522630,617283945,1234567890],
 1032924637 => [1,6469,159673,1032924637],
diff --git a/t/81-bignum.t b/t/81-bignum.t
index 8301ca0..8fdd9c5 100644
--- a/t/81-bignum.t
+++ b/t/81-bignum.t
@@ -233,8 +233,8 @@ SKIP: {
 }
 
 ###############################################################################
-is( liouville(      48981631802481400359696467), -1, "liouville(a x b x c) = -1" );
-is( liouville(16091004845064967313564246070637),  1, "liouville(a x b x c x d) = 1" );
+is( liouville(  560812147176208202656339069), -1, "liouville(a x b x c) = -1" );
+is( liouville(10571644062695614514374497899),  1, "liouville(a x b x c x d) = 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