partial_sums_of_sigma_function_times_k_to_the_m.sf 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121
  1. #!/usr/bin/ruby
  2. # Author: Daniel "Trizen" Șuteu
  3. # Date: 10 November 2018
  4. # https://github.com/trizen
  5. # A new generalized algorithm with O(sqrt(n)) complexity for computing the partial-sums of `k^m * sigma_j(k)`, for `1 <= k <= n`:
  6. #
  7. # Sum_{k=1..n} k^m * sigma_j(k)
  8. #
  9. # for any fixed m >= 0 and j >= 0.
  10. # Formula:
  11. # Sum_{k=1..n} k^m * sigma_j(k) = Sum_{k=1..floor(sqrt(n))} F(m, k) * (F(m+j, floor(n/k)) - F(m+j, floor(n/(k+1))))
  12. # + Sum_{k=1..floor(n/(floor(sqrt(n))+1))} k^(m+j) * F(m, floor(n/k))
  13. #
  14. # where F(n,x) is Faulhaber's formula for `Sum_{k=1..x} k^n`, defined in terms of Bernoulli polynomials as:
  15. #
  16. # F(n, x) = (Bernoulli(n+1, x+1) - Bernoulli(n+1, 0)) / (n+1)
  17. #
  18. # and Bernoulli(n,x) are the Bernoulli polynomials.
  19. # Example: `a(n) = Sum_{k=1..n} k * sigma(k)`
  20. # a(10^1) = 622
  21. # a(10^2) = 558275
  22. # a(10^3) = 549175530
  23. # a(10^4) = 548429473046
  24. # a(10^5) = 548320905633448
  25. # a(10^6) = 548312690631798482
  26. # a(10^7) = 548311465139943768941
  27. # a(10^8) = 548311366911386862908968
  28. # a(10^9) = 548311356554322895313137239
  29. # a(10^10) = 548311355740964925044531454428
  30. # Example: `a(n) = Sum_{k=1..n} k^2 * sigma(k)`
  31. # a(10^1) = 4948
  32. # a(10^2) = 42206495
  33. # a(10^3) = 412181273976
  34. # a(10^4) = 4113599787351824
  35. # a(10^5) = 41124390000844973548
  36. # a(10^6) = 411234935063990235195050
  37. # a(10^7) = 4112336345692801578349555781
  38. # a(10^8) = 41123352884070223300364205949432
  39. # a(10^9) = 411233517733637365707365200123054947
  40. # a(10^10) = 4112335168452793891288471658633554668746
  41. # For m>=0 and j>=1, we have the following asymptotic formula:
  42. # Sum_{k=1..n} k^m * sigma_j(k) ~ zeta(j+1)/(j+m+1) * n^(j+m+1)
  43. # See also:
  44. # https://en.wikipedia.org/wiki/Divisor_function
  45. # https://en.wikipedia.org/wiki/Faulhaber%27s_formula
  46. # https://en.wikipedia.org/wiki/Bernoulli_polynomials
  47. # https://trizenx.blogspot.com/2018/08/interesting-formulas-and-exercises-in.html
  48. func sigma_partial_sum(n, m, j) { # O(sqrt(n)) complexity
  49. var total = 0
  50. var s = n.isqrt
  51. var u = floor(n / (s + 1))
  52. for k in (1 .. s) {
  53. total += (faulhaber_sum(k, m) * (faulhaber_sum(floor(n/k), m+j) - faulhaber_sum(floor(n/(k+1)), m+j)))
  54. }
  55. for k in (1 .. u) {
  56. total += (k**(m+j) * faulhaber_sum(floor(n/k), m))
  57. }
  58. return total
  59. }
  60. func sigma_partial_sum_2(n, m, j) { # O(sqrt(n)) complexity
  61. var total = 0
  62. var s = n.isqrt
  63. for k in (1 .. s) {
  64. total += (k**m * faulhaber_sum(floor(n/k), m+j))
  65. total += (k**(m+j) * faulhaber_sum(floor(n/k), m))
  66. }
  67. total -= (faulhaber_sum(s, j+m) * faulhaber_sum(s, m))
  68. return total
  69. }
  70. func sigma_partial_sum_test(n, m, j) { # just for testing
  71. sum(1..n, {|k| k**m * k.sigma(j) })
  72. }
  73. for m in (0..10) {
  74. var j = 10.irand
  75. var n = 1000.irand
  76. var t1 = sigma_partial_sum(n, m, j)
  77. var t2 = sigma_partial_sum_2(n, m, j)
  78. var t3 = sigma_partial_sum_test(n, m, j)
  79. assert_eq(t1, t2)
  80. assert_eq(t2, t3)
  81. say "Sum_{k=1..#{n}} k^#{m} * σ_#{j}(k) = #{t2}"
  82. }
  83. __END__
  84. Sum_{k=1..287} k^0 * σ_0(k) = 1668
  85. Sum_{k=1..313} k^1 * σ_0(k) = 314735
  86. Sum_{k=1..937} k^2 * σ_1(k) = 317590484417
  87. Sum_{k=1..118} k^3 * σ_2(k) = 555145815555
  88. Sum_{k=1..864} k^4 * σ_9(k) = 9311353333331062226975636424340404096655
  89. Sum_{k=1..665} k^5 * σ_0(k) = 108405488260808685
  90. Sum_{k=1..223} k^6 * σ_8(k) = 11583460726000037999159192716695171
  91. Sum_{k=1..207} k^7 * σ_2(k) = 17737739640846775618667
  92. Sum_{k=1..441} k^8 * σ_10(k) = 9442961495785617738462953526256816073931562524503
  93. Sum_{k=1..946} k^9 * σ_10(k) = 16656797386770509233351415418444749963801156597772635567683
  94. Sum_{k=1..93} k^10 * σ_4(k) = 25155283344820203289248310767