694 Cube-full Divisors.sf 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. #!/usr/bin/ruby
  2. # Daniel "Trizen" Șuteu
  3. # Date: 10 February 2020
  4. # https://github.com/trizen
  5. # See also:
  6. # https://oeis.org/A036966
  7. # THE DISTRIBUTION OF CUBE-FULL NUMBERS, by P. SHIU (1990).
  8. # https://projecteuler.net/problem=694
  9. func powerful(n, k) { # k-powerful numbers <= n
  10. var list = []
  11. func (m,r) {
  12. if (r < k) {
  13. list << m
  14. return nil
  15. }
  16. for a in (1 .. iroot(idiv(n,m), r)) {
  17. if (r > k) {
  18. a.is_coprime(m) || next
  19. a.is_squarefree || next
  20. }
  21. __FUNC__(m * a**r, r-1)
  22. }
  23. }(1, 2*k - 1)
  24. list.sort
  25. }
  26. func sum_of_cubefull_divisors_count(n) {
  27. var t = 0
  28. var s = n.isqrt
  29. var sqrt_cubefull = powerful(s, 3)
  30. for k in (sqrt_cubefull) {
  31. t += idiv(n,k)
  32. }
  33. var cubefull = powerful(n, 3)
  34. for (var k = 1 ; k <= s; ++k) {
  35. var w = idiv(n,k)
  36. var i = cubefull.end.bsearch_le {|j|
  37. cubefull[j] <=> w
  38. }
  39. var r = idiv(n, cubefull[i])
  40. r = s if (r > s)
  41. t += ((1+i) * (r - k + 1))
  42. k = r
  43. }
  44. t -= s*sqrt_cubefull.len
  45. return t
  46. }
  47. for n in (1..18) {
  48. say ("S(10^#{n}) = ", sum_of_cubefull_divisors_count(10**n))
  49. }
  50. __END__
  51. S(10^1) = 11
  52. S(10^2) = 126
  53. S(10^3) = 1318
  54. S(10^4) = 13344
  55. S(10^5) = 133848
  56. S(10^6) = 1339485
  57. S(10^7) = 13397119
  58. S(10^8) = 133976753
  59. S(10^9) = 1339780424
  60. S(10^10) = 13397833208
  61. S(10^11) = 133978396859
  62. S(10^12) = 1339784112539
  63. S(10^13) = 13397841446161
  64. S(10^14) = 133978415161307
  65. S(10^15) = 1339784153146359
  66. S(10^16) = 13397841534812404
  67. S(10^17) = 133978415355411689