P is for Practical PerlMonks

### Re^2: a close prime number

by Roy Johnson (Monsignor)
 on Feb 11, 2005 at 22:27 UTC ( #430325=note: print w/replies, xml ) Need Help??

in reply to Re: a close prime number
in thread a close prime number

I think yours is working a little harder than necessary. (Update: I didn't recognize the cache.) Also note that you ought to localize \$_ if you're going to use it where Perl isn't automatically localizing it.
```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 + \$_);
}
}

...
An alternative nearPrime sub:
```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;
}
}
And this isPrime does a little less work by checking only odd numbers:
```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;
}
}

Caution: Contents may have been coded under pressure.

Create A New User
Node Status?
node history
Node Type: note [id://430325]
help
Chatterbox?

How do I use this? | Other CB clients
Other Users?
Others avoiding work at the Monastery: (9)
As of 2017-07-25 15:55 GMT
Sections?
Information?
Find Nodes?
Leftovers?
Voting Booth?
I came, I saw, I ...

Results (374 votes). Check out past polls.