sum_of_sigma.pl 1.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. #!/usr/bin/perl
  2. # Daniel "Trizen" Șuteu
  3. # Date: 10 January 2018
  4. # https://github.com/trizen
  5. # Sum of the sigma(k) function, for 1 <= k <= n, where `sigma(k)` is `Sum_{d|k} d`.
  6. # See also:
  7. # https://oeis.org/A024916
  8. # https://oeis.org/A072692
  9. use 5.010;
  10. use strict;
  11. use warnings;
  12. use Math::AnyNum qw(faulhaber_sum isqrt);
  13. sub partial_sum_of_sigma { # O(sqrt(n)) complexity
  14. my ($n) = @_;
  15. my $s = isqrt($n);
  16. my $u = int($n / ($s + 1));
  17. my $sum = 0;
  18. my $prev = faulhaber_sum($n, 1); # n-th triangular number
  19. foreach my $k (1 .. $s) {
  20. my $curr = faulhaber_sum(int($n/($k+1)), 1);
  21. $sum += $k * ($prev - $curr);
  22. $prev = $curr;
  23. }
  24. foreach my $k (1 .. $u) {
  25. $sum += $k * int($n / $k);
  26. }
  27. return $sum;
  28. }
  29. foreach my $k (0 .. 10) {
  30. say "a(10^$k) = ", partial_sum_of_sigma(10**$k);
  31. }
  32. __END__
  33. a(10^0) = 1
  34. a(10^1) = 87
  35. a(10^2) = 8299
  36. a(10^3) = 823081
  37. a(10^4) = 82256014
  38. a(10^5) = 8224740835
  39. a(10^6) = 822468118437
  40. a(10^7) = 82246711794796
  41. a(10^8) = 8224670422194237
  42. a(10^9) = 822467034112360628