From 388f4e9469ea2003f2cd768f8618f1885320c1e8 Mon Sep 17 00:00:00 2001 From: Paulo Custodio Date: Fri, 22 Jan 2021 23:55:38 +0000 Subject: Replace Math::Prime::Util by explicit prime number generation --- challenge-008/paulo-custodio/perl/ch-1.pl | 28 ++++++++++++++++++++- challenge-012/paulo-custodio/perl/ch-1.pl | 27 +++++++++++++++++++- challenge-015/paulo-custodio/perl/ch-1.pl | 27 +++++++++++++++++++- challenge-076/paulo-custodio/perl/ch-1.pl | 41 +++++++++++++++++++++++++++++-- 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)) { -- cgit