Multiplicatively perfect numbers: Difference between revisions
Content added Content deleted
m (→{{header|Phix}}: extended limit to match Raku) |
(→{{header|Wren}}: Optimized to enable 5 million to be reached in a reasonable time.) |
||
Line 800: | Line 800: | ||
{{libheader|Wren-math}} |
{{libheader|Wren-math}} |
||
{{libheader|Wren-fmt}} |
{{libheader|Wren-fmt}} |
||
This includes '1' as an MPN. |
This includes '1' as an MPN. Not very quick at around 112 seconds but reasonable for Wren. |
||
<syntaxhighlight lang="ecmascript">import "./math" for Int, Nums |
<syntaxhighlight lang="ecmascript">import "./math" for Int, Nums |
||
import "./fmt" for Fmt |
import "./fmt" for Fmt |
||
// library method customized for this task |
|||
var divisors = Fn.new { |n| |
|||
var divisors = [] |
|||
var i = 1 |
|||
var k = (n%2 == 0) ? 1 : 2 |
|||
while (i <= n.sqrt) { |
|||
if (i > 1 && n%i == 0) { // exclude 1 and n |
|||
divisors.add(i) |
|||
if (divisors.count > 2) break // not eligible if has > 2 divisors |
|||
var j = (n/i).floor |
|||
if (j != i) divisors.add(j) |
|||
} |
|||
i = i + k |
|||
} |
|||
return divisors |
|||
} |
|||
var limit = 500 |
var limit = 500 |
||
var count = 0 |
var count = 0 |
||
var i = |
var i = 1 |
||
System.print("Multiplicatively perfect numbers under %(limit):") |
System.print("Multiplicatively perfect numbers under %(limit):") |
||
while (true) { |
while (true) { |
||
var pd = (i != 1) ? |
var pd = (i != 1) ? divisors.call(i) : [1, 1] |
||
if (pd.count |
if (pd.count == 2 && pd[0] * pd[1] == i) { |
||
count = count + 1 |
count = count + 1 |
||
if (i < 500) { |
if (i < 500) { |
||
var pds = |
var pds = Fmt.swrite("$3d x $3d", pd[0], pd[1]) |
||
Fmt.write("$3d = $s ", i, pds) |
Fmt.write("$3d = $s ", i, pds) |
||
if (count % 5 == 0) System.print() |
if (count % 5 == 0) System.print() |
||
Line 823: | Line 840: | ||
var cubes = Int.primeCount((limit - 1).cbrt.floor) |
var cubes = Int.primeCount((limit - 1).cbrt.floor) |
||
var count2 = count + squares - cubes - 1 |
var count2 = count + squares - cubes - 1 |
||
Fmt.print("Counts under $, |
Fmt.print("Counts under $,9d: MPNs = $,7d Semi-primes = $,7d", limit, count, count2) |
||
if (limit == |
if (limit == 5000000) return |
||
limit = limit * 10 |
limit = limit * 10 |
||
} |
} |
||
Line 864: | Line 881: | ||
482 = 2 x 241 485 = 5 x 97 489 = 3 x 163 493 = 17 x 29 497 = 7 x 71 |
482 = 2 x 241 485 = 5 x 97 489 = 3 x 163 493 = 17 x 29 497 = 7 x 71 |
||
Counts under 500: MPNs = 150 Semi-primes = 153 |
Counts under 500: MPNs = 150 Semi-primes = 153 |
||
Counts under 5,000: MPNs = 1,354 Semi-primes = 1,365 |
Counts under 5,000: MPNs = 1,354 Semi-primes = 1,365 |
||
Counts under 50,000: MPNs = 12,074 Semi-primes = 12,110 |
Counts under 50,000: MPNs = 12,074 Semi-primes = 12,110 |
||
Counts under 500,000: MPNs = 108,223 Semi-primes = 108,326 |
Counts under 500,000: MPNs = 108,223 Semi-primes = 108,326 |
||
Counts under 5,000,000: MPNs = 978,983 Semi-primes = 979,274 |
|||
</pre> |
</pre> |
||