binary_search.sf 979 B

12345678910111213141516171819202122232425262728293031323334353637383940414243444546
  1. #!/usr/bin/ruby
  2. # Numbers k such that the average number of odd divisors of {1..k} is an integer.
  3. # https://oeis.org/A339009
  4. # Known terms:
  5. # 1, 2, 165, 170, 1274, 9437, 69720, 69732, 69734, 69736, 515230, 515236, 515246, 28132043, 28132063, 28132079
  6. # The sequence also includes: 83860580242, 4578632504347, 4578632504465, 4578632504515
  7. func a(n) {
  8. dirichlet_hyperbola(n) - dirichlet_hyperbola(n>>1)
  9. }
  10. func b(n) {
  11. # Asymptotic formula from A060831 due to Vaclav Kotesovec, Jan 30 2019.
  12. n*(log(2*n) + 2*Num.EulerGamma - 1) / 2
  13. }
  14. var mult = 15
  15. say "Mult : #{mult}"
  16. var from = bsearch_le(2, 1e30, {|k|
  17. b(k) <=> mult*k
  18. })
  19. say "From : #{from}\n"
  20. var start = from
  21. #~ var start = bsearch_le(from-10000, from+10000, {|k|
  22. #~ a(k) <=> mult*k
  23. #~ })
  24. #~ say "Start: #{start}\n"
  25. var total = a(start - 10000 - 1)
  26. for k in (start-10000 .. start+10000) {
  27. total += sigma0(k >> k.valuation(2))
  28. if (k `divides` total) {
  29. say "Found: #{k}"
  30. }
  31. }