prog.sf 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. #!/usr/bin/ruby
  2. # Sum of remainders of the n-th prime mod k, for k = 1,2,3,...,n.
  3. # https://oeis.org/A099726
  4. # Formula:
  5. # a(n) = n*p - A024916(p) + Sum_{k=n+1..p} k*floor(p/k), where p = prime(n).
  6. # Some large terms:
  7. # a(10^1) = 30
  8. # a(10^2) = 2443
  9. # a(10^3) = 248372
  10. # a(10^4) = 25372801
  11. # a(10^5) = 2437160078
  12. # a(10^6) = 252670261459
  13. # a(10^7) = 24690625139657
  14. # a(10^8) = 2516604108737704
  15. # a(10^9) = 249876964098609078
  16. # a(10^10) = 24994462548503343285
  17. # a(10^11) = 2513170619960257982344
  18. func T(n) { # Sum_{k=1..n} k = n-th triangular number
  19. n.faulhaber(1)
  20. }
  21. func S(n) { # Sum_{k=1..n} sigma(k) = Sum_{k=1..n} k*floor(n/k)
  22. #var s = n.isqrt
  23. #sum(1..s, {|k| T(idiv(n,k)) + k*idiv(n,k) }) - T(s)*s
  24. n.dirichlet_sum({1}, {_}, {_}, {.faulhaber(1)})
  25. }
  26. func g(a,b) {
  27. var total = 0
  28. while (a <= b) {
  29. var t = idiv(b, a)
  30. var u = idiv(b, t)
  31. total += t*(T(u) - T(a-1))
  32. a = u+1
  33. }
  34. return total
  35. }
  36. func a(n) { # sub-linear formula
  37. var p = n.prime
  38. n*p - S(p) + g(n+1, p)
  39. }
  40. func a_linear(n) { # just for testing
  41. var p = n.prime
  42. sum(1..n, {|k| p % k })
  43. }
  44. assert_eq(a.map(1..100), a_linear.map(1..100))
  45. say a.map(1..58) #=> [0, 1, 3, 5, 7, 7, 14, 18, 28, 30, 31, 26, 38, 45, 63, 71, 93, 75, 96, 115, 101, 142, 161, 167, 152, 159, 203, 224, 219, 222, 216, 250, 263, 296, 341, 320, 319, 349, 433, 427, 496, 419, 487, 481, 538, 537, 495, 631, 635, 676, 697, 777, 665, 820, 784, 874, 929, 856]
  46. for k in (1..9) {
  47. say "a(10^#{k}) = #{a(10**k)}"
  48. }
  49. __END__
  50. # PARI/GP program (linear time)
  51. a(n) = my(p=prime(n)); sum(k=1, n, p%k);
  52. # PARI/GP program (sublinear time)
  53. T(n) = n*(n+1)/2;
  54. S(n) = my(s=sqrtint(n)); sum(k=1, s, T(n\k) + k*(n\k)) - s*T(s); \\ A024916
  55. g(a,b) = my(s=0); while(a <= b, my(t=b\a); my(u=b\t); s += t*(T(u) - T(a-1)); a = u+1); s;
  56. a(n) = my(p=prime(n)); n*p - S(p) + g(n+1, p);
  57. # PARI/GP program (sublinear time) -- shorter, but slower
  58. T(n) = n*(n+1)/2;
  59. g(a,b) = my(s=0); while(a <= b, my(t=b\a); my(u=b\t); s += t*(T(u) - T(a-1)); a = u+1); s;
  60. a(n) = my(p=prime(n)); n*p - g(1, p) + g(n+1, p);