Aliquot sequence classifications: Difference between revisions

no edit summary
(add task to aarch64 assembly raspberry pi)
No edit summary
Line 5,338:
Aliquot seq of 1064 : Cyclic 1064, 1336, 1184, 1210, 1184
Aliquot seq of 1488 : non-terminating 1488, 2480, 3472, 4464, 8432, 9424, 10416, 21328, 22320, 55056, 95728, 96720, 236592, 459792, 881392, 882384
</pre>
 
=={{header|Vlang}}==
{{trans|Go}}
<lang vlang>import math
const threshold = u64(1) << 47
fn index_of(s []u64, search u64) int {
for i, e in s {
if e == search {
return i
}
}
return -1
}
fn contains(s []u64, search u64) bool {
return index_of(s, search) > -1
}
fn max_of(i1 int, i2 int) int {
if i1 > i2 {
return i1
}
return i2
}
fn sum_proper_divisors(n u64) u64 {
if n < 2 {
return 0
}
sqrt := u64(math.sqrt(f64(n)))
mut sum := u64(1)
for i := u64(2); i <= sqrt; i++ {
if n % i != 0 {
continue
}
sum += i + n / i
}
if sqrt * sqrt == n {
sum -= sqrt
}
return sum
}
fn classify_sequence(k u64) ([]u64, string) {
if k == 0 {
panic("Argument must be positive.")
}
mut last := k
mut seq := []u64{}
seq << k
for {
last = sum_proper_divisors(last)
seq << last
n := seq.len
mut aliquot := ""
match true {
last == 0 {
aliquot = "Terminating"
}
n == 2 && last == k {
aliquot = "Perfect"
}
n == 3 && last == k {
aliquot = "Amicable"
}
n >= 4 && last == k {
aliquot = "Sociable[${n-1}]"
}
last == seq[n - 2] {
aliquot = "Aspiring"
}
contains(seq[1 .. max_of(1, n - 2)], last) {
aliquot = "Cyclic[${n - 1 - index_of(seq, last)}]"
}
n == 16 || last > threshold {
aliquot = "Non-Terminating"
}
else {}
}
if aliquot != "" {
return seq, aliquot
}
}
return seq, ''
}
fn main() {
println("Aliquot classifications - periods for Sociable/Cyclic in square brackets:\n")
for k := u64(1); k <= 10; k++ {
seq, aliquot := classify_sequence(k)
println("${k:2}: ${aliquot:-15} $seq")
}
println('')
s := [
u64(11), 12, 28, 496, 220, 1184, 12496, 1264460, 790, 909, 562, 1064, 1488,
]
for k in s {
seq, aliquot := classify_sequence(k)
println("${k:7}: ${aliquot:-15} $seq")
}
println('')
k := u64(15355717786080)
seq, aliquot := classify_sequence(k)
println("$k: ${aliquot:-15} $seq")
}</lang>
 
{{out}}
<pre>
Aliquot classifications - periods for Sociable/Cyclic in square brackets:
 
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>
 
338

edits