in reply to Re: a close prime number
in thread a close prime number
An alternative nearPrime sub:for (10,15,20831323,99,100) { print "$_: ", nearPrime($_), "\n"; } sub nearPrime { my $num = shift; local $_ = 0; # otherwise tries to modify for loop var above return $num if isPrime($num); while (1) { $_++; return ($num - $_) if isPrime($num - $_); return ($num + $_) if isPrime($num + $_); } } ...
And this isPrime does a little less work by checking only odd numbers:sub nearPrime { my $num = shift; my $sign = 1; return $num if isPrime($num); for (0..$num) { $num += $sign * $_; return $num if isPrime($num); $sign = -$sign; } }
BEGIN { my @primes = (2, 3); my $max = 3; sub isPrime { my $num = shift; my $root = int sqrt $num; while ($max <= $root) { $max += 2; push(@primes, $max) if isPrime($max); } for (@primes) { last if $_ > $root; return 0 if ($num % $_ == 0); } return 1; } }
|
---|