prog.sf 1.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546
  1. #!/usr/bin/ruby
  2. # a(n) = Sum_{1<=k<=n, gcd(k,n)=1} floor(n/k).
  3. # https://oeis.org/A116477
  4. # Some large terms:
  5. # a(10^1) = 15
  6. # a(10^2) = 236
  7. # a(10^3) = 3263
  8. # a(10^4) = 41843
  9. # a(10^5) = 510516
  10. # a(10^6) = 6026222
  11. # a(10^7) = 69472164
  12. # a(10^8) = 786824763
  13. # a(10^9) = 8789281552
  14. # a(10^10) = 97103155713
  15. # a(10^11) = 1063134960968
  16. # a(10^12) = 11552383642888
  17. # a(10^13) = 124734176788565
  18. # a(10^14) = 1339445171617995
  19. # Question:
  20. # Is there a sublinear formula for computing: Sum_{1<=k<=n, gcd(k,n)=1} k*floor(n/k) ?
  21. func S(n) { # Sum_{k=1..n} floor(n/k) = 2*Sum_{k=1..floor(sqrt(n))} floor(n/k) - floor(sqrt(n))^2
  22. n.dirichlet_sum({1},{1},{_},{_});
  23. }
  24. func a(n) { # sub-linear time
  25. n.squarefree_divisors.sum {|d|
  26. mu(d) * S(n/d)
  27. }
  28. }
  29. func a_linear(n) { # just for testing
  30. sum(1..n -> grep {|k| n.is_coprime(k) }, {|k| idiv(n,k) })
  31. }
  32. assert_eq(100.of(a), 100.of(a_linear))
  33. say 30.of(a) #=> [0, 1, 2, 4, 5, 9, 7, 15, 12, 18, 15, 28, 16, 36, 23, 31, 30, 51, 26, 59, 34, 50, 43, 75, 37, 77, 52, 72, 55, 102]
  34. for k in (1..20) {
  35. say "a(10^#{k}) = #{a(10**k)}"
  36. }