sum_of_squarefree_k-almost_primes.sf 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. #!/usr/bin/ruby
  2. # Author: Trizen
  3. # Date: 16 August 2023
  4. # https://github.com/trizen
  5. # Sum of squarefree k-almost primes <= n.
  6. # See also:
  7. # https://en.wikipedia.org/wiki/Almost_prime
  8. func squarefree_almost_prime_sum(n, k) {
  9. if (k == 1) {
  10. return n.prime_sum
  11. }
  12. var total = 0
  13. func (m, lo, k, j = 0) {
  14. var hi = idiv(n,m).iroot(k)
  15. if (k == 2) {
  16. each_prime(lo, hi, {|p|
  17. j += p
  18. total += m*p*(prime_sum(idiv(n, m*p)) - j)
  19. })
  20. return nil
  21. }
  22. each_prime(lo, hi, {|p|
  23. j += p
  24. __FUNC__(m*p, p+1, k-1, j)
  25. })
  26. }(1, 2, k)
  27. return total
  28. }
  29. # Run some tests
  30. for k in (1..10) {
  31. var upto = k.pn_primorial+1e5.irand
  32. var x = squarefree_almost_prime_sum(upto, k)
  33. var y = k.squarefree_almost_primes(upto).sum
  34. var z = k.squarefree_almost_prime_sum(upto)
  35. say "Testing: #{k} with n = #{upto} -> #{x}"
  36. assert_eq(x, y)
  37. assert_eq(x, z)
  38. }
  39. say ''
  40. for k in (1..6) {
  41. say ("Sum of squarefree #{'%d' % k}-almost primes <= 10^n: ", 8.of {|n| squarefree_almost_prime_sum(10**n, k) })
  42. }
  43. __END__
  44. Sum of squarefree 1-almost primes <= 10^n: [0, 17, 1060, 76127, 5736396, 454396537, 37550402023, 3203324994356]
  45. Sum of squarefree 2-almost primes <= 10^n: [0, 16, 1620, 142800, 12671118, 1136592401, 102555164308, 9320987760054]
  46. Sum of squarefree 3-almost primes <= 10^n: [0, 0, 286, 73624, 9415168, 1013522662, 104063487517, 10437330922560]
  47. Sum of squarefree 4-almost primes <= 10^n: [0, 0, 0, 10524, 2434091, 379717493, 48777045480, 5695891373909]
  48. Sum of squarefree 5-almost primes <= 10^n: [0, 0, 0, 0, 163260, 54077985, 10247415009, 1545644072692]
  49. Sum of squarefree 6-almost primes <= 10^n: [0, 0, 0, 0, 0, 1404120, 761443872, 186672163072]