Perfect numbers: Difference between revisions
Content added Content deleted
Thundergnat (talk | contribs) (Rename Perl 6 -> Raku, alphabetize, minor clean-up) |
(Added Wren) |
||
Line 3,206: | Line 3,206: | ||
C:\> |
C:\> |
||
</pre> |
|||
=={{header|Wren}}== |
|||
===Version 1=== |
|||
{{trans|D}} |
|||
Restricted to the first four perfect numbers as the fifth one is very slow to emerge. |
|||
<lang ecmascript>var isPerfect = Fn.new { |n| |
|||
if (n <= 2) return false |
|||
var tot = 1 |
|||
for (i in 2..n.sqrt.floor) { |
|||
if (n%i == 0) { |
|||
tot = tot + i |
|||
var q = (n/i).floor |
|||
if (q > i) tot = tot + q |
|||
} |
|||
} |
|||
return n == tot |
|||
} |
|||
System.print("The first four perfect numbers are:") |
|||
var count = 0 |
|||
var i = 2 |
|||
while (count < 4) { |
|||
if (isPerfect.call(i)) { |
|||
System.write("%(i) ") |
|||
count = count + 1 |
|||
} |
|||
i = i + 2 // there are no known odd perfect numbers |
|||
} |
|||
System.print()</lang> |
|||
{{out}} |
|||
<pre> |
|||
6 28 496 8128 |
|||
</pre> |
|||
===Version 2=== |
|||
This makes use of the fact that all known perfect numbers are of the form <big> (2<sup>''n''</sup> - 1) × 2<sup>''n'' - 1</sup></big> where <big> (2<sup>''n''</sup> - 1)</big> is prime and finds the first seven perfect numbers instantly. The numbers are too big after that to be represented accurately by Wren. |
|||
<lang ecmascript>var isPrime = Fn.new { |n| |
|||
if (n < 2 || !n.isInteger) return false |
|||
if (n%2 == 0) return n == 2 |
|||
if (n%3 == 0) return n == 3 |
|||
var d = 5 |
|||
while (d*d <= n) { |
|||
if (n%d == 0) return false |
|||
d = d + 2 |
|||
if (n%d == 0) return false |
|||
d = d + 4 |
|||
} |
|||
return true |
|||
} |
|||
var isPerfect = Fn.new { |n| |
|||
if (n <= 2) return false |
|||
var tot = 1 |
|||
for (i in 2..n.sqrt.floor) { |
|||
if (n%i == 0) { |
|||
tot = tot + i |
|||
var q = (n/i).floor |
|||
if (q > i) tot = tot + q |
|||
} |
|||
} |
|||
return n == tot |
|||
} |
|||
System.print("The first seven perfect numbers are:") |
|||
var count = 0 |
|||
var p = 2 |
|||
while (count < 7) { |
|||
var n = 2.pow(p) - 1 |
|||
if (isPrime.call(n)) { |
|||
n = n * 2.pow(p-1) |
|||
if (isPerfect.call(n)) { |
|||
System.write("%(n) ") |
|||
count = count + 1 |
|||
} |
|||
} |
|||
p = p + 1 |
|||
} |
|||
System.print()</lang> |
|||
{{out}} |
|||
<pre> |
|||
6 28 496 8128 33550336 8589869056 137438691328 |
|||
</pre> |
</pre> |
||