prog.sf 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199
  1. #!/usr/bin/ruby
  2. # Daniel "Trizen" Șuteu
  3. # Date: 08 March 2019
  4. # https://github.com/trizen
  5. # Partial sums of the inverse Möbius transform of the Dedekind psi function (A001615).
  6. # Definition, for m >= 0:
  7. #
  8. # a(n) = Sum_{k=1..n} Sum_{d|k} ψ_m(d)
  9. # = Sum_{k=1..n} Sum_{d|k} 2^omega(k/d) * d^m
  10. # = Sum_{k=1..n} 2^omega(k) * F_m(floor(n/k))
  11. #
  12. # where `F_n(x)` are the Faulhaber polynomials.
  13. # Asymptotic formula:
  14. # Sum_{k=1..n} Sum_{d|k} ψ_m(d) ~ F_m(n) * (zeta(m+1)^2 / zeta(2*(m+1)))
  15. # ~ (n^(m+1) * zeta(m+1)^2) / ((m+1) * zeta(2*(m+1)))
  16. # For m=1, we have:
  17. # a(n) ~ (5/4) * n^2.
  18. # a(n) = Sum_{k=1..n} A060648(k).
  19. # a(n) = Sum_{k=1..n} Sum_{d|k} 2^omega(k/d) * d.
  20. # a(n) = Sum_{k=1..n} Sum_{d|k} A001615(d).
  21. # a(n) = (1/2)*Sum_{k=1..n} 2^omega(k) * floor(n/k) * floor(1 + n/k).
  22. # Partial sums of A060648.
  23. # See also:
  24. # https://oeis.org/A064608 -- Partial sums of A034444: sum of number of unitary divisors from 1 to n.
  25. # https://oeis.org/A061503 -- Sum_{k<=n} (tau(k^2)), where tau is the number of divisors function.
  26. # a(n) = Sum_{d|n} J_2(d)*mu(n/d)^2, Dirichlet convolution of A007434 and A008966. - Benoit Cloitre, Sep 08 2002
  27. func hello(n, m) {
  28. n.divisors.sum {|d|
  29. moebius(d) * dedekind_psi(n/d, m)
  30. }
  31. }
  32. func bar(n, m) {
  33. n.divisors.sum {|d|
  34. jordan_totient(d, m) * moebius(n/d)**2
  35. }
  36. }
  37. func hello2(n, m) {
  38. # n.divisors.sum {|d|
  39. dedekind_psi(n, m)
  40. # }
  41. }
  42. func bar2(n, m) {
  43. n.divisors.sum {|d|
  44. #2**omega(d) * jordan_totient(n/d, m)
  45. 2**omega(d) * euler_phi(n/d)
  46. #moebius(n/d) * d**2 / euler_phi(n)
  47. }
  48. }
  49. # a(n) = Sum_{d|n} 2^omega(d) * phi(n/d), Dirichlet convolution of A034444 and A000010. - ~~~~
  50. __END__
  51. say 20.of { hello(_, 2) }
  52. say 20.of { bar(_, 2) }
  53. say ''
  54. say 20.of { hello2(_, 1) }
  55. say 20.of { bar2(_, 1) }
  56. __END__
  57. func foo (n, m) {
  58. var lookup_size = (2 + 2*n.iroot(3)**2)
  59. var omega_sum_lookup = [0]
  60. for k in (1..lookup_size) {
  61. omega_sum_lookup[k] = (omega_sum_lookup[k-1] + 2**(k.omega))
  62. }
  63. var mu = moebius(0, n.isqrt)
  64. func R(n) { # A064608(n) = Sum_{k=1..n} 2^omega(k)
  65. if (n <= lookup_size) {
  66. return omega_sum_lookup[n]
  67. }
  68. var total = 0
  69. for k in (1..n.isqrt) {
  70. total += mu[k]*(
  71. 2*sum(1..floor(isqrt(n / k**2)), {|j|
  72. floor(n / (j * k**2))
  73. }) - floor(isqrt(n / k**2))**2
  74. ) if mu[k]
  75. }
  76. return total
  77. }
  78. var s = n.isqrt
  79. var total = 0
  80. for k in (1..s) {
  81. total += (2**omega(k) * faulhaber(floor(n/k), m))
  82. total += (k**m * R(floor(n/k)))
  83. }
  84. total -= R(s)*faulhaber_sum(s, m)
  85. return total
  86. }
  87. func R(n) {
  88. sum(1..n, {|k|
  89. 2**omega(k)
  90. })
  91. }
  92. func bar(n, m) {
  93. sum(1..n, {|k|
  94. k**m * R(floor(n/k))
  95. })
  96. }
  97. func baz(n, m) {
  98. sum(1..n, {|k|
  99. k.divisors.sum {|d|
  100. dedekind_psi(d, m)
  101. }
  102. })
  103. }
  104. say 20.of { foo(_, 1) }
  105. say 20.of { bar(_, 0) }
  106. say 20.of { baz(_, 1) }
  107. say 20.of { R(_) }
  108. __END__
  109. func inverse_moebius_of_dedekind_partial_sum_test_1(n, m) {
  110. sum(1..n, {|k|
  111. k.divisors.sum {|d|
  112. d.dedekind_psi(m)
  113. }
  114. })
  115. }
  116. func inverse_moebius_of_dedekind_partial_sum_test_2(n, m) {
  117. sum(1..n, {|k|
  118. k.divisors.sum {|d|
  119. 2**omega(k/d) * d**m
  120. }
  121. })
  122. }
  123. func inverse_moebius_of_dedekind_partial_sum_test_3(n, m) {
  124. sum(1..n, {|k|
  125. 2**omega(k) * faulhaber(floor(n/k), m)
  126. })
  127. }
  128. for m in (0 .. 10) {
  129. var n = 100.irand
  130. var t1 = inverse_moebius_of_dedekind_partial_sum(n, m)
  131. var t2 = inverse_moebius_of_dedekind_partial_sum_test_1(n, m)
  132. var t3 = inverse_moebius_of_dedekind_partial_sum_test_2(n, m)
  133. var t4 = inverse_moebius_of_dedekind_partial_sum_test_3(n, m)
  134. assert_eq(t1, t2)
  135. assert_eq(t1, t3)
  136. assert_eq(t1, t4)
  137. say "Sum_{k=1..#{n}} Sum_{d|k} ψ_#{m}(d) = #{t1}"
  138. }
  139. __END__
  140. Sum_{k=1..84} Sum_{d|k} ψ_0(d) = 956
  141. Sum_{k=1..87} Sum_{d|k} ψ_1(d) = 9310
  142. Sum_{k=1..61} Sum_{d|k} ψ_2(d) = 109853
  143. Sum_{k=1..35} Sum_{d|k} ψ_3(d) = 458652
  144. Sum_{k=1..47} Sum_{d|k} ψ_4(d) = 51704334
  145. Sum_{k=1..50} Sum_{d|k} ψ_5(d) = 2863258691
  146. Sum_{k=1..40} Sum_{d|k} ψ_6(d) = 25966179432
  147. Sum_{k=1..94} Sum_{d|k} ψ_7(d) = 801529887601705
  148. Sum_{k=1..61} Sum_{d|k} ψ_8(d) = 1402512018638201
  149. Sum_{k=1..78} Sum_{d|k} ψ_9(d) = 889920100633147511
  150. Sum_{k=1..63} Sum_{d|k} ψ_10(d) = 6152021324576989982