668 Square root smooth numbers.sf 1.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. #!/usr/bin/ruby
  2. # Daniel "Trizen" Șuteu
  3. # Date: 07 June 2019
  4. # https://github.com/trizen
  5. # https://projecteuler.net/problem=668
  6. # Runtime: 1.535s (previously: 2.402s)
  7. # Formula:
  8. # R(n) = Sum_{sqrt(n) < p <= n} floor(n/p)
  9. #
  10. # a(n) = n - R(n) - Sum_{p <= sqrt(n)} (p-1) - pi(sqrt(n))
  11. # = n - R(n) - Sum_{p <= sqrt(n)} p
  12. #
  13. # where p runs over the prime numbers.
  14. # The interesting part is computing R(n) efficiently.
  15. # See also:
  16. # https://oeis.org/A064775 -- Card{ k<=n, k such that all prime divisors of k are <= sqrt(k) }.
  17. func R(n) {
  18. var p = next_prime(n.isqrt)
  19. var t = idiv(n,p)
  20. var sum = 0
  21. while (p <= n) {
  22. var u = idiv(n,p)
  23. if (u == t) {
  24. var q = next_prime(idiv(n,u))
  25. sum += u*prime_count(p, q-1)
  26. u = idiv(n,q)
  27. p = q
  28. }
  29. sum += u
  30. t = u
  31. p = p.next_prime
  32. }
  33. sum
  34. }
  35. func square_root_smooth_count (n) {
  36. n - n.isqrt.primes_sum - R(n)
  37. }
  38. say square_root_smooth_count(10_000_000_000)