Skip to content

Commit 161a3c2

Browse files
committed
Challenge manwar#1 answer
1 parent 3c2e164 commit 161a3c2

File tree

1 file changed

+60
-0
lines changed
  • challenge-015/kian-meng-ang/perl5

1 file changed

+60
-0
lines changed
Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
#!/usr/bin/env perl
2+
# vi:et:sw=4 ts=4 ft=perl
3+
4+
use strict;
5+
use warnings;
6+
use utf8;
7+
use feature qw(say);
8+
9+
# Interestigly, both CPAN modules can be used interchangeably.
10+
# use Math::Prime::Util qw(nth_prime next_prime prev_prime);
11+
use ntheory qw(nth_prime next_prime prev_prime);
12+
13+
# See https://en.wikipedia.org/wiki/Strong_prime
14+
# See https://oeis.org/A051634
15+
# See https://oeis.org/A051635
16+
sub prime_type {
17+
my ($prime) = @_;
18+
19+
my $pprime = prev_prime($prime);
20+
my $nprime = next_prime($prime);
21+
22+
return 'strong' if ($prime > ($pprime + $nprime) / 2);
23+
return 'weak' if ($prime < ($pprime + $nprime) / 2);
24+
}
25+
26+
sub nth_strong_primes {
27+
my ($nth) = @_;
28+
29+
my ($pos, @primes) = (2, ());
30+
while (scalar @primes < $nth) {
31+
my $prime = nth_prime($pos);
32+
push @primes, $prime if (prime_type($prime) eq 'strong');
33+
$pos++;
34+
}
35+
36+
return \@primes;
37+
}
38+
39+
sub nth_weak_primes {
40+
my ($nth) = @_;
41+
42+
my ($pos, @primes) = (2, ());
43+
while (scalar @primes < $nth) {
44+
my $prime = nth_prime($pos);
45+
push @primes, $prime if (prime_type($prime) eq 'weak');
46+
$pos++;
47+
}
48+
49+
return \@primes;
50+
}
51+
52+
say 'Strong primes: ' , join ', ', @{nth_strong_primes(10)};
53+
say 'Weak primes: ', join ', ', @{nth_weak_primes(10)};
54+
55+
1;
56+
57+
__END__
58+
$ perl ch-1.pl
59+
Strong primes: 11, 17, 29, 37, 41, 59, 67, 71, 79, 97
60+
Weak primes: 3, 7, 13, 19, 23, 31, 43, 47, 61, 73

0 commit comments

Comments
 (0)