708 Twos are all you need.sf 554 B

1234567891011121314151617181920212223242526272829
  1. #!/usr/bin/ruby
  2. # Daniel "Trizen" Șuteu
  3. # Date: 22 May 2020
  4. # https://github.com/trizen
  5. # Twos are all you need
  6. # https://projecteuler.net/problem=708
  7. # Solution by counting the number of k-almost primes <= n.
  8. # Let:
  9. # pi_k(n) = the number of k-almost primes <= n.
  10. # Then:
  11. # S(n) = Sum_{k=1..n} 2^bigomega(k)
  12. # = Sum_{k=0..floor(log_2(n))} 2^k * pi_k(n)
  13. # Runtime: 0.371s (previously 5.876s)
  14. func S(n) {
  15. sum(0..n.ilog2, {|k|
  16. 2**k * k.almost_primepi(n)
  17. })
  18. }
  19. say ("S(10^8) = ", S(10**8))
  20. say ("S(10^14) = ", S(10**14))