count_of_perfect_powers.sf 800 B

12345678910111213141516171819202122232425262728293031323334353637383940
  1. #!/usr/bin/ruby
  2. # Efficient formula for counting the numbers of perfect powers <= n.
  3. # Formula:
  4. # a(n) = n - Sum_{1..floor(log_2(n))} mu(k) * (floor(n^(1/k)) - 1)
  5. # = 1 - Sum_{2..floor(log_2(n))} mu(k) * (floor(n^(1/k)) - 1)
  6. # See also:
  7. # https://oeis.org/A069623
  8. func perfect_power_count(n) {
  9. 1 - sum(2..n.ilog(2), {|k|
  10. mu(k) * (n.iroot(k) - 1)
  11. })
  12. }
  13. for n in (0..15) {
  14. printf("a(10^%d) = %s\n", n, perfect_power_count(10**n))
  15. assert_eq(perfect_power_count(10**n), 10**n -> perfect_power_count)
  16. }
  17. __END__
  18. a(10^0) = 1
  19. a(10^1) = 4
  20. a(10^2) = 13
  21. a(10^3) = 41
  22. a(10^4) = 125
  23. a(10^5) = 367
  24. a(10^6) = 1111
  25. a(10^7) = 3395
  26. a(10^8) = 10491
  27. a(10^9) = 32670
  28. a(10^10) = 102231
  29. a(10^11) = 320990
  30. a(10^12) = 1010196
  31. a(10^13) = 3184138
  32. a(10^14) = 10046921
  33. a(10^15) = 31723592