prog.sf 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. #!/usr/bin/ruby
  2. # Sum of remainders of the n-th composite mod k, for k=1,2,3,...,n.
  3. # https://oeis.org/A162733
  4. # Formula:
  5. # a(n) = n*c - A024916(c) + Sum_{k=n+1..c} k*floor(c/k), where c = composite(n).
  6. # Some larg terms:
  7. # a(10^1) = 19
  8. # a(10^2) = 2570
  9. # a(10^3) = 234629
  10. # a(10^4) = 22023392
  11. # a(10^5) = 2112214237
  12. # a(10^6) = 205264832182
  13. # a(10^7) = 20107236745459
  14. # a(10^8) = 1979660200134864
  15. # a(10^9) = 195581116031179224
  16. # a(10^10) = 19369336214284240180
  17. # a(10^11) = 1921625789486572491456
  18. # a(10^12) = 190896352406437965763817
  19. # a(10^13) = 18983166656994117309394645
  20. func T(n) { # Sum_{k=1..n} k = n-th triangular number
  21. n.faulhaber(1)
  22. }
  23. func S(n) { # Sum_{k=1..n} sigma(k) = Sum_{k=1..n} k*floor(n/k)
  24. #var s = n.isqrt
  25. #sum(1..s, {|k| T(idiv(n,k)) + k*idiv(n,k) }) - T(s)*s
  26. n.dirichlet_sum({1}, {_}, {_}, {.faulhaber(1)})
  27. }
  28. func g(a,b) {
  29. var total = 0
  30. while (a <= b) {
  31. var t = idiv(b, a)
  32. var u = idiv(b, t)
  33. total += t*(T(u) - T(a-1))
  34. a = u+1
  35. }
  36. return total
  37. }
  38. func a(n) { # sub-linear formula
  39. var c = n.composite
  40. n*c - S(c) + g(n+1, c)
  41. }
  42. func a_linear(n) { # just for testing
  43. var c = n.composite
  44. sum(1..n, {|k| c % k })
  45. }
  46. assert_eq(a.map(1..100), a_linear.map(1..100))
  47. say a.map(1..58) #=> [0, 0, 2, 2, 3, 2, 10, 15, 15, 19, 25, 34, 41, 40, 58, 67, 80, 79, 83, 101, 118, 131, 152, 132, 170, 191, 180, 193, 223, 234, 253, 254, 294, 300, 329, 334, 356, 393, 384, 417, 442, 433, 501, 522, 522, 567, 554, 609, 650, 645, 642, 725, 750, 761, 818, 805, 833, 873]
  48. for k in (1..9) {
  49. say "a(10^#{k}) = #{a(10**k)}"
  50. }