almost_prime_numbers.sf 791 B

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748
  1. #!/usr/bin/ruby
  2. # Daniel "Trizen" Șuteu
  3. # Date: 14 February 2021
  4. # https://github.com/trizen
  5. # Generate k-almost prime numbers <= n. (not in sorted order)
  6. # See also:
  7. # https://en.wikipedia.org/wiki/Almost_prime
  8. func almost_prime_numbers(n, k, callback) {
  9. if (k == 1) {
  10. return n.each_prime(callback)
  11. }
  12. func (m, lo, k) {
  13. if (k == 1) {
  14. each_prime(lo, idiv(n, m), {|q|
  15. callback(m*q)
  16. })
  17. return nil
  18. }
  19. var hi = idiv(n,m).iroot(k)
  20. each_prime(lo, hi, {|q|
  21. __FUNC__(m*q, q, k-1)
  22. })
  23. }(1, 2, k)
  24. return callback
  25. }
  26. var n = 100
  27. var k = 4
  28. say gather {
  29. almost_prime_numbers(n, k, { take(_) })
  30. }
  31. __END__
  32. [16, 24, 40, 56, 88, 36, 60, 84, 100, 54, 90, 81]