prog.pl 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. #!/usr/bin/perl
  2. # The smallest composite number k that shares exactly n distinct prime factors with sopfr(k), the sum of the primes dividing k, with repetition.
  3. # https://oeis.org/A372524
  4. # Known terms:
  5. # 6, 4, 30, 1530, 40530, 37838430, 900569670
  6. # New terms:
  7. # a(7) = 781767956970
  8. # Lower-bounds:
  9. # a(8) > 70368744177663
  10. # Conjecture: A001221(a(n)) = n+1, for n >= 2. - ~~~~
  11. use 5.020;
  12. use ntheory qw(:all);
  13. use experimental qw(signatures);
  14. sub omega_prime_numbers ($A, $B, $n, $k, $callback) {
  15. $A = vecmax($A, pn_primorial($k));
  16. my $min_value = pn_primorial($n);
  17. sub ($m, $sopfr, $p, $k) {
  18. my $s = rootint(divint($B, $m), $k);
  19. foreach my $q (@{primes($p, $s)}) {
  20. my $r = $q+1;
  21. my $t = $sopfr+$q;
  22. for (my $v = $m * $q; $v <= $B ; do { $v *= $q; $t += $q }) {
  23. if ($k == 1) {
  24. if ($v >= $A and gcd($t, $v) >= $min_value and is_omega_prime($n, gcd($t, $v))) {
  25. $callback->($v);
  26. $B = $v if ($v < $B);
  27. }
  28. }
  29. else {
  30. if ($v*$r <= $B) {
  31. __SUB__->($v, $t, $r, $k - 1);
  32. }
  33. }
  34. }
  35. }
  36. }->(1, 0, 2, $k);
  37. }
  38. my $n = 8;
  39. my $lo = 1;
  40. my $hi = 2*$lo;
  41. while (1) {
  42. say "Sieving: [$lo, $hi]";
  43. my @terms;
  44. omega_prime_numbers($lo, $hi, $n, $n+1, sub ($k) {
  45. say "Upper-bound: $k";
  46. push @terms, $k;
  47. });
  48. @terms = sort {$a <=> $b} @terms;
  49. if (@terms){
  50. die "\nFound: a($n) = $terms[0]\n";
  51. }
  52. $lo = $hi+1;
  53. $hi = 2*$lo;
  54. }