RosettaCodeData/Task/Aliquot-sequence-classifications/Pluto/aliquot-sequence-classifications.pluto
2026-04-30 12:34:36 -04:00

56 lines
1.6 KiB
Text

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)