56 lines
1.6 KiB
Text
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)
|