prog_memory_friendly.pl 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. #!/usr/bin/perl
  2. # a(n) is the first number that is the sum of k successive semiprimes for 1 <= k <= n.
  3. # https://oeis.org/A370687
  4. use 5.036;
  5. use ntheory qw(:all);
  6. sub is_sum_of_successive_semiprimes ($n, $k) {
  7. if ($k == 1) {
  8. return is_semiprime($n);
  9. }
  10. my $v = divint($n, $k);
  11. my $arr = semi_primes(vecmax(0, $v - 4*$k*$k), $v + 4*$k*$k); # faster, but may give wrong results
  12. #my $sv = semiprime_count($v);
  13. #my $arr = semi_primes(nth_semiprime(vecmax(1, $sv - $k)), nth_semiprime($sv + $k));
  14. my @list = splice(@$arr, 0, $k);
  15. foreach my $r (@$arr) {
  16. my $sum = vecsum(@list);
  17. if ($sum > $n) {
  18. return 0;
  19. }
  20. if ($sum == $n) {
  21. return 1;
  22. }
  23. shift @list;
  24. push @list, $r;
  25. }
  26. return 0;
  27. }
  28. foreach my $k (1..6) {
  29. if ($k <= 5) {
  30. is_sum_of_successive_semiprimes(2705, $k) or die "error for k = $k";
  31. }
  32. if ($k <= 4) {
  33. is_sum_of_successive_semiprimes(2045, $k) or die "error for k = $k";
  34. }
  35. if ($k <= 3) {
  36. is_sum_of_successive_semiprimes(134, $k) or die "error for k = $k";
  37. }
  38. if ($k <= 2) {
  39. is_sum_of_successive_semiprimes(10, $k) or die "error for k = $k";
  40. }
  41. is_sum_of_successive_semiprimes(16626281, $k) or die "error for k = $k";
  42. }
  43. sub a($k, $from = 1, $to = 1e6) {
  44. my $result = -1;
  45. forsemiprimes {
  46. if (is_sum_of_successive_semiprimes($_, $k)) {
  47. my $ok = 1;
  48. for(my $j = $k-1; $j >= 2; $j--) {
  49. if (not is_sum_of_successive_semiprimes($_, $j)) {
  50. $ok = 0;
  51. last;
  52. }
  53. say "Candidate: a($k) >= $_" if ($k >= 6);
  54. }
  55. if ($ok) {
  56. $result = $_;
  57. lastfor;
  58. }
  59. }
  60. } $from, $to;
  61. return $result;
  62. }
  63. a(2) == 10 or die "error for a(2)";
  64. a(3) == 134 or die "error for a(3)";
  65. a(4) == 2045 or die "error for a(4)";
  66. a(5) == 2705 or die "error for a(5)";
  67. #say "a(6) = ", a(6, 1, 16626281);
  68. say "a(7) = ", a(7, 5*1e8, 1e10);
  69. __END__
  70. Candidate: a(6) >= 16595159
  71. Candidate: a(6) >= 16600877
  72. Candidate: a(6) >= 16608299
  73. Candidate: a(6) >= 16614691
  74. Candidate: a(6) >= 16617142
  75. Candidate: a(6) >= 16626281
  76. Candidate: a(6) >= 16626281
  77. Candidate: a(6) >= 16626281
  78. Candidate: a(6) >= 16626281
  79. a(6) >= 16626281
  80. perl x.sf 52.49s user 0.12s system 98% cpu 53.252 total