partial_sums_of_prime_bigomega_function.sf 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147
  1. #!/usr/bin/ruby
  2. # Daniel "Trizen" Șuteu
  3. # Date: 27 November 2018
  4. # https://github.com/trizen
  5. # A nice algorithm in terms of the prime-counting function for computing partial sums of the generalized bigomega(n) function:
  6. # B_m(n) = Sum_{k=1..n} Ω_m(k)
  7. # For `m=0`, we have:
  8. # B_0(n) = bigomega(n!)
  9. # OEIS related sequences:
  10. # https://oeis.org/A025528
  11. # https://oeis.org/A022559
  12. # https://oeis.org/A071811
  13. # https://oeis.org/A154945 (0.55169329765699918...)
  14. # https://oeis.org/A286229 (0.19411816983263379...)
  15. # Example for `B_0(n)`:
  16. # B_0(10^1) = 15
  17. # B_0(10^2) = 239
  18. # B_0(10^3) = 2877
  19. # B_0(10^4) = 31985
  20. # B_0(10^5) = 343614
  21. # B_0(10^6) = 3626619
  22. # B_0(10^7) = 37861249
  23. # B_0(10^8) = 392351272
  24. # B_0(10^9) = 4044220058
  25. # B_0(10^10) = 41518796555
  26. # B_0(10^11) = 424904645958
  27. # Example for `B_1(n)`:
  28. # B_1(10^1) = 30
  29. # B_1(10^2) = 2815
  30. # B_1(10^3) = 276337
  31. # B_1(10^4) = 27591490
  32. # B_1(10^5) = 2758525172
  33. # B_1(10^6) = 275847515154
  34. # B_1(10^7) = 27584671195911
  35. # B_1(10^8) = 2758466558498626
  36. # B_1(10^9) = 275846649393437566
  37. # B_1(10^10) = 27584664891073330599
  38. # B_1(10^11) = 2758466488352698209587
  39. # Example for `B_2(n)`:
  40. # B_2(10^1) = 82
  41. # B_2(10^2) = 66799
  42. # B_2(10^3) = 64901405
  43. # B_2(10^4) = 64727468210
  44. # B_2(10^5) = 64708096890744
  45. # B_2(10^6) = 64706281936598588
  46. # B_2(10^7) = 64706077322294843451
  47. # B_2(10^8) = 64706058761567362618628
  48. # B_2(10^9) = 64706056807390376400359474
  49. # B_2(10^10) = 64706056632561375736945155965
  50. # B_2(10^11) = 64706056612919470606889256184409
  51. # Asymptotic formulas:
  52. # B_1(n) ~ 0.55169329765699918... * n*(n+1)/2
  53. # B_2(n) ~ 0.19411816983263379... * n*(n+1)*(2*n+1)/6
  54. # In general, for `m>=1`, we have the following asymptotic formula:
  55. # B_m(n) ~ (Sum_{k>=1} primezeta((m+1)*k)) * F_m(n)
  56. #
  57. # where F_n(x) is Faulhaber's formula and primezeta(s) is the prime zeta function.
  58. # The prime zeta function is defined as:
  59. # primezeta(s) = Sum_{p prime >= 2} 1/p^s
  60. # See also:
  61. # https://oeis.org/A013939
  62. # https://oeis.org/A064182
  63. # https://en.wikipedia.org/wiki/Prime_omega_function
  64. # https://en.wikipedia.org/wiki/Prime-counting_function
  65. # https://trizenx.blogspot.com/2018/11/partial-sums-of-arithmetical-functions.html
  66. func prime_bigomega_partial_sum(n, m) { # O(sqrt(n)) complexity
  67. var s = n.isqrt
  68. var u = floor(n/(s+1))
  69. var total = 0
  70. for k in (1..s) {
  71. total += faulhaber_sum(k, m)*(prime_power_count(floor(n/(k+1))+1, floor(n/k)))
  72. }
  73. for k in (1..u) {
  74. total += faulhaber_sum(floor(n/k), m) if k.is_prime_power
  75. }
  76. return total
  77. }
  78. func prime_bigomega_partial_sum_2(n, m) {
  79. var s = n.isqrt
  80. var total = 0
  81. for k in (1..s) {
  82. total += (k**m * prime_power_count(floor(n/k)))
  83. total += faulhaber_sum(floor(n/k), m) if k.is_prime_power
  84. }
  85. total -= prime_power_count(s)*faulhaber_sum(s, m)
  86. return total
  87. }
  88. func prime_bigomega_partial_sum_test (n, m) { # just for testing
  89. var total = 0
  90. for k in (1..n) {
  91. total += faulhaber_sum(floor(n/k), m) if k.is_prime_power
  92. }
  93. return total
  94. }
  95. for m in (0 .. 10) {
  96. var n = 10000.irand
  97. var t1 = prime_bigomega_partial_sum(n, m)
  98. var t2 = prime_bigomega_partial_sum_2(n, m)
  99. var t3 = prime_bigomega_partial_sum_test(n, m)
  100. assert_eq(t1, t2)
  101. assert_eq(t1, t3)
  102. say "Sum_{k=1..#{n}} bigomega_#{m}(k) = #{t1}"
  103. }
  104. __END__
  105. Sum_{k=1..6682} bigomega_0(k) = 21048
  106. Sum_{k=1..3447} bigomega_1(k) = 3277974
  107. Sum_{k=1..9287} bigomega_2(k) = 51825111802
  108. Sum_{k=1..9418} bigomega_3(k) = 159996950760258
  109. Sum_{k=1..7808} bigomega_4(k) = 213588687883972941
  110. Sum_{k=1..1349} bigomega_5(k) = 17394189051711781
  111. Sum_{k=1..6124} bigomega_6(k) = 385556244990136505278441
  112. Sum_{k=1..8317} bigomega_7(k) = 11667206972644664046687556070
  113. Sum_{k=1..5282} bigomega_8(k) = 715286720988907445715200810310
  114. Sum_{k=1..7094} bigomega_9(k) = 32146805184233019106400204605763207
  115. Sum_{k=1..1863} bigomega_10(k) = 42157952745357988027790444565086