diff options
| author | Stephen Lynn <bizlsg@localhost.localdomain> | 2022-06-12 11:21:46 +0800 |
|---|---|---|
| committer | Stephen Lynn <bizlsg@localhost.localdomain> | 2022-06-12 11:21:46 +0800 |
| commit | 8a6b17c38547a2663b7a46e51dc8fc07c1201889 (patch) | |
| tree | 3a2bbf3ebf2c3a7ecbc74115f32dc2abba296019 /challenge-168 | |
| parent | bfba759aa6812adf1536870315cc6648b97163c5 (diff) | |
| download | perlweeklychallenge-club-8a6b17c38547a2663b7a46e51dc8fc07c1201889.tar.gz perlweeklychallenge-club-8a6b17c38547a2663b7a46e51dc8fc07c1201889.tar.bz2 perlweeklychallenge-club-8a6b17c38547a2663b7a46e51dc8fc07c1201889.zip | |
faster ch-2.pl & ch-2.p6 using external libs
Diffstat (limited to 'challenge-168')
| -rwxr-xr-x | challenge-168/steve-g-lynn/perl/ch-2.pl | 37 | ||||
| -rwxr-xr-x | challenge-168/steve-g-lynn/raku/ch-2.p6 | 40 |
2 files changed, 14 insertions, 63 deletions
diff --git a/challenge-168/steve-g-lynn/perl/ch-2.pl b/challenge-168/steve-g-lynn/perl/ch-2.pl index 5fe95544ad..379ffd9078 100755 --- a/challenge-168/steve-g-lynn/perl/ch-2.pl +++ b/challenge-168/steve-g-lynn/perl/ch-2.pl @@ -1,6 +1,11 @@ #!/usr/bin/perl -use Math::Prime::XS qw(is_prime); +#time (bash) output: +#real 0m0.026s +#user 0m0.019s +#sys 0m0.007s + +use Math::Prime::Util qw(is_prime factor); print &home_prime(10),"\n"; #773 @@ -14,37 +19,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..869bc8b3b5 100755 --- a/challenge-168/steve-g-lynn/raku/ch-2.p6 +++ b/challenge-168/steve-g-lynn/raku/ch-2.p6 @@ -1,11 +1,13 @@ #!/usr/bin/raku #time (bash command): -#real 0m0.511s -#user 0m0.622s -#sys 0m0.046s +#real 0m0.312s +#user 0m0.382s +#sys 0m0.054s +use Prime::Factor; + say homeprime(10); #773 say homeprime(16); @@ -15,37 +17,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); } |
