pseudoprime_search.pl 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  1. #!/usr/bin/perl
  2. use 5.020;
  3. use warnings;
  4. use strict;
  5. use ntheory qw(:all);
  6. use experimental qw(signatures);
  7. use List::Util qw(uniqnum);
  8. use File::Find qw(find);
  9. use Math::GMPz;
  10. # a(5) <= 5113747913401
  11. # a(6) <= 30990302851201
  12. #~ a(5) <= 32203213602841
  13. #~ a(6) <= 323346556958041
  14. #~ a(7) <= 2528509579568281
  15. #~ a(8) <= 5189206896360728641
  16. #~ a(9) <= 12155831039329417441
  17. my $N = 9;
  18. my $P = nth_prime($N);
  19. my $MAX = 323346556958041;
  20. # a(5) <= 5113747913401
  21. # a(6) <= 30990302851201
  22. # a(7) <=
  23. my @primes_bellow = @{primes($P-1)};
  24. my @primes = @{primes(100)};
  25. sub non_residue {
  26. my ($n) = @_;
  27. foreach my $p (@primes) {
  28. if ($p > $P) {
  29. return -1;
  30. }
  31. sqrtmod($p, $n) // return $p;
  32. }
  33. return -1;
  34. }
  35. sub isok_a {
  36. my ($k) = @_;
  37. if (powmod($P, ($k-1)>>1, $k) == $k-1) {
  38. return vecall { powmod($_, ($k-1)>>1, $k) == 1 } 2..($P-1);
  39. }
  40. return;
  41. }
  42. sub isok_b {
  43. my ($k) = @_;
  44. if (powmod($P, ($k-1)>>1, $k) == 1) {
  45. return vecall { powmod($_, ($k-1)>>1, $k) == $k-1 } @primes_bellow;
  46. }
  47. return;
  48. }
  49. my %seen;
  50. sub process_file {
  51. my ($file) = @_;
  52. open my $fh, '<', $file;
  53. while (<$fh>) {
  54. next if /^\h*#/;
  55. /\S/ or next;
  56. my $n = (split(' ', $_))[-1];
  57. $n || next;
  58. if ($n > $MAX) {
  59. next;
  60. }
  61. if ($n > ~0) {
  62. $n = Math::GMPz->new("$n");
  63. }
  64. next if is_prime($n);
  65. next if $seen{$n}++;
  66. #if (isok_b($n)) {
  67. if (isok_a($n)) {
  68. say $n;
  69. if ($n < $MAX) {
  70. $MAX = $n;
  71. say "New record: $n";
  72. }
  73. }
  74. }
  75. }
  76. my $psp = "/home/swampyx/Other/Programare/experimental-projects/pseudoprimes/oeis-pseudoprimes";
  77. find({
  78. wanted => sub {
  79. if ( /\.txt\z/) {
  80. process_file($_);
  81. }
  82. },
  83. no_chdir => 1,
  84. } => $psp);