generate.pl 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. #!/usr/bin/perl
  2. # The number of terms of A354558 that are <= 10^n.
  3. # https://oeis.org/A354559
  4. # Known terms:
  5. # 1, 2, 5, 13, 28, 79, 204, 549, 1509, 4231, 12072, 36426, 112589
  6. use 5.020;
  7. use strict;
  8. use warnings;
  9. use ntheory qw(:all);
  10. use experimental qw(signatures);
  11. sub smooth_numbers ($limit, $primes) {
  12. if ($limit <= $primes->[-1]) {
  13. return [1 .. $limit];
  14. }
  15. if ($limit <= 5e4) {
  16. my @list;
  17. my $B = $primes->[-1];
  18. foreach my $k (1 .. $limit) {
  19. if (is_smooth($k, $B)) {
  20. push @list, $k;
  21. }
  22. }
  23. return \@list;
  24. }
  25. my @h = (1);
  26. foreach my $p (@$primes) {
  27. foreach my $n (@h) {
  28. if ($n * $p <= $limit) {
  29. push @h, $n * $p;
  30. }
  31. }
  32. }
  33. return \@h;
  34. }
  35. sub upto ($k, $j) {
  36. my $limit = rootint($k, $j);
  37. my @smooth;
  38. my @primes;
  39. my $i = 0;
  40. my $pi = prime_count($limit);
  41. foreach my $p (@{primes($limit)}) {
  42. ++$i;
  43. say "[$i / $pi] Processing prime $p";
  44. my $pj = powint($p, $j);
  45. push @primes, $p;
  46. push @smooth, grep {
  47. my $m = addint($_, 1);
  48. valuation($m, (factor($m))[-1]) >= $j;
  49. } map { mulint($_, $pj) } @{smooth_numbers(divint($k, $pj), \@primes)};
  50. }
  51. return sort { $a <=> $b } @smooth;
  52. }
  53. #~ my $n = 7;
  54. #~ say join(', ', upto($n, 2));
  55. #~ __END__
  56. my $n = 13;
  57. my $i = 0;
  58. open my $fh, '>', 'bfile.txt';
  59. foreach my $k (upto(powint(10, $n), 2)) {
  60. my $row = sprintf("%s %s\n", ++$i, $k);
  61. print $row;
  62. print $fh $row;
  63. }
  64. close $fh;