diff options
Diffstat (limited to 'challenge-169')
| -rw-r--r-- | challenge-169/laurent-rosenfeld/blog.txt | 1 | ||||
| -rw-r--r-- | challenge-169/laurent-rosenfeld/perl/ch-1.pl | 19 | ||||
| -rw-r--r-- | challenge-169/laurent-rosenfeld/perl/ch-2.pl | 88 | ||||
| -rw-r--r-- | challenge-169/laurent-rosenfeld/raku/ch-1.raku | 4 | ||||
| -rw-r--r-- | challenge-169/laurent-rosenfeld/raku/ch-2.raku | 25 |
5 files changed, 137 insertions, 0 deletions
diff --git a/challenge-169/laurent-rosenfeld/blog.txt b/challenge-169/laurent-rosenfeld/blog.txt new file mode 100644 index 0000000000..0d2f2f48df --- /dev/null +++ b/challenge-169/laurent-rosenfeld/blog.txt @@ -0,0 +1 @@ +http://blogs.perl.org/users/laurent_r/2022/06/perl-weekly-challenge-169-brillant-nummbers-and-achilles-numbers.html diff --git a/challenge-169/laurent-rosenfeld/perl/ch-1.pl b/challenge-169/laurent-rosenfeld/perl/ch-1.pl new file mode 100644 index 0000000000..33851060a7 --- /dev/null +++ b/challenge-169/laurent-rosenfeld/perl/ch-1.pl @@ -0,0 +1,19 @@ +use strict; +use warnings; +use feature "say"; + +my @small_primes = (2, 3, 5, 7, 11, 13, 17, 19, 23, 29); + +sub combine { + my @primes = @_; + my %part_result; + for my $i (0..$#primes) { + for my $j ($i..$#primes) { + $part_result{$primes[$i] * $primes[$j]} = 1; + } + } + return sort {$a <=> $b} keys %part_result; +} +my @result = combine @small_primes[0..3]; +push @result, combine @small_primes[4..9]; +say "@result[0..19]"; diff --git a/challenge-169/laurent-rosenfeld/perl/ch-2.pl b/challenge-169/laurent-rosenfeld/perl/ch-2.pl new file mode 100644 index 0000000000..dfe7d432ed --- /dev/null +++ b/challenge-169/laurent-rosenfeld/perl/ch-2.pl @@ -0,0 +1,88 @@ +#!/usr/bin/perl +use strict; +use warnings; +use feature qw/say/; +use Data::Dumper; +use constant MAX => 500; + +my @primes = (2, 3, 5, 7); + +# Greatest common divisor of two or more integers +sub gcd { + if (@_ > 2) { + return gcd( gcd($_[0], $_[1]), @_[2..$#_]); + } else { + my ($i, $j) = sort { $a <=> $b } @_; + while ($j) { + ($i, $j) = ($j, $i % $j); + } + return $i; + } +} + +# Creating a hash of prime factors (as keys) with their powers (as values) +sub prime_factors { + my $num = shift; + my $origin_num = $num; + my %factors; + for my $div (@primes) { + while ($num % $div == 0) { + $factors{$div}++; + $num /= $div; + } + return %factors if $num == 1; + } + $factors{$num}++ unless $num == $origin_num; + return %factors; +} + + +# Populating an array of primes up to MAX +my $current = 9; +while (1) { + my $prime = 1; + for my $i (@primes) { + my $i_sq = $i * $i; + last if $i_sq > $current; + $prime = 0, last if $current % $i == 0; + } + push @primes, $current if $prime;; + $current += 2; + last if $current > MAX; +} + +my $count = 0; +for my $n (1..MAX*MAX) { + my %factors = prime_factors $n; + my @powers = map $factors{$_}, keys %factors; + next if grep { $_ < 2} @powers; + next if scalar @powers < 2; + if (gcd(@powers) == 1) { + printf "%4d -> %s\n", $n, join " ", @powers; + $count++; + last if $count >= 20 + } + +This script displays the following output: + +$ perl ./Achilles_nums.pl + 72 -> 2 3 + 108 -> 2 3 + 200 -> 3 2 + 288 -> 5 2 + 392 -> 3 2 + 432 -> 3 4 + 500 -> 3 2 + 648 -> 4 3 + 675 -> 2 3 + 800 -> 2 5 + 864 -> 3 5 + 968 -> 3 2 + 972 -> 5 2 +1125 -> 2 3 +1152 -> 2 7 +1323 -> 2 3 +1352 -> 2 3 +1372 -> 2 3 +1568 -> 5 2 +1800 -> 2 2 3 diff --git a/challenge-169/laurent-rosenfeld/raku/ch-1.raku b/challenge-169/laurent-rosenfeld/raku/ch-1.raku new file mode 100644 index 0000000000..8836b199c0 --- /dev/null +++ b/challenge-169/laurent-rosenfeld/raku/ch-1.raku @@ -0,0 +1,4 @@ +my @small-primes = 2, 3, 5, 7, 11, 13, 17, 19, 23, 29; +my @result = (@small-primes[0..3] X* @small-primes[0..3]).sort.squish; +append @result, (@small-primes[4..9] X* @small-primes[4..9]).sort.squish; +say @result[0..19]; diff --git a/challenge-169/laurent-rosenfeld/raku/ch-2.raku b/challenge-169/laurent-rosenfeld/raku/ch-2.raku new file mode 100644 index 0000000000..6b6a4f1879 --- /dev/null +++ b/challenge-169/laurent-rosenfeld/raku/ch-2.raku @@ -0,0 +1,25 @@ +my @primes = (2..1000).grep({.is-prime}); + +sub prime-factors (UInt $num-in) { + my $factors = BagHash.new; + my $num = $num-in; + for @primes -> $div { + while ($num %% $div) { + $factors{$div}++; + $num div= $div; + } + return $factors if $num == 1; + } + $factors{$num}++ unless $num == $num-in; + return $factors; +} + +my $count = 0; +for 1..Inf -> $n { + my @powers = (prime-factors $n).values; + if @powers.none < 2 and @powers.elems > 1 and ([gcd] @powers) == 1 { + say $n.fmt("%4d"), " -> ", @powers; + $count++; + last if $count >= 20 + } +} |
