prog.pl 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121
  1. #!/usr/bin/perl
  2. # a(n) is the number of Carmichael numbers whose largest prime factor is prime(n).
  3. # https://oeis.org/A283715
  4. =for comment
  5. # The corresponding Carmichael numbers:
  6. 1 -> []
  7. 2 -> []
  8. 3 -> []
  9. 4 -> []
  10. 5 -> []
  11. 6 -> []
  12. 7 -> [561, 1105]
  13. 8 -> [1729]
  14. 9 -> []
  15. 10 -> [2465]
  16. 11 -> [2821, 75361]
  17. 12 -> [63973, 1050985]
  18. 13 -> [6601, 41041]
  19. 14 -> []
  20. 15 -> []
  21. 16 -> []
  22. 17 -> []
  23. 18 -> [29341, 172081, 852841, 552721, 10877581, 1256855041]
  24. 19 -> [8911, 340561, 15182481601]
  25. 20 -> [72720130561]
  26. 21 -> [10585, 15841, 126217, 2433601, 825265, 672389641, 496050841, 5394826801, 24465723528961]
  27. 22 -> [1074363265, 24172484701]
  28. 23 -> []
  29. 24 -> [62745, 2806205689, 22541365441]
  30. 25 -> [46657, 2113921, 6436473121, 6557296321, 13402361281, 26242929505, 65320532641, 143873352001, 105083995864811041]
  31. =cut
  32. use 5.036;
  33. use Math::GMPz;
  34. use ntheory qw(:all);
  35. sub carmichael_numbers ($n, $k, $callback) {
  36. my $max_p = nth_prime($n);
  37. my $u = Math::GMPz::Rmpz_init();
  38. sub ($m, $L, $lo, $k) {
  39. if ($lo > $max_p) {
  40. return;
  41. }
  42. if ($k == 1) {
  43. Math::GMPz::Rmpz_sub_ui($u, $m, 1);
  44. if (Math::GMPz::Rmpz_divisible_p($u, $L)) {
  45. $callback->(Math::GMPz::Rmpz_init_set($m));
  46. }
  47. return;
  48. }
  49. my $z = Math::GMPz::Rmpz_init();
  50. my $lcm = Math::GMPz::Rmpz_init();
  51. foreach my $p (@{primes($lo, $max_p-1)}) {
  52. Math::GMPz::Rmpz_gcd_ui($Math::GMPz::NULL, $m, $p - 1) == 1 or next;
  53. Math::GMPz::Rmpz_lcm_ui($lcm, $L, $p - 1);
  54. Math::GMPz::Rmpz_mul_ui($z, $m, $p);
  55. __SUB__->($z, $lcm, $p + 1, $k - 1);
  56. }
  57. }
  58. ->(Math::GMPz->new($max_p), Math::GMPz->new($max_p-1), 3, $k-1);
  59. }
  60. sub a($n) {
  61. my $count = 0;
  62. foreach my $k (3..$n) {
  63. carmichael_numbers($n, $k, sub ($n) { ++$count });
  64. }
  65. return $count;
  66. }
  67. foreach my $n(1..100) {
  68. say "a($n) = ", a($n);
  69. }
  70. __END__
  71. a(1) = 0
  72. a(2) = 0
  73. a(3) = 0
  74. a(4) = 0
  75. a(5) = 0
  76. a(6) = 0
  77. a(7) = 2
  78. a(8) = 1
  79. a(9) = 0
  80. a(10) = 1
  81. a(11) = 2
  82. a(12) = 2
  83. a(13) = 2
  84. a(14) = 0
  85. a(15) = 0
  86. a(16) = 0
  87. a(17) = 0
  88. a(18) = 6
  89. a(19) = 3
  90. a(20) = 1
  91. a(21) = 9
  92. a(22) = 2
  93. a(23) = 0
  94. a(24) = 3
  95. a(25) = 9
  96. a(26) = 7
  97. a(27) = 3