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)', });