perl -e "map {print qq($_ ) unless $_ =~/(2|4|5|6|8|0)$/ } @ARGV" 2 3 5 7 11 13 17 19 23 29 37
3 7 11 13 17 19 23 29 37
####
perl -e "map {print qq($_ ) unless $_ =~/\d[245680]$/ } @ARGV" 2 3 5 7 11 13 17 19 23 29 37
2 3 5 7 11 13 17 19 23 29 37
##
##
use strict;
use warnings;
use Benchmark qw{ cmpthese };
my $skipper_regex = qr'\d[245680]$';
sub primes_original {
my $n = shift;
return if $n < 2;
my @primes = (2);
for my $i (3 .. $n) {
my $sqrt = sqrt $i;
my $notprime;
for my $p (@primes) {
last if $p > $sqrt;
$notprime = 1, last if 0 == $i % $p;
}
push @primes, $i unless $notprime;
}
return @primes
}
sub primes_skipper {
my $n = shift;
return if $n < 2;
my @primes = (2);
for my $i (3 .. $n) {
next if $i =~ $skipper_regex;
my $sqrt = sqrt $i;
my $notprime;
for my $p (@primes) {
last if $p > $sqrt;
$notprime = 1, last if 0 == $i % $p;
}
push @primes, $i unless $notprime;
}
return @primes
}
##
sub primes_opt_till_11 {
my $n = shift;
return if $n < 2;
my @primes = (2);
for my $i (3 .. $n) {
if($i > 2 || $i % 2 == 0){next}
if($i > 3 || $i % 3 == 0){next}
if($i > 5 || $i % 5 == 0){next}
if($i > 7 || $i % 7 == 0){next}
if($i > 11 || $i % 11 == 0){next}
my $sqrt = sqrt $i;
my $notprime;
for my $p (@primes) {
last if $p > $sqrt;
$notprime = 1, last if 0 == $i % $p;
}
push @primes, $i unless $notprime;
}
return @primes
}
##
use Test::More tests => 1;
is_deeply([primes_original(10000)], [primes_skipper(10000)], "same");
cmpthese(-10,
{
primes_original => 'primes_original (10000)',
primes_skipper => 'primes_skipper (10000)',
primes_opt_till_11 => 'primes_opt_till_11 (10000)',
});
##
##
1..1
ok 1 - same
Rate primes_skipper primes_original primes_opt_till_11
primes_skipper 33.5/s -- -35% -94%
primes_original 51.4/s 53% -- -90%
primes_opt_till_11 519/s 1448% 909% --