[libmath-prime-util-perl] 19/50: Small speedups

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


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 3531db861259f3821bd4fd14a2a847d77e0e9517
Author: Dana Jacobsen <dana at acm.org>
Date:   Thu Oct 18 02:44:28 2012 -0600

    Small speedups
---
 bin/primes.pl | 27 ++++++++++++++++++++-------
 1 file changed, 20 insertions(+), 7 deletions(-)

diff --git a/bin/primes.pl b/bin/primes.pl
index 1e08c65..f44420d 100755
--- a/bin/primes.pl
+++ b/bin/primes.pl
@@ -159,7 +159,10 @@ sub ndig_palindromes {
 sub is_pillai {
   my $p = shift;
   return 0 if $p < 2;
-  # return 0 unless is_prime($p);
+  # Simpler but much slower:
+  #   foreach my $n (grep { ($p % $_) != 1 } (2 .. $p-1)) {
+  #     return 1 if Math::BigInt->new($n)->bfac()->bmod($p) == ($p-1);
+  #   }
   my $n_factorial_mod_p = Math::BigInt->bone();
   for my $n (2 .. $p-1) {
     $n_factorial_mod_p->bmul($n)->bmod($p);
@@ -169,7 +172,7 @@ sub is_pillai {
   0;
 }
 
-# Also slow.
+# Also pretty slow.
 sub is_good_prime {
   my $p = shift;
   return 0 if $p <= 2; # 2 isn't a good prime
@@ -273,16 +276,24 @@ sub gen_and_filter {
          @p;
   }
   if (exists $opts{'sophie'}) {
+    my %mod210;
+    undef @mod210{11,23,29,41,53,71,83,89,113,131,149,173,179,191,209};
     @p = grep { is_prime( 2*$_+1 ); }
-         grep { my $m30 = $_ % 30;
-                $_ <= 5 || $m30 == 11 || $m30 == 23 || $m30 == 29 ; }
+         grep { $_ <= 5 || exists $mod210{$_ % 210} }
          @p;
   }
   if (exists $opts{'cuban1'}) {
-    @p = grep { my $n = sqrt((4*$_-1)/3);  $n == int($n); } @p;
+    my %mod210;
+    undef @mod210{1,19,37,61,79,121,127,169,187};
+    @p = grep { my $n = sqrt((4*$_-1)/3); $n == int($n); }
+         #grep { ($_%3) == 1 }
+         grep { $_ <= 7 || exists $mod210{$_ % 210} }
+         @p;
   }
   if (exists $opts{'cuban2'}) {
-    @p = grep { my $n = sqrt(($_-1)/3);  $n == int($n); } @p;
+    @p = grep { my $n = sqrt(($_-1)/3);  $n == int($n); }
+         grep { ($_%3) == 1 }
+         @p;
   }
   if (exists $opts{'pnm1'}) {
     @p = grep { is_prime( primorial(Math::BigInt->new($_))-1 ) } @p;
@@ -301,7 +312,6 @@ sub gen_and_filter {
 
 if (exists $opts{'lucas'} ||
     exists $opts{'fibonacci'} ||
-    exists $opts{'palindromic'} ||
     exists $opts{'euclid'} ||
     exists $opts{'mersenne'}) {
   my @p = gen_and_filter($start, $end);
@@ -315,6 +325,9 @@ if (exists $opts{'lucas'} ||
     if (exists $opts{'pillai'}) {
       $segment_size = ($start < 10000) ? 100 : 1000;  # very small for Pillai
     }
+    if (exists $opts{'palindromic'}) {
+      $segment_size = 10**length($start) - $start - 1; # all n-digit numbers
+    }
 
     my $seg_start = $start;
     my $seg_end = $start + $segment_size;

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