File: project_euler_357.pl

package info (click to toggle)
libmath-prime-util-perl 0.46-1
  • links: PTS, VCS
  • area: main
  • in suites: jessie, jessie-kfreebsd
  • size: 2,044 kB
  • ctags: 1,933
  • sloc: perl: 19,450; ansic: 6,379; python: 24; makefile: 11
file content (38 lines) | stat: -rw-r--r-- 1,115 bytes parent folder | download | duplicates (4)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#!/usr/bin/env perl
use warnings;
use strict;
use Math::Prime::Util qw/:all/;
use List::MoreUtils qw/all/;

my $maxn = shift || 100_000_000;

prime_precalc($maxn);    # Speeds up is_prime, but not necessary
my($sum, $n) = (1, 0);
forprimes {
  $n = 2*$_ - 4;                 # 2+$n/2 is prime
  if (is_prime($n+1)) {          # 1+$n/1 is prime
    if (moebius($n) != 0) {      # n should be square free
      $sum += $n if all { is_prime($_+$n/$_) } divisors($n);
    }
  }
} int($maxn/2);
print "$sum\n";


# This version is a little more direct.
#  my($sum, $n) = (0, 0);
#  forprimes {
#    $n = $_-1;                     # 1+$n/1 is prime  (hence n=1 or even)
#    if (is_prime(2+($n>>1))) {     # 2+$n/2 is prime  (noting n is even or 1)
#      if (moebius($n) != 0) {      # n should be square free
#        $sum += $n if all { is_prime($_+$n/$_) } divisors($n);
#      }
#    }
#  } $maxn;
#  print "$sum\n";


# We could additionally check these:
#   if ( (($n+2) % 4) == 0 || $n == 1) {
# Using all is more efficient, but this works:
#   $sum += $n unless scalar grep { !is_prime($_+$n/$_) } divisors($n);