[libmath-prime-util-perl] 117/181: Speedup for palindromic primes

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


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

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

commit f60d0468b0ae4c7a34a61eb78fb4e9cd9bf490c9
Author: Dana Jacobsen <dana at acm.org>
Date:   Sun Jan 5 07:06:27 2014 -0800

    Speedup for palindromic primes
---
 bin/primes.pl             | 21 ++++++++-------------
 xt/test-primes-script2.pl |  4 +++-
 2 files changed, 11 insertions(+), 14 deletions(-)

diff --git a/bin/primes.pl b/bin/primes.pl
index f574a98..24e536e 100755
--- a/bin/primes.pl
+++ b/bin/primes.pl
@@ -350,21 +350,15 @@ sub lucky_primes {
 # This is not a general palindromic digit function!
 sub ndig_palindromes {
   my $digits = shift;
-  return (2,3,5,7,9) if $digits == 1;
+  return (2,3,5,7) if $digits == 1;
   return (11) if $digits == 2;
   return () if ($digits % 2) == 0;
 
-  my @prefixes = (1,3,7,9);
-  my $inner_digits = ($digits-1) / 2 - 1;
-  foreach my $d (1 .. $inner_digits) {
-    @prefixes = map { ($_.'0', $_.'1', $_.'2', $_.'3', $_.'4',
-                       $_.'5', $_.'6', $_.'7', $_.'8', $_.'9',); } @prefixes;
-  }
-  return map { my $r = reverse($_);
-               ($_.'0'.$r, $_.'1'.$r, $_.'2'.$r, $_.'3'.$r,
-                $_.'4'.$r, $_.'5'.$r, $_.'6'.$r, $_.'7'.$r,
-                $_.'8'.$r, $_.'9'.$r,);
-             } @prefixes;
+  my $rhdig = int(($digits - 1) / 2);
+  return grep { is_prime($_) }
+         map { $_ . reverse substr($_,0,$rhdig) }
+         map { $_ * int(10**$rhdig) .. ($_+1) * int(10**$rhdig) - 1 }
+         1, 3, 7, 9;
 }
 
 # See: http://en.wikipedia.org/wiki/Pillai_prime
@@ -433,6 +427,7 @@ sub gen_and_filter {
   my ($start, $end) = @_;
   my $gen;
   my $p = [];
+  $end-- if ($end % 2) == 0 && $end > 2;
 
   if (exists $opts{'lucas'}) {
     merge_primes(\$gen, $p, 'lucas', lucas_primes($start, $end));
@@ -461,7 +456,7 @@ sub gen_and_filter {
   if (exists $opts{'palindromic'}) {
     if (!defined $gen) {
       foreach my $d (length($start) .. length($end)) {
-        push @$p, grep { $_ >= $start && $_ <= $end && is_prime($_) }
+        push @$p, grep { $_ >= $start && $_ <= $end }
                   ndig_palindromes($d);
       }
       $gen = 'palindromic';
diff --git a/xt/test-primes-script2.pl b/xt/test-primes-script2.pl
index 483150b..1ab5572 100755
--- a/xt/test-primes-script2.pl
+++ b/xt/test-primes-script2.pl
@@ -7,6 +7,8 @@ use Time::HiRes qw(gettimeofday tv_interval);
 use bigint;
 use Math::NumSeq;
 $|++; #flush the output buffer after every write() or print() function
+my $use64;
+BEGIN { no bigint; $use64 = (~0 > 4294967295); }
 
 compare('Primes',
         10000000,
@@ -28,7 +30,7 @@ compare('Sophie Germain',
 #   2) it supports bignums, which is required for Fib, Euclid, Lucas, etc.
 
 compare('Palindromic',
-        (~0 > 4294967295)  ?  '10**11'  :  '10**10',
+        $use64   ?  '10**11'  :  '10**10',
         "$FindBin::Bin/../bin/primes.pl --palin 1 LASTNUM",
         q/perl -MMath::Prime::Util=is_prime -MMath::NumSeq::Palindromes -e 'my $seq = Math::NumSeq::Palindromes->new; while (1) { my $v = ($seq->next)[1]; last if $v > LASTNUM; print "$v\n" if is_prime($v); }'/);
 

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