prog.sf 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. #!/usr/bin/ruby
  2. # Smallest odd primitive abundant number (A006038) having n distinct prime factors.
  3. # https://oeis.org/A188342
  4. # Known terms:
  5. # 945, 3465, 15015, 692835, 22309287, 1542773001, 33426748355, 1635754104985, 114761064312895, 9316511857401385, 879315530560980695
  6. # Upper-bounds due to Donovan Johnson for n=14 (Mar 31 2011) and M. F. Hasler for n=15..17 (Jul 17 2016)
  7. # a(14) <= 88452776289145528645
  8. # a(15) <= 2792580508557308832935
  9. # a(16) <= 428525983200229616718445
  10. # a(17) <= 42163230434005200984080045
  11. # Extra upper-bounds (generated with this program):
  12. # a(18) <= 1357656019974967471687377449
  13. # a(19) <= 189407457935656632167109232619
  14. # a(20) <= 25557786985317796527581223227267
  15. # a(21) <= 3791929072764979008305867397500527
  16. # a(22) <= 456592871291171295882477091922563457
  17. # For n = 18 and lpf(N) = 5, we also have:
  18. # a(18) <= 4506505276387497069886673045
  19. var min = Inf
  20. var max = 456592871291171295882477091922563457
  21. var omega_value = 22 # exact number of prime factors
  22. var lpf = 7 # exactly smallest prime factor of n
  23. var gpf_max = 103 # limit for the largest prime of n
  24. var max_pi_p_diff = 3 # limit for the maximum difference between primes (pi(gpf(n)) - pi(q))
  25. var min_abundancy = 2 # minimum abundancy
  26. var max_abundancy = 2.1 # maximum abundancy
  27. func is_primitive_abundant(n) {
  28. n.factor.none {|p|
  29. abundancy(n/p) > 2
  30. }
  31. }
  32. func f(n, p) {
  33. if (n.omega > omega_value) {
  34. return nil
  35. }
  36. var ab = n.abundancy
  37. if (ab > max_abundancy) {
  38. return nil
  39. }
  40. if (ab >= min_abundancy) {
  41. if (n<min && n.omega==omega_value && is_primitive_abundant(n)) {
  42. min = n
  43. say [p, omega(n), n]
  44. }
  45. }
  46. var q = p.next_prime
  47. if (q > gpf_max) {
  48. return nil
  49. }
  50. if (q.pi - p.pi <= max_pi_p_diff) {
  51. if (n*q <= max) {
  52. f(n*q, q)
  53. }
  54. }
  55. f(n, q)
  56. }
  57. say f(lpf, lpf)