aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMohammad S Anwar <Mohammad.Anwar@yahoo.com>2022-06-12 09:30:31 +0100
committerGitHub <noreply@github.com>2022-06-12 09:30:31 +0100
commit32841b4de5d3eec6ccf0a57f1e97ae94b0171d38 (patch)
tree9f26741e45ae51cc615a5fe4ed8b7fc935815ce1
parent7860753cd854ea07a29511477a5e4a3dca5a885e (diff)
parent8b3d4098625fe8fc4c962796812993aedf893441 (diff)
downloadperlweeklychallenge-club-32841b4de5d3eec6ccf0a57f1e97ae94b0171d38.tar.gz
perlweeklychallenge-club-32841b4de5d3eec6ccf0a57f1e97ae94b0171d38.tar.bz2
perlweeklychallenge-club-32841b4de5d3eec6ccf0a57f1e97ae94b0171d38.zip
Merge pull request #6241 from steve-g-lynn/new-branch
faster ch-2.pl & ch-2.p6 using external libs
-rwxr-xr-xchallenge-168/steve-g-lynn/julia/ch-2.jl43
-rwxr-xr-xchallenge-168/steve-g-lynn/perl/ch-2.pl45
-rwxr-xr-xchallenge-168/steve-g-lynn/raku/ch-2.p647
3 files changed, 71 insertions, 64 deletions
diff --git a/challenge-168/steve-g-lynn/julia/ch-2.jl b/challenge-168/steve-g-lynn/julia/ch-2.jl
index 19d4c7d498..0828857250 100755
--- a/challenge-168/steve-g-lynn/julia/ch-2.jl
+++ b/challenge-168/steve-g-lynn/julia/ch-2.jl
@@ -1,15 +1,56 @@
#! /usr/bin/julia
+#time (bash) output: with homeprime.([10,16,20,48,65,96])
+#real 0m41.340s
+#user 0m41.149s
+#sys 0m0.493s
+
+#-- without homeprime(96):
+#real 0m4.744s
+#user 0m4.745s
+#sys 0m0.467s
+
+#-- without .homeprime.([96,65])
+#real 0m1.072s
+#user 0m1.138s
+#sys 0m0.419s
+
+#-- without .homeprime.([96,65,48])
+#real 0m1.002s
+#user 0m1.095s
+#sys 0m0.384s
+
+
+
using Primes
function homeprime(n::Int64)
+ return homeprime(BigInt(n))
+end
+
+function homeprime(n::BigInt)
ncopy=n
while (!isprime(ncopy))
- ncopy=parse(Int64,join(factor(Vector,ncopy)))
+ ncopy=parse(BigInt,join(factor(Vector,ncopy)))
end
return ncopy
end
+println(homeprime(10))
+#773
+
println(homeprime(16))
#31636373
+println(homeprime(20))
+#3318308475676071413
+
+println(homeprime(48))
+#6161791591356884791277
+
+println(homeprime(65))
+#1381321118321175157763339900357651
+
+println(homeprime(96))
+#172929671097972226356946608292031596899264419
+
diff --git a/challenge-168/steve-g-lynn/perl/ch-2.pl b/challenge-168/steve-g-lynn/perl/ch-2.pl
index 5fe95544ad..0548ac1ebc 100755
--- a/challenge-168/steve-g-lynn/perl/ch-2.pl
+++ b/challenge-168/steve-g-lynn/perl/ch-2.pl
@@ -1,6 +1,19 @@
#!/usr/bin/perl
-use Math::Prime::XS qw(is_prime);
+#time (bash) output:
+#real 0m0.026s
+#user 0m0.019s
+#sys 0m0.007s
+
+# but this fast time degrades sharply with larger problems
+#
+# real is 0m45.199s if home_prime(48) also printed
+# real is 5m5.662s if home_prime of 48 and 65 also printed
+# real is 8m50.059s if home_prime of 48, 65 and 96 also printed
+#
+# probably some slowdown in factor(.) for factors of very large primes
+
+use Math::Prime::Util qw(is_prime factor);
print &home_prime(10),"\n";
#773
@@ -14,37 +27,9 @@ print &home_prime(20),"\n";
sub home_prime {
my ($n)=@_;
is_prime($n) && return $n;
- while (1){
- $n=&factors($n);
- (is_prime($n)) && last;
- }
- return $n;
+ return &home_prime(join('',sort{$a<=>$b}(factor($n))));
}
-sub factors {
- #--return concatenated prime factors of a number n
- my ($n)=@_;
- local $sqrt_n=floor(sqrt($n));
-
- my $retstring="";
-
- if (is_prime($n)){
- return $n;
- }
- else {
- for $prime (2 .. $sqrt_n){
- #-- no need to get primes first
- #-- routine automatically finds only prime factors
- while ( ($n % $prime) == 0){
- $n /= $prime;
- $retstring .= $prime;
- }
- (is_prime($n)) && last;
- }
- ($n > 1) && ($retstring .= $n);
- }
- return $retstring;
-}
1;
diff --git a/challenge-168/steve-g-lynn/raku/ch-2.p6 b/challenge-168/steve-g-lynn/raku/ch-2.p6
index f3a1259691..09cbc4412b 100755
--- a/challenge-168/steve-g-lynn/raku/ch-2.p6
+++ b/challenge-168/steve-g-lynn/raku/ch-2.p6
@@ -1,10 +1,19 @@
#!/usr/bin/raku
#time (bash command):
-#real 0m0.511s
-#user 0m0.622s
-#sys 0m0.046s
+#real 0m0.312s
+#user 0m0.382s
+#sys 0m0.054s
+#time if homeprime(48), homeprime(65) and homeprime(96) are also printed:
+#real 2m23.931s
+#user 2m23.527s
+#sys 0m0.071s
+#
+# ( real 11.512s with homeprime (10,16,20,48,65)
+# real 0.922s with homeprime (10,16,20,48) )
+
+use Prime::Factor;
say homeprime(10);
#773
@@ -15,37 +24,9 @@ say homeprime(20);
#-- sub for home prime
-sub homeprime(Int $n) returns Int {
+sub homeprime(Int $n where ($n > 1)) returns Int {
$n.Int.is-prime && return $n;
- return homeprime(factor($n));
-}
-
-#--sub for factorizing
-
-sub factor (Int $n where $n > 1) returns Int {
-#-- returns the concatenated prime factors as an int
- $n.Int.is-prime && (return $n.Int );
- my Int $sqrt_n = sqrt($n).Int;
-
- my @factors=();
-
- my Str $retstring="";
- my Int $ncopy=$n.Int;
-
- for (2 .. $sqrt_n) -> $prime {
- #-- no need to generate primes first.. the routine will
- #-- automatically only choose prime factors
- while ($ncopy %% $prime) {
- $ncopy div= $prime; #-- integer division
- @factors.append($prime);
- }
- $ncopy.is-prime && last;
- }
- ($ncopy > 1) && @factors.append($ncopy);
- #-- any factor bigger than sqrt(n) is a prime factor
- $retstring = @factors.list.join;
-
- return $retstring.Int;
+ return homeprime(([~] prime-factors($n)).Int);
}