diff options
| author | Mohammad S Anwar <Mohammad.Anwar@yahoo.com> | 2022-06-12 09:30:31 +0100 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2022-06-12 09:30:31 +0100 |
| commit | 32841b4de5d3eec6ccf0a57f1e97ae94b0171d38 (patch) | |
| tree | 9f26741e45ae51cc615a5fe4ed8b7fc935815ce1 | |
| parent | 7860753cd854ea07a29511477a5e4a3dca5a885e (diff) | |
| parent | 8b3d4098625fe8fc4c962796812993aedf893441 (diff) | |
| download | perlweeklychallenge-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-x | challenge-168/steve-g-lynn/julia/ch-2.jl | 43 | ||||
| -rwxr-xr-x | challenge-168/steve-g-lynn/perl/ch-2.pl | 45 | ||||
| -rwxr-xr-x | challenge-168/steve-g-lynn/raku/ch-2.p6 | 47 |
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); } |
