Aliquot sequence classifications: Difference between revisions

Add Swift
(Add Swift)
Line 3,158:
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>
 
=={{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}}==