Erdős–Woods numbers: Difference between revisions
Content added Content deleted
(→{{header|Wren}}: Added an embedded version using Wren-gmp.) |
(added Raku programming solution) |
||
Line 275: | Line 275: | ||
K += 1 |
K += 1 |
||
</lang>{{out}}Same as Wren example. |
</lang>{{out}}Same as Wren example. |
||
=={{header|Raku}}== |
|||
{{trans|Wren}} |
|||
{{trans|Julia}} |
|||
<lang perl6># 20220308 Raku programming solution |
|||
sub invmod($n, $modulo) { # rosettacode.org/wiki/Modular_inverse#Raku |
|||
my ($c, $d, $uc, $vc, $ud, $vd, $q) = ($n % $modulo, $modulo, 1, 0, 0, 1); |
|||
while $c != 0 { |
|||
($q, $c, $d) = ($d div $c, $d % $c, $c); |
|||
($uc, $vc, $ud, $vd) = ($ud - $q*$uc, $vd - $q*$vc, $uc, $vc); |
|||
} |
|||
return $ud % $modulo; |
|||
} |
|||
sub ew (\n) { |
|||
my @primes = (^n).race.grep: *.is-prime; |
|||
# rosettacode.org/wiki/Horner%27s_rule_for_polynomial_evaluation#Raku |
|||
my @divs = (^n).map: -> \p { ([o] map { p%%$_.Int + 2 * * }, @primes)(0) } |
|||
my @partitions = [ 0, 0, 2**@primes.elems - 1 ] , ; |
|||
sub ort(\x) { (@divs[x] +| @divs[n -x]).base(2).flip.index(1) } |
|||
for ((n^...1).sort: *.&ort).reverse { |
|||
my \newPartitions = @ = (); |
|||
my (\factors,\otherFactors) = @divs[$_, n-$_]; |
|||
for @partitions -> \p { |
|||
my (\setA, \setB, \rPrimes) = p[0..2]; |
|||
if (factors +& setA) or (otherFactors +& setB) { |
|||
newPartitions.push: p and next |
|||
} |
|||
for (factors +& rPrimes).base(2).flip.comb.kv -> \k,\v { |
|||
if (v == 1) { |
|||
my \w = 1 +< k; |
|||
newPartitions.push: [ setA +^ w, setB, rPrimes +^ w ] |
|||
} |
|||
} |
|||
for (otherFactors +& rPrimes).base(2).flip.comb.kv -> \k,\v { |
|||
if (v == 1) { |
|||
my \w = 1 +< k; |
|||
newPartitions.push: [ setA, setB +^ w, rPrimes +^ w ] |
|||
} |
|||
} |
|||
} |
|||
@partitions = newPartitions |
|||
} |
|||
my \result = $ = -1; |
|||
for @partitions -> \p { |
|||
my ($px,$py) = p[0,1]; |
|||
my ($x ,$y ) = 1 xx *; |
|||
for @primes -> $p { |
|||
$px % 2 and $x *= $p; |
|||
$py % 2 and $y *= $p; |
|||
($px,$py) >>div=>> 2 |
|||
} |
|||
my \newresult = ((n * invmod($x, $y)) % $y) * $x - n; |
|||
result = result == -1 ?? newresult !! min(result, newresult) |
|||
} |
|||
return result |
|||
} |
|||
say "The first 20 Erdős–Woods numbers and their minimum interval start values are:"; |
|||
for (16..116) { if (my $ew = ew $_) > 0 { printf "%3d -> %d\n",$_,$ew } }</lang> |
|||
{{out}}Same as Wren example. |
|||
=={{header|Wren}}== |
=={{header|Wren}}== |