squarefree_almost_primes_in_range_from_factor_list.pl 2.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. #!/usr/bin/perl
  2. # Daniel "Trizen" Șuteu
  3. # Date: 17 March 2023
  4. # https://github.com/trizen
  5. # Generate all the squarefree k-almost primes in a given range [A, B], using a given list of prime factors.
  6. use 5.020;
  7. use ntheory qw(:all);
  8. use experimental qw(signatures);
  9. sub divceil ($x, $y) { # ceil(x/y)
  10. (($x % $y == 0) ? 0 : 1) + divint($x, $y);
  11. }
  12. sub squarefree_almost_primes_in_range ($A, $B, $k, $factors) {
  13. $A = vecmax($A, pn_primorial($k));
  14. my $factors_end = $#{$factors};
  15. if ($k == 0) {
  16. return (($A > 1) ? () : 1);
  17. }
  18. my @list;
  19. sub ($m, $k, $i = 0) {
  20. my $lo = $factors->[$i];
  21. my $hi = rootint(divint($B, $m), $k);
  22. if ($lo > $hi) {
  23. return;
  24. }
  25. if ($k == 1) {
  26. $lo = vecmax($lo, divceil($A, $m));
  27. if ($lo > $hi) {
  28. return;
  29. }
  30. foreach my $j ($i .. $factors_end) {
  31. my $q = $factors->[$j];
  32. last if ($q > $hi);
  33. next if ($q < $lo);
  34. push(@list, mulint($m, $q));
  35. }
  36. return;
  37. }
  38. foreach my $j ($i .. $factors_end - 1) {
  39. my $q = $factors->[$j];
  40. last if ($q > $hi);
  41. next if ($q < $lo);
  42. __SUB__->(mulint($m, $q), $k - 1, $j + 1);
  43. }
  44. }
  45. ->(1, $k);
  46. sort { $a <=> $b } @list;
  47. }
  48. my $from = 1;
  49. my $upto = 1e6;
  50. my @factors = @{primes(17)}; # prime list
  51. foreach my $k (0 .. scalar(@factors)) {
  52. my @divisors = squarefree_almost_primes_in_range($from, $upto, $k, \@factors);
  53. printf("%2d-squarefree almost primes in range [%s, %s]: [%s]\n", $k, $from, $upto, join(', ', @divisors));
  54. }
  55. __END__
  56. 0-squarefree almost primes in range [1, 1000000]: [1]
  57. 1-squarefree almost primes in range [1, 1000000]: [2, 3, 5, 7, 11, 13, 17]
  58. 2-squarefree almost primes in range [1, 1000000]: [6, 10, 14, 15, 21, 22, 26, 33, 34, 35, 39, 51, 55, 65, 77, 85, 91, 119, 143, 187, 221]
  59. 3-squarefree almost primes in range [1, 1000000]: [30, 42, 66, 70, 78, 102, 105, 110, 130, 154, 165, 170, 182, 195, 231, 238, 255, 273, 286, 357, 374, 385, 429, 442, 455, 561, 595, 663, 715, 935, 1001, 1105, 1309, 1547, 2431]
  60. 4-squarefree almost primes in range [1, 1000000]: [210, 330, 390, 462, 510, 546, 714, 770, 858, 910, 1122, 1155, 1190, 1326, 1365, 1430, 1785, 1870, 2002, 2145, 2210, 2618, 2805, 3003, 3094, 3315, 3927, 4641, 4862, 5005, 6545, 7293, 7735, 12155, 17017]
  61. 5-squarefree almost primes in range [1, 1000000]: [2310, 2730, 3570, 4290, 5610, 6006, 6630, 7854, 9282, 10010, 13090, 14586, 15015, 15470, 19635, 23205, 24310, 34034, 36465, 51051, 85085]
  62. 6-squarefree almost primes in range [1, 1000000]: [30030, 39270, 46410, 72930, 102102, 170170, 255255]
  63. 7-squarefree almost primes in range [1, 1000000]: [510510]