partial_sums_of_gpf.sf 963 B

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  1. #!/usr/bin/ruby
  2. # Daniel "Trizen" Șuteu
  3. # Date: 20 July 2020
  4. # https://github.com/trizen
  5. # Algorithm with sublinear time for computing:
  6. #
  7. # Sum_{k=2..n} gpf(k)
  8. #
  9. # where:
  10. # gpf(k) = the greatest prime factor of k
  11. # See also:
  12. # https://projecteuler.net/problem=642
  13. func partial_sums_of_gpf(n) {
  14. var t = 0
  15. var s = n.isqrt
  16. s.each_prime {|p|
  17. t += p*p.smooth_count(idiv(n,p))
  18. }
  19. for (var p = s.next_prime; p <= n; p.next_prime!) {
  20. var u = idiv(n,p)
  21. var r = idiv(n,u)
  22. t += u*sum_primes(p,r)
  23. p = r
  24. }
  25. return t
  26. }
  27. for k in (1..7) {
  28. say "S(10^#{k}) = #{partial_sums_of_gpf(10**k)}"
  29. }
  30. __END__
  31. S(10^1) = 32
  32. S(10^2) = 1915
  33. S(10^3) = 135946
  34. S(10^4) = 10118280
  35. S(10^5) = 793111753
  36. S(10^6) = 64937323262
  37. S(10^7) = 5494366736156
  38. S(10^8) = 476001412898167
  39. S(10^9) = 41985754895017934
  40. S(10^10) = 3755757137823525252
  41. S(10^11) = 339760245382396733607
  42. S(10^12) = 31019315736720796982142