http://www.perlmonks.org?node_id=430327


in reply to a close prime number

Anonymous Monk,
Ok - this is an adaptation of Challenge: Nearest Palindromic Number. Since the mathematical lesson has already been explained, I decided to spruce up the Perl so that there might be a lesson in it.
#!/usr/bin/perl use strict; use warnings; my $nearest_prime = nearest(); for ( map { int( rand 9998 ) + 2 } 1 .. 50 ) { print "$_ : ", $nearest_prime->( $_ ), "\n"; } sub nearest { my $prime = is_prime(); return sub { my $n = shift; return $n if $prime->( $n ); my $pos = $n; ++$pos while ! $prime->( $pos ); $pos = $pos - $n; my $neg = $n; --$neg while ! $prime->( $neg ); $neg = $n - $neg; return $pos > $neg ? $n - $neg : $n + $pos; } } sub is_prime { my %prime = map { $_ => 1 } (2, 3, 5, 7); my %not_prime; return sub { my $n = shift; return 1 if $prime{ $n }; return 0 if $n % 2 == 0 || exists $not_prime{ $n }; for ( 3 .. sqrt $n ) { return $not_prime{ $n } = 0 if $n % $_ == 0; } return $prime{ $n } = 1; }; }
I will leave converting the code from the nearest prime to the nearest N primes as an exercise for the reader.

Cheers - L~R