sum_of_perfect_powers.pl 1.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344
  1. #!/usr/bin/perl
  2. # Efficient formula for computing the sum of perfect powers <= n.
  3. # Formula:
  4. # a(n) = faulhaber(n,1) - Sum_{1..floor(log_2(n))} mu(k) * (faulhaber(floor(n^(1/k)), k) - 1)
  5. # = 1 - Sum_{2..floor(log_2(n))} mu(k) * (faulhaber(floor(n^(1/k)), k) - 1)
  6. #
  7. # where:
  8. # faulhaber(n,k) = Sum_{j=1..n} j^k.
  9. # See also:
  10. # https://oeis.org/A069623
  11. use 5.036;
  12. use ntheory qw(moebius);
  13. use Math::AnyNum qw(faulhaber_sum sum ipow iroot ilog2);
  14. sub perfect_power_sum ($n) {
  15. 1 - sum(map { moebius($_) * (faulhaber_sum(iroot($n, $_), $_) - 1) } 2 .. ilog2($n));
  16. }
  17. foreach my $n (0 .. 15) {
  18. printf("a(10^%d) = %s\n", $n, perfect_power_sum(ipow(10, $n)));
  19. }
  20. __END__
  21. a(10^0) = 1
  22. a(10^1) = 22
  23. a(10^2) = 452
  24. a(10^3) = 13050
  25. a(10^4) = 410552
  26. a(10^5) = 11888199
  27. a(10^6) = 361590619
  28. a(10^7) = 11120063109
  29. a(10^8) = 345454923761
  30. a(10^9) = 10800726331772
  31. a(10^10) = 338846269199225
  32. a(10^11) = 10659098451968490
  33. a(10^12) = 335867724220740686
  34. a(10^13) = 10595345580446344714
  35. a(10^14) = 334502268562161605300
  36. a(10^15) = 10566065095217905939231