is_chernick_carmichael_number.pl 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. #!/usr/bin/perl
  2. # Author: Daniel "Trizen" Șuteu
  3. # Date: 21 July 2018
  4. # https://github.com/trizen
  5. # Efficient algorithm for factoring (and identifying) an extended Chernick-Carmichael number.
  6. # The first few extended Chernick-Carmichael numbers are:
  7. # 1729, 63973, 294409, 56052361, 118901521, 172947529, 216821881
  8. # See also:
  9. # https://oeis.org/A317126
  10. # https://projecteuclid.org/euclid.bams/1183501763
  11. # https://oeis.org/wiki/Carmichael_numbers
  12. # https://en.wikipedia.org/wiki/Carmichael_number
  13. use 5.024;
  14. use warnings;
  15. use experimental qw(signatures);
  16. use List::Util qw(all);
  17. use ntheory qw(is_prob_prime);
  18. use Math::AnyNum qw(bsearch iroot ipow2 ilog2 is_div prod);
  19. sub chernick_carmichael_factors ($k, $r) {
  20. (6 * $k + 1, 12 * $k + 1, 18 * $k + 1, (map { ipow2($_ - 2) * 9 * $k + 1 } 4 .. $r));
  21. }
  22. sub is_chernick_number ($n) {
  23. foreach my $r (3 .. ilog2($n)) {
  24. return 0 if (prod(chernick_carmichael_factors(1, $r)) > $n);
  25. my $k = bsearch(1, iroot($n, $r), sub {
  26. prod(chernick_carmichael_factors($_, $r)) <=> $n;
  27. });
  28. if (defined($k)) {
  29. if (all { is_prob_prime($_) } chernick_carmichael_factors($k, $r)) {
  30. return [$r, $k];
  31. }
  32. }
  33. }
  34. return 0;
  35. }
  36. sub is_chernick_carmichael_number ($n) {
  37. if (my $indices = is_chernick_number($n)) {
  38. my ($r, $k) = @$indices;
  39. is_div($k, Math::AnyNum->new(2)**($r-4)) || return 0;
  40. return $indices;
  41. }
  42. return 0;
  43. }
  44. while (defined(my $n = <DATA>)) {
  45. $n =~ /\S/ or do { say ''; next };
  46. $n = Math::AnyNum->new($n);
  47. if (my $indices = is_chernick_number($n)) {
  48. my ($r, $k) = @$indices;
  49. say "C($r, $k) = $n" . (is_chernick_carmichael_number($n) ? '' : ' -- not a Carmichael number');
  50. }
  51. else {
  52. say "Not a Chernick-Carmichael number: $n";
  53. }
  54. }
  55. __DATA__
  56. 8325544586081174440728309072452661246289
  57. 1486602098904402652768057938393756060862115780408050129
  58. 3378179316469672624194241840042044950902156938854178152235606615241
  59. 499363105138762800665090830700779256789861194424677603719907844311565991734904219234049
  60. 1052541934726120302251454117065809600311128515412938768050107822597914636735491079562159895572772335029969
  61. 179888061095822220624012979873
  62. 63295903488856146099776074891976628857941
  63. 1724903525088632276776203991973751571437217198753
  64. 125987992642689799129021757759222604492631818017403553
  65. 74630998863011672833530378836051056508973606035192155974373
  66. 150807169001103453136788769176330405141656863663445656308543366854744067292801145941
  67. 21481148526108486207494916467772828869885661326738699922267375224852562302202790454088898856458273
  68. 521635331852681575100906881
  69. 115062400756082746082903913434881
  70. 328163039680360319939589778453584981903661
  71. 11870677991315757722817424115344135399200189518509
  72. 694757711287970946444438020864958912321095838203403981194280844652135041
  73. 222047766292417414109702829403660230521393563058846142752440148661965564062512001
  74. 2149862240504463136613099818734059855038070454228745908492682225005023324481983560300180977379301646829
  75. 8708697287275863064616447198348134859079135616902774104816953554105827536430199092250104748403143942843541581649
  76. 837766669080429652091578576905732301415513036087717526534117797730213142822067681852966424142891732971385451048036269
  77. 261398323061911176816691559756701
  78. 3783580131711518790634677710442261470580569797344541
  79. 435371627429039040724001132527124473123288702163349741876813423106621
  80. 14719770617180585920139917829493719272506560558845969856660560241654606362030081
  81. 8639174282669715206025361687559030161351650277392264712967444363592650828493196768893181
  82. 5626560312723043583857755308221019825156276365042073078860543702210734827773374603314058575101
  83. 24556868549786120178074590558386520603888321
  84. 6039952244643618043250948311869286217356083814166356276064323543587107521
  85. 67237835600056002507521755422513656134639570320064261052894337496662546902793661
  86. 9812486963666228314195838164491424691687915196563926066688165613493816842244920774774301
  87. 16734371894003494165203863331927626808333173646940855138811711887045893525137741919908066470621