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 = 0
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) ? Int.properDivisors(i).skip(1) : [1, 1]
var pd = (i != 1) ? divisors.call(i) : [1, 1]
if (pd.count > 1 && Nums.prod(pd) == i) {
if (pd.count == 2 && pd[0] * pd[1] == i) {
count = count + 1
count = count + 1
if (i < 500) {
if (i < 500) {
var pds = pd.map { |d| Fmt.d(3, d) }.join(" x ")
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 $,7d: MPNs = $,7d Semi-primes = $,7d", limit, count, count2)
Fmt.print("Counts under $,9d: MPNs = $,7d Semi-primes = $,7d", limit, count, count2)
if (limit == 500000) return
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>