Aliquot sequence classifications
sub propdivsum (\x) {
my @l = x > 1;
(2 .. x.sqrt.floor).map: -> \d {
unless x % d { my \y = x div d; y == d ?? @l.push: d !! @l.append: d,y }
}
sum @l;
}
multi quality (0,1) { 'perfect ' }
multi quality (0,2) { 'amicable' }
multi quality (0,$n) { "sociable-$n" }
multi quality ($,1) { 'aspiring' }
multi quality ($,$n) { "cyclic-$n" }
sub aliquotidian ($x) {
my %seen;
my @seq = $x, &propdivsum ... *;
for 0..16 -> $to {
my $this = @seq[$to] or return "$x\tterminating\t[@seq[^$to]]";
last if $this > 140737488355328;
if %seen{$this}:exists {
my $from = %seen{$this};
return "$x\t&quality($from, $to-$from)\t[@seq[^$to]]";
}
%seen{$this} = $to;
}
"$x non-terminating\t[{@seq}]";
}
aliquotidian($_).say for flat
1..10,
11, 12, 28, 496, 220, 1184, 12496, 1264460,
790, 909, 562, 1064, 1488,
15355717786080;
Output:
1 terminating [1]
2 terminating [2 1]
3 terminating [3 1]
4 terminating [4 3 1]
5 terminating [5 1]
6 perfect [6]
7 terminating [7 1]
8 terminating [8 7 1]
9 terminating [9 4 3 1]
10 terminating [10 8 7 1]
11 terminating [11 1]
12 terminating [12 16 15 9 4 3 1]
28 perfect [28]
496 perfect [496]
220 amicable [220 284]
1184 amicable [1184 1210]
12496 sociable-5 [12496 14288 15472 14536 14264]
1264460 sociable-4 [1264460 1547860 1727636 1305184]
790 aspiring [790 650 652 496]
909 aspiring [909 417 143 25 6]
562 cyclic-2 [562 284 220]
1064 cyclic-2 [1064 1336 1184 1210]
1488 non-terminating [1488 2480 3472 4464 8432 9424 10416 21328 22320 55056 95728 96720 236592 459792 881392 882384 1474608 ...]
15355717786080 non-terminating [15355717786080 44534663601120 144940087464480 ...]
Last updated