800 Hybrid Integers.sf 726 B

123456789101112131415161718192021222324252627282930313233343536373839
  1. #!/usr/bin/ruby
  2. # Author: Trizen
  3. # Date: 03 November 2022
  4. # https://github.com/trizen
  5. # Hybrid Integers
  6. # https://projecteuler.net/problem=800
  7. # Runtime: 26 seconds.
  8. func C(a, b) {
  9. var limit = log(a)*b
  10. var count = 0
  11. for (var p = 2; true; p.next_prime!) {
  12. var p_log = p.log
  13. #~ var k = bsearch_inverse(p+1, limit/p_log, {|q|
  14. #~ (p_log*q + q.log*p) <~> limit
  15. #~ }) \\ break
  16. var k = bsearch_le(p+1, limit/p_log, {|q|
  17. (p_log*q + q.log*p) <=> limit
  18. })
  19. count += (prime_count(p+1, k) || break)
  20. }
  21. return count
  22. }
  23. say C(800, 1) #=> 2
  24. say C(163, 165) #=> 1000
  25. say C(800, 800) #=> 10790
  26. say C(800800, 800800)