53 lines
1.6 KiB
Text
53 lines
1.6 KiB
Text
import "./fmt" for Conv, Fmt
|
|
import "./math" for Int, Nums
|
|
import "./seq" for Lst
|
|
|
|
class Classification {
|
|
construct new(seq, aliquot) {
|
|
_seq = seq
|
|
_aliquot = aliquot
|
|
}
|
|
seq { _seq}
|
|
aliquot { _aliquot }
|
|
}
|
|
|
|
var THRESHOLD = 2.pow(47)
|
|
|
|
var classifySequence = Fn.new { |k|
|
|
if (k <= 0) Fiber.abort("K must be positive")
|
|
var last = k
|
|
var seq = [k]
|
|
while (true) {
|
|
last = Nums.sum(Int.properDivisors(last))
|
|
seq.add(last)
|
|
var n = seq.count
|
|
var aliquot =
|
|
(last == 0) ? "Terminating" :
|
|
(n == 2 && last == k) ? "Perfect" :
|
|
(n == 3 && last == k) ? "Amicable" :
|
|
(n >= 4 && last == k) ? "Sociable[%(n-1)]" :
|
|
(last == seq[n-2]) ? "Aspiring" :
|
|
(n > 3 && seq[1..n-3].contains(last)) ? "Cyclic[%(n-1-Lst.indexOf(seq, last))]" :
|
|
(n == 16 || last > THRESHOLD) ? "Non-terminating" : ""
|
|
if (aliquot != "") return Classification.new(seq, aliquot)
|
|
}
|
|
}
|
|
|
|
System.print("Aliquot classifications - periods for Sociable/Cyclic in square brackets:\n")
|
|
for (k in 1..10) {
|
|
var c = classifySequence.call(k)
|
|
Fmt.print("$2d: $-15s $n", k, c.aliquot, c.seq)
|
|
}
|
|
|
|
System.print()
|
|
var a = [11, 12, 28, 496, 220, 1184, 12496, 1264460, 790, 909, 562, 1064, 1488]
|
|
for (k in a) {
|
|
var c = classifySequence.call(k)
|
|
Fmt.print("$7d: $-15s $n", k, c.aliquot, c.seq)
|
|
}
|
|
|
|
System.print()
|
|
var k = 15355717786080
|
|
var c = classifySequence.call(k)
|
|
var seq = c.seq.map { |i| Conv.dec(i) }.toList // ensure 15 digit integer is printed in full
|
|
Fmt.print("$d: $-15s $n", k, c.aliquot, seq)
|