almost_prime_numbers.pl 819 B

123456789101112131415161718192021222324252627282930313233343536373839
  1. #!/usr/bin/perl
  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. use 5.020;
  9. use ntheory qw(:all);
  10. use experimental qw(signatures);
  11. sub almost_prime_numbers ($n, $k, $callback) {
  12. sub ($m, $p, $r) {
  13. if ($r == 1) {
  14. forprimes {
  15. $callback->(mulint($m, $_));
  16. } $p, divint($n, $m);
  17. return;
  18. }
  19. my $s = rootint(divint($n, $m), $r);
  20. for (my $q = $p ; $q <= $s ; $q = next_prime($q)) {
  21. __SUB__->(mulint($m, $q), $q, $r - 1);
  22. }
  23. }->(1, 2, $k);
  24. }
  25. # Generate all the numbers k <= 100 for which bigomega(k) = 4
  26. almost_prime_numbers(100, 4, sub ($n) { say $n });