diff options
| -rwxr-xr-x | challenge-076/andinus/perl/ch-1.pl | 52 |
1 files changed, 52 insertions, 0 deletions
diff --git a/challenge-076/andinus/perl/ch-1.pl b/challenge-076/andinus/perl/ch-1.pl new file mode 100755 index 0000000000..c7660ff559 --- /dev/null +++ b/challenge-076/andinus/perl/ch-1.pl @@ -0,0 +1,52 @@ +#!/usr/bin/perl + +use strict; +use warnings; +use feature 'say'; + +my $input = shift @ARGV; +chomp $input; + +# Reject invalid inputs. +die "Invalid input, enter numbers greater than 1.\n" if $input <= 1; + +# If it's a prime number then the minimum sum is the number itself. +say $input and exit 0 if is_prime($input) == 1; + +if ($input % 2 == 0) { + # If $input is even then we loop from 2 to `$input / 2' & check if + # both $i & $diff are primes. If both are primes then we found our + # numbers! + + # Eventually we'll find 2 primes to be a sum of even numbers. From + # WikiPedia, https://en.wikipedia.org/wiki/Goldbach%27s_conjecture + # has been shown to hold for all integers less than `4 × 10^18'. + foreach my $i (2 ... $input / 2) { + my $diff = $input - $i; + say "$i + $diff" + if is_prime($i) and is_prime($diff); + } +} elsif (is_prime($input - 2)) { + # If $input is odd & `$input - 2' is a prime then $input is sum of + # two primes, 2 & `$input -2'. + say "2 + $input"; +} else { + # If even that doesn't match then the minimum sum will have three + # numbers. 3 & then we use the same function as for even numbers + # to find the other two primes. + foreach my $i (2 ... ($input - 3) / 2) { + my $diff = $input - 3 - $i; + say "3 + $i + $diff" + if is_prime($i) and is_prime($diff); + } +} + +sub is_prime { + my $num = shift @_; + # If $num is divisible by any number between 2 & sqrt($num) then + # it's not prime. Checking only till + foreach my $i (2 ... sqrt($num)) { + return 0 if $num % $i == 0; + } + return 1; +} |
