Aliquot sequence classifications: Difference between revisions
Content added Content deleted
(Add Swift) |
|||
Line 3,158: | Line 3,158: | ||
1488 non-term [1488 2480 3472 4464 8432 9424 10416 21328 22320 55056 95728 96720 236592 459792 881392 882384 1474608] |
1488 non-term [1488 2480 3472 4464 8432 9424 10416 21328 22320 55056 95728 96720 236592 459792 881392 882384 1474608] |
||
15355717786080 non-term [15355717786080 44534663601120]</pre> |
15355717786080 non-term [15355717786080 44534663601120]</pre> |
||
=={{header|Swift}}== |
|||
<lang swift>extension BinaryInteger { |
|||
@inlinable |
|||
public func factors(sorted: Bool = true) -> [Self] { |
|||
let maxN = Self(Double(self).squareRoot()) |
|||
var res = Set<Self>() |
|||
for factor in stride(from: 1, through: maxN, by: 1) where self % factor == 0 { |
|||
res.insert(factor) |
|||
res.insert(self / factor) |
|||
} |
|||
return sorted ? res.sorted() : Array(res) |
|||
} |
|||
} |
|||
struct SeqClass: CustomStringConvertible { |
|||
var seq: [Int] |
|||
var desc: String |
|||
var description: String { |
|||
return "\(desc): \(seq)" |
|||
} |
|||
} |
|||
func classifySequence(k: Int, threshold: Int = 1 << 47) -> SeqClass { |
|||
var last = k |
|||
var seq = [k] |
|||
while true { |
|||
last = last.factors().dropLast().reduce(0, +) |
|||
seq.append(last) |
|||
let n = seq.count |
|||
if last == 0 { |
|||
return SeqClass(seq: seq, desc: "Terminating") |
|||
} else if n == 2 && last == k { |
|||
return SeqClass(seq: seq, desc: "Perfect") |
|||
} else if n == 3 && last == k { |
|||
return SeqClass(seq: seq, desc: "Amicable") |
|||
} else if n >= 4 && last == k { |
|||
return SeqClass(seq: seq, desc: "Sociable[\(n - 1)]") |
|||
} else if last == seq[n - 2] { |
|||
return SeqClass(seq: seq, desc: "Aspiring") |
|||
} else if seq.dropFirst().dropLast(2).contains(last) { |
|||
return SeqClass(seq: seq, desc: "Cyclic[\(n - 1 - seq.firstIndex(of: last)!)]") |
|||
} else if n == 16 || last > threshold { |
|||
return SeqClass(seq: seq, desc: "Non-terminating") |
|||
} |
|||
} |
|||
fatalError() |
|||
} |
|||
for i in 1...10 { |
|||
print("\(i): \(classifySequence(k: i))") |
|||
} |
|||
print() |
|||
for i in [11, 12, 28, 496, 220, 1184, 12496, 1264460, 790, 909, 562, 1064, 1488] { |
|||
print("\(i): \(classifySequence(k: i))") |
|||
} |
|||
print() |
|||
print("\(15355717786080): \(classifySequence(k: 15355717786080))")</lang> |
|||
{{out}} |
|||
<pre>1: Terminating: [1, 0] |
|||
2: Terminating: [2, 1, 0] |
|||
3: Terminating: [3, 1, 0] |
|||
4: Terminating: [4, 3, 1, 0] |
|||
5: Terminating: [5, 1, 0] |
|||
6: Perfect: [6, 6] |
|||
7: Terminating: [7, 1, 0] |
|||
8: Terminating: [8, 7, 1, 0] |
|||
9: Terminating: [9, 4, 3, 1, 0] |
|||
10: Terminating: [10, 8, 7, 1, 0] |
|||
11: Terminating: [11, 1, 0] |
|||
12: Terminating: [12, 16, 15, 9, 4, 3, 1, 0] |
|||
28: Perfect: [28, 28] |
|||
496: Perfect: [496, 496] |
|||
220: Amicable: [220, 284, 220] |
|||
1184: Amicable: [1184, 1210, 1184] |
|||
12496: Sociable[5]: [12496, 14288, 15472, 14536, 14264, 12496] |
|||
1264460: Sociable[4]: [1264460, 1547860, 1727636, 1305184, 1264460] |
|||
790: Aspiring: [790, 650, 652, 496, 496] |
|||
909: Aspiring: [909, 417, 143, 25, 6, 6] |
|||
562: Cyclic[2]: [562, 284, 220, 284] |
|||
1064: Cyclic[2]: [1064, 1336, 1184, 1210, 1184] |
|||
1488: Non-terminating: [1488, 2480, 3472, 4464, 8432, 9424, 10416, 21328, 22320, 55056, 95728, 96720, 236592, 459792, 881392, 882384] |
|||
15355717786080: Non-terminating: [15355717786080, 44534663601120, 144940087464480]</pre> |
|||
=={{header|Tcl}}== |
=={{header|Tcl}}== |