A279911.sf 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302
  1. #!/usr/bin/ruby
  2. # Sequence by Wesley Ivan Hurt:
  3. # a(n) = Sum_{i=1..n} denominator(n^i/i).
  4. # OEIS:
  5. # https://oeis.org/A279911
  6. # Formulas (discovered on 28 July 2019):
  7. # a(prime(n)) = A072205(n), where prime(n) is the n-th prime.
  8. # a(p^k) = (p^(2*k+1) + p + 2) / (2*p + 2), for prime powers p^k.
  9. # a(n) = Sum_{k=1..n} gcd(m, k), where m = denominator(n^n / n!) = A095996(n).
  10. # a(n) = Sum_{k=1..n} f(n,k), where f(n,k) is the largest divisor d of k such that gcd(d, n) = 1.
  11. # a(p^k) = (1/2) * (2 + Sum_{j=1..2*k} p^j * (-1)^j)
  12. # PARI programs:
  13. # a(n) = sum(k=1, n, if(gcd(n, k) == 1, k, denominator(n^k/k)));
  14. # a(n) = sum(k=1, n, if(gcd(n, k) == 1, k, vecmax(select(d->gcd(d, n) == 1, divisors(k)))));
  15. # a(n) = my(f=factor(n)[,1]); sum(k=1, n, if(gcd(n, k) == 1, k, gcd(vector(#f, j, k / f[j]^valuation(k, f[j]))))); \\ fastest
  16. # Question:
  17. # Is it possible to create a faster formula for computing a(n)? Perhaps, by using the divisors of n?
  18. # See also:
  19. # https://trizenx.blogspot.com/2018/08/interesting-formulas-and-exercises-in.html
  20. func f(n) {
  21. sum(1..n, {|k|
  22. de(n**k / k)
  23. })
  24. }
  25. func g(n) { # I'm pretty pleased with this, but I feel we can do better
  26. sum(1..n, {|k|
  27. gcd(n, k) == 1 ? k : k.divisors.flip.first {|d| gcd(d, n) == 1 }
  28. })
  29. }
  30. func g2(n) {
  31. var t = denominator(n**n / n!)
  32. 1..n -> sum {|k|
  33. gcd(n,k) == 1 ? k : gcd(t, k)
  34. }
  35. }
  36. func g3(n) {
  37. var t = (n! / n.factor_prod{|p|
  38. p**sum(1..n.ilog(p), {|k|
  39. floor(n / p**k)
  40. })
  41. })
  42. 1..n -> sum {|k|
  43. gcd(n,k) == 1 ? k : gcd(t, k)
  44. }
  45. }
  46. func g4(n) { # currently, the most efficient formula
  47. var F = n.factor_map{|p| p }
  48. sum(1..n, {|k|
  49. gcd(n, k) == 1 ? k : F.gcd{|p| k.remdiv(p) }
  50. })
  51. }
  52. func f(p, k) {
  53. (1.. 2*k -> sum {|j|
  54. p**j * (-1)**j
  55. } + 2) / 2
  56. }
  57. func g(p, k) {
  58. (p**(2*k + 1) + p + 2) / (2*p + 2)
  59. }
  60. say 8.of { f(5, _) }
  61. say 8.of { g(5, _) }
  62. assert_eq(8.of { f(3, _) }, 8.of { g(3**_) })
  63. assert_eq(8.of { g(3, _) }, 8.of { g(3**_) })
  64. say 20.of(f)
  65. say 20.of(g)
  66. say f(5040) #=> 4630526
  67. say g(5040) #=> 4630526
  68. for k in (1..200) {
  69. assert_eq(f(k), var t = g(k))
  70. assert_eq(t, g2(k))
  71. assert_eq(t, g3(k))
  72. assert_eq(t, g4(k))
  73. }
  74. __END__
  75. for k in (1..5) {
  76. for n in (1..k) {
  77. print(denominator(n**k / k), ", ")
  78. }
  79. }
  80. # a(n) = gcd(n,A027642(n)) = denominator(A031971(n)/n). - ~~~~
  81. # a(n) = 2 iff n is even and exists in A226872.
  82. #~ func f(n) {
  83. #~ n.divisors.grep{|p|
  84. #~ p+1 -> is_prime
  85. #~ }.prod {|p|
  86. #~ p+1
  87. #~ }
  88. #~ }
  89. #~ say 20.of(f).map_kv{|k,v| gcd(k,v) }
  90. # a(n) = sum(k=1, n, denominator(n^k/k));
  91. # a(n) = sum(k=1, n, if(gcd(n,k) == 1, k, denominator(n^k/k)));
  92. # a(n) = sum(k=1, n, if(gcd(n,k) == 1, k, vecmax(select(d->gcd(d, n) == 1, divisors(k)))));
  93. #~ __END__
  94. #~ for n in (1..2000) {
  95. #~ say (n, " ", gcd(n, n.bern.de))
  96. #~ }
  97. #~ __END__
  98. func r(n) {
  99. #map(1..n, {|k|
  100. # gcd(n, k) == 1 ? k : de(n**k / k)
  101. #})
  102. map(1..n -> grep{|k| gcd(n, k) != 1 }, {|k|
  103. [k, de(n**k / k)]
  104. })
  105. }
  106. func f(n) {
  107. sum(1..n, {|k|
  108. gcd(n, k) == 1 ? k : de(n/k)
  109. })
  110. #~ n.faulhaber(1) - n.divisors.sum {|d|
  111. #~ euler_phi(n/d)
  112. #~ }
  113. }
  114. func f2(n) {
  115. sum(1..n, {|k|
  116. de(n**k / k)
  117. })
  118. }
  119. say r(24)
  120. say f(24)
  121. say f2(24)
  122. __END__
  123. func f3(n) {
  124. #sum(
  125. }
  126. say f(5040).sum
  127. say f2(5040)
  128. #say f(3**3)
  129. #say f(3**3).sum
  130. #say 20.of(f)
  131. #say 20.of(f2)
  132. #say f(3**2)
  133. __END__
  134. # a(p^k) = (p^(2*k+1) + p + 2) / (2*p + 2), for prime powers p^k. - ~~~~
  135. # a(n) = sum(k=1, n, denominator(n^k/k));
  136. func g(n) {
  137. n.factor_map {|p,e|
  138. #(p**e * (p-1)) / 2 + 1
  139. #p**(e-1) * (p**(e+1) * (p+1)) / 2 + 1
  140. # p**(e-1) * ((p**(e+1) + 1) - 1)
  141. #p**(e-1) * ((p-1) * p**e + 1)
  142. #p**(e-1) * ((p-1) * p**(e-1) + 1)
  143. #faulhaber(p**e - p**(e-1), 1) + 1
  144. #faulhaber(p**(e-1) * ((p-1) ) * p**(e-1) + 1, 1)
  145. #p**(e-1) * ((p-1) + 1)
  146. #(p-1)**(e+1) * ((p-1)**e + (p-1)**(e+1) ) + 1
  147. #((p-1)/2)**e * ((p-1)**e + (p+1)**(e) ) / 2 + 1#
  148. #p**e
  149. #((p**2)**e + p)/(p+1)
  150. # 1/8 * p**(2*e + 1) + 5/8
  151. # ORIG: (p**(2*e + 1) + (p+2)) / (p*2 + 2)
  152. # SIMPLE: (p**(2*e + 1) + p + 2) / (2*(p + 1))
  153. (p**(2*e + 1) + p + 2) / (2*(p + 1))
  154. #(p**(2*e + 1) + p + 2) / (2*(p+1))
  155. #(p**(e + 1) + p + 2) / (2*(p+1))
  156. #(p**(2*e + 1) + p + 2) / (2*(p+1))
  157. #(p**(2*e + 1) / (2*(p+1)))
  158. #(p**e)**2 * p / (2*(p+1)) + (p / (2*(p+1))) + (1 / (p+1))
  159. #(p**(2*e + 1) / (2*(p+1))) + (p / (2*(p+1))) + (1 / (p+1))
  160. }.lcm
  161. }
  162. #~ for k in (1..10000) {
  163. #~ if (k.is_prime_power) {
  164. #~ say "Testing: #{k}"
  165. #~ assert_eq(f(k), g(k))
  166. #~ }
  167. #~ }
  168. #~ __END__
  169. var n = 3
  170. say 10.of { f(n**_) }
  171. say 10.of { g(n**_) }
  172. say ''
  173. var n = 6
  174. say 5.of { f(n**_) }
  175. say 5.of { g(n**_) }
  176. __END__
  177. func g(n) {
  178. n.factor_prod {|p,k|
  179. p-1 `divides` n ? p : 1
  180. }
  181. }
  182. say 20.of(f)
  183. __END__
  184. #say f(24)
  185. #say g(24)
  186. for k in (1..1000) {
  187. if (g(k) == 6) {
  188. print(k, ", ")
  189. }
  190. }
  191. #say 20.of(g)
  192. #say f(1240)
  193. #say g(1240)
  194. __END__
  195. #say 20.of(f)
  196. #fork
  197. for k in (1..2000) {
  198. say "#{k} #{f(k)}"
  199. }
  200. __END__
  201. #say 300.of(f)
  202. #~ say f(9940)
  203. var n = 18
  204. say f(2).sum.as_frac
  205. say f(3).sum.as_frac
  206. say f(4).sum.as_frac
  207. say f(5).sum.as_frac
  208. say f(6).sum.as_frac
  209. __END__
  210. say f(n)
  211. say f(n**2)
  212. say f(n**3)
  213. say f(n**4)