sum_of_the_sum_of_divisors.pl 664 B

123456789101112131415161718192021222324252627282930313233
  1. #!/usr/bin/perl
  2. # Daniel "Trizen" Șuteu
  3. # Date: 19 August 2017
  4. # https://github.com/trizen
  5. # Sum of the sum of divisors, `sigma(k)`, for 1 <= k <= n.
  6. # Algorithm due to Peter Polm (August 18, 2014) (see: A024916).
  7. use 5.010;
  8. use strict;
  9. use warnings;
  10. sub sum_of_sigma {
  11. my ($n) = @_;
  12. my $s = 0;
  13. my $d = 1;
  14. my $q = $n;
  15. for (; $d < $q ; ++$d, $q = int($n / $d)) {
  16. $s += $q * (2 * $d + $q + 1) >> 1;
  17. }
  18. $s - $d * ($d * ($d - 1) >> 1) + ($q * ($q + 1) >> 1);
  19. }
  20. say sum_of_sigma(13); #=> 141
  21. say sum_of_sigma(64); #=> 3403
  22. say sum_of_sigma(1234); #=> 1252881
  23. say sum_of_sigma(10**8); #=> 8224670422194237