count_of_k-omega_primes.sf 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. #!/usr/bin/ruby
  2. # Daniel "Trizen" Șuteu
  3. # Date: 14 March 2021
  4. # https://github.com/trizen
  5. # Count the number of k-omega primes <= n.
  6. # Definition:
  7. # k-omega primes are numbers n such that omega(n) = k.
  8. # See also:
  9. # https://en.wikipedia.org/wiki/Almost_prime
  10. # https://en.wikipedia.org/wiki/Prime_omega_function
  11. func omega_prime_count(n, k=1) {
  12. if (k == 1) {
  13. return prime_power_count(n)
  14. }
  15. var count = 0
  16. func (m, p, k, j = 1, s = idiv(n,m).iroot(k)) {
  17. if (k == 2) {
  18. for (true; p <= s; ++j) {
  19. var r = p.next_prime
  20. for (var t = m*p ; t <= n; t *= p) {
  21. var w = idiv(n, t)
  22. break if (p > w)
  23. count += (prime_count(w) - j)
  24. for (var r2 = r; r2 <= w; r2.next_prime!) {
  25. var u = t*r2*r2
  26. break if (u > n)
  27. for (true; u <= n; u *= r2) {
  28. ++count
  29. }
  30. }
  31. }
  32. p = r
  33. }
  34. return nil
  35. }
  36. for (true; p <= s; ++j) {
  37. var r = p.next_prime
  38. for (var t = m*p ; t <= n; t *= p) {
  39. var s = idiv(n,t).iroot(k-1)
  40. break if (s < r)
  41. __FUNC__(t, r, k-1, j+1, s)
  42. }
  43. p = r
  44. }
  45. }(1, 2, k)
  46. return count
  47. }
  48. # Run some tests
  49. for k in (1..10) {
  50. var upto = k.pn_primorial+1e5.irand
  51. var x = omega_prime_count(upto, k)
  52. var y = k.omega_primes(upto).len
  53. var z = k.omega_prime_count(upto)
  54. say "Testing: #{k} with n = #{upto} -> #{x}"
  55. assert_eq(x, y)
  56. assert_eq(x, z)
  57. }
  58. say ''
  59. for k in (1..6) {
  60. say ("Count of #{'%2d' % k}-omega primes for 10^n: ", 7.of {|n| omega_prime_count(10**n, k) })
  61. }
  62. __END__
  63. Count of 1-omega primes for 10^n: [0, 7, 35, 193, 1280, 9700, 78734]
  64. Count of 2-omega primes for 10^n: [0, 2, 56, 508, 4097, 33759, 288726]
  65. Count of 3-omega primes for 10^n: [0, 0, 8, 275, 3695, 38844, 379720]
  66. Count of 4-omega primes for 10^n: [0, 0, 0, 23, 894, 15855, 208034]
  67. Count of 5-omega primes for 10^n: [0, 0, 0, 0, 33, 1816, 42492]
  68. Count of 6-omega primes for 10^n: [0, 0, 0, 0, 0, 25, 2285]