[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