亲和数

作者:Gerhard R

https://projecteuler.net/problem=21

令 d(n) 表示 n 的所有真因数(小于 n 且能整除 n 的数)的和。如果 d(a) = b 且 d(b) = a,其中 a ≠ b,则 a 和 b 称为一对亲和数,a 和 b 都称为亲和数。

例如,220 的真因数是 1、2、4、5、10、11、20、22、44、55 和 110;因此 d(220) = 284。284 的真因数是 1、2、4、71 和 142;所以 d(284) = 220。

求 10000 以下所有亲和数的和。

源代码: prob021-gerdr.pl

use v6;

sub d(Int $n) {
    my $sum = 1;
    my $sqrt-n = sqrt $n;

    for 2..Int($sqrt-n) -> $a {
        my $b = $n div $a;
        $sum += $a + $b if $a * $b == $n;
    }

    $sqrt-n ~~ Int ?? $sum - $sqrt-n !! $sum;
}

my $sum = 0;

for 1..100_000 -> $a {
    my $b = d($a);
    $sum += $a + $b if $a < $b and d($b) == $a;
}

say $sum;