prog.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 a ($n) {
  36. my $k = powint(10, $n);
  37. #my @smooth;
  38. my $count = 0;
  39. my @primes;
  40. foreach my $p (@{primes(sqrtint($k))}) {
  41. #say "Processing prime $p";
  42. my $pp = mulint($p, $p);
  43. push @primes, $p;
  44. #push @smooth, map {mulint($_, $pp) } @{smooth_numbers(divint($k, $pp), primes($p))};
  45. foreach my $s (@{smooth_numbers(divint($k, $pp), \@primes)}) {
  46. my $m = mulint($pp, $s) + 1;
  47. if (valuation($m, (factor($m))[-1]) >= 2) {
  48. ++$count;
  49. }
  50. }
  51. }
  52. return $count;
  53. }
  54. foreach my $n (1 .. 15) {
  55. say "a($n) = ", a($n);
  56. }
  57. __END__
  58. a(1) = 1
  59. a(2) = 2
  60. a(3) = 5
  61. a(4) = 13
  62. a(5) = 28
  63. a(6) = 79
  64. a(7) = 204
  65. a(8) = 549
  66. a(9) = 1509
  67. a(10) = 4231
  68. a(11) = 12072
  69. a(12) = 36426