local int = require "int" local fmt = require "fmt" require "table2" $define THRESHOLD = 1 << 47 class classification function __construct(public seq, public aliquot) end end local function classify_sequence(k) assert(k > 0, "K must be positive") local last = k local seq = {k} while true do last = int.divisors(last, true):sum() seq:insert(last) local n = #seq local aliquot = "" if last == 0 then aliquot = "Terminating" elseif n == 2 and last == k then aliquot = "Perfect" elseif n == 3 and last == k then aliquot = "Amicable" elseif n >= 4 and last == k then aliquot = $"Sociable[{n - 1}]" elseif last == seq[n - 1] then aliquot = "Aspiring" elseif n > 3 and (last in seq:slice(2, n - 2)) then local ix = seq:findindex(|e| -> e == last) ?? -1 aliquot = $"Cyclic[{n - ix}]" elseif n == 16 or last > THRESHOLD then aliquot = "Non-terminating" end if aliquot != "" then return new classification(seq, aliquot) end end end print("Aliquot classifications - periods for Sociable/Cyclic in square brackets:\n") for k = 1, 10 do local c = classify_sequence(k) fmt.print("%2d: %-15s %,s", k, c.aliquot, c.seq) end print() local a = {11, 12, 28, 496, 220, 1184, 12496, 1264460, 790, 909, 562, 1064, 1488} for a as k do local c = classify_sequence(k) fmt.print("%7d: %-15s %,s", k, c.aliquot, c.seq) end print() local k = 15355717786080 local c = classify_sequence(k) fmt.print("%d: %-15s %,s", k, c.aliquot, c.seq)