aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMohammad S Anwar <Mohammad.Anwar@yahoo.com>2021-01-23 22:51:34 +0000
committerGitHub <noreply@github.com>2021-01-23 22:51:34 +0000
commita99d14e772a6d5a0269f9f64c27b047313373549 (patch)
tree81627415ebd1f0bdfa63169506e57f61ae3210e0
parent86bf193800e00dbaab11e23097b9acb2f8f096a9 (diff)
parent388f4e9469ea2003f2cd768f8618f1885320c1e8 (diff)
downloadperlweeklychallenge-club-a99d14e772a6d5a0269f9f64c27b047313373549.tar.gz
perlweeklychallenge-club-a99d14e772a6d5a0269f9f64c27b047313373549.tar.bz2
perlweeklychallenge-club-a99d14e772a6d5a0269f9f64c27b047313373549.zip
Merge pull request #3349 from pauloscustodio/remove_Math_Prime_Util
Replace Math::Prime::Util by explicit prime number generation
-rw-r--r--challenge-008/paulo-custodio/perl/ch-1.pl28
-rw-r--r--challenge-012/paulo-custodio/perl/ch-1.pl27
-rw-r--r--challenge-015/paulo-custodio/perl/ch-1.pl27
-rw-r--r--challenge-076/paulo-custodio/perl/ch-1.pl41
4 files changed, 118 insertions, 5 deletions
diff --git a/challenge-008/paulo-custodio/perl/ch-1.pl b/challenge-008/paulo-custodio/perl/ch-1.pl
index cde823ccf9..9fbbe09470 100644
--- a/challenge-008/paulo-custodio/perl/ch-1.pl
+++ b/challenge-008/paulo-custodio/perl/ch-1.pl
@@ -11,7 +11,32 @@
use strict;
use warnings;
use 5.030;
-use Math::Prime::Util 'next_prime', 'is_prime';
+
+# check if number is prime
+sub is_prime {
+ my($n) = @_;
+
+ return 0 if $n <= 1;
+ return 1 if $n <= 3;
+
+ return 0 if ($n % 2)==0 || ($n % 3)==0;
+
+ for (my $i = 5; $i*$i <= $n; $i += 6) {
+ return 0 if ($n % $i)==0 || ($n % ($i+2))==0;
+ }
+
+ return 1;
+}
+
+# next prime
+sub next_prime {
+ my($n) = @_;
+
+ return 2 if $n <= 1;
+ my $p = $n;
+ 1 while !is_prime(++$p);
+ return $p;
+}
# Euclid proved that 2^(pāˆ’1)*(2^p āˆ’ 1) is an even perfect number
# whenever 2p āˆ’ 1 is prime
@@ -27,6 +52,7 @@ sub perfect_iter {
}
+# main
my $n = shift || 5;
my $iter = perfect_iter();
for (1..$n) {
diff --git a/challenge-012/paulo-custodio/perl/ch-1.pl b/challenge-012/paulo-custodio/perl/ch-1.pl
index 0bd11f659d..411ed1e154 100644
--- a/challenge-012/paulo-custodio/perl/ch-1.pl
+++ b/challenge-012/paulo-custodio/perl/ch-1.pl
@@ -11,7 +11,32 @@
use strict;
use warnings;
use 5.030;
-use Math::Prime::Util 'next_prime', 'is_prime';
+
+# check if number is prime
+sub is_prime {
+ my($n) = @_;
+
+ return 0 if $n <= 1;
+ return 1 if $n <= 3;
+
+ return 0 if ($n % 2)==0 || ($n % 3)==0;
+
+ for (my $i = 5; $i*$i <= $n; $i += 6) {
+ return 0 if ($n % $i)==0 || ($n % ($i+2))==0;
+ }
+
+ return 1;
+}
+
+# next prime
+sub next_prime {
+ my($n) = @_;
+
+ return 2 if $n <= 1;
+ my $p = $n;
+ 1 while !is_prime(++$p);
+ return $p;
+}
sub euclid_iter {
my $prime = 1;
diff --git a/challenge-015/paulo-custodio/perl/ch-1.pl b/challenge-015/paulo-custodio/perl/ch-1.pl
index 655124d8bb..59e37ef0d0 100644
--- a/challenge-015/paulo-custodio/perl/ch-1.pl
+++ b/challenge-015/paulo-custodio/perl/ch-1.pl
@@ -19,7 +19,32 @@
use strict;
use warnings;
use 5.030;
-use Math::Prime::Util 'next_prime';
+
+# check if number is prime
+sub is_prime {
+ my($n) = @_;
+
+ return 0 if $n <= 1;
+ return 1 if $n <= 3;
+
+ return 0 if ($n % 2)==0 || ($n % 3)==0;
+
+ for (my $i = 5; $i*$i <= $n; $i += 6) {
+ return 0 if ($n % $i)==0 || ($n % ($i+2))==0;
+ }
+
+ return 1;
+}
+
+# next prime
+sub next_prime {
+ my($n) = @_;
+
+ return 2 if $n <= 1;
+ my $p = $n;
+ 1 while !is_prime(++$p);
+ return $p;
+}
sub prime_iter {
my($strong) = @_;
diff --git a/challenge-076/paulo-custodio/perl/ch-1.pl b/challenge-076/paulo-custodio/perl/ch-1.pl
index 99a25bb519..5619acd725 100644
--- a/challenge-076/paulo-custodio/perl/ch-1.pl
+++ b/challenge-076/paulo-custodio/perl/ch-1.pl
@@ -22,7 +22,6 @@ use warnings;
use 5.030;
use Math::Combinatorics;
use List::Util 'sum';
-use Math::Prime::Util 'primes';
my($N) = shift;
@@ -35,13 +34,51 @@ else {
}
+# check if number is prime
+sub is_prime {
+ my($n) = @_;
+
+ return 0 if $n <= 1;
+ return 1 if $n <= 3;
+
+ return 0 if ($n % 2)==0 || ($n % 3)==0;
+
+ for (my $i = 5; $i*$i <= $n; $i += 6) {
+ return 0 if ($n % $i)==0 || ($n % ($i+2))==0;
+ }
+
+ return 1;
+}
+
+# next prime
+sub next_prime {
+ my($n) = @_;
+
+ return 2 if $n <= 1;
+ my $p = $n;
+ 1 while !is_prime(++$p);
+ return $p;
+}
+
+# get all primes up to N
+sub primes {
+ my($n) = @_;
+ my $p = 2;
+ my @primes;
+ while ($p <= $n) {
+ push @primes, $p;
+ $p = next_prime($p);
+ }
+ return @primes;
+}
+
# check all combinations for the shortest that adds up to N
sub find_set {
my($n) = @_;
# get all primes up to N, 1 not included;
# append primes 2 and 3 to be able to solve special cases 4 and 6
- my @primes = (@{primes($n)}, 2, 3);
+ my @primes = (primes($n), 2, 3);
my @solution;
for my $k (1 .. scalar(@primes)) {