generate_optimized.pl 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  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 ($prev_smooth, $limit, $primes) {
  12. if ($limit <= $primes->[-1]) {
  13. return [1 .. $limit];
  14. }
  15. #if (0 and $limit <= 5e4) {
  16. if ($limit < scalar(@$prev_smooth)) {
  17. my @list;
  18. my $B = $primes->[-1];
  19. foreach my $k (1 .. $limit) {
  20. if (is_smooth($k, $B)) {
  21. push @list, $k;
  22. }
  23. }
  24. return \@list;
  25. }
  26. my @h = grep { $_ <= $limit } @$prev_smooth;
  27. foreach my $p (@$primes) {
  28. foreach my $n (@h) {
  29. if ($n * $p <= $limit) {
  30. push @h, $n * $p;
  31. }
  32. }
  33. }
  34. return \@h;
  35. }
  36. sub upto ($k, $j) {
  37. my $limit = rootint($k, $j);
  38. my @smooth;
  39. my $i = 0;
  40. my $pi = prime_count($limit);
  41. my $prev_smooth = [1];
  42. foreach my $p (@{primes($limit)}) {
  43. ++$i;
  44. say "[$i / $pi] Processing prime $p";
  45. my $pj = powint($p, $j);
  46. my $smooth_limit = divint($k, $pj);
  47. $prev_smooth = smooth_numbers($prev_smooth, $smooth_limit, [$p]);
  48. push @smooth, grep {
  49. my $m = addint($_, 1);
  50. valuation($m, (factor($m))[-1]) >= $j;
  51. } map { mulint($_, $pj) } @$prev_smooth;
  52. }
  53. return sort { $a <=> $b } @smooth;
  54. }
  55. #~ my $n = 7;
  56. #~ say join(', ', upto($n, 2));
  57. #~ __END__
  58. my $n = 13;
  59. my $i = 0;
  60. open my $fh, '>', 'bfile2.txt';
  61. foreach my $k (upto(powint(10, $n), 2)) {
  62. my $row = sprintf("%s %s\n", ++$i, $k);
  63. print $row;
  64. print $fh $row;
  65. }
  66. close $fh;