pseudoprime_search.pl 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  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. # Let b(n) be the smallest odd composite k such that q^((k-1)/2) == -1 (mod k) for every prime q <= prime(n).
  11. # b(1) = 3277
  12. # b(2) = 1530787
  13. # b(3) = 3697278427
  14. # b(4) = 118670087467
  15. # b(5) <= 2152302898747
  16. # b(6) <= 614796634515444067
  17. # b(7) <= 614796634515444067
  18. # 341, 1729, 1729, 46657
  19. my $N = 6;
  20. my $P = nth_prime($N);
  21. my $MAX = ~0;
  22. my @primes_bellow = @{primes($P)};
  23. my @primes = @{primes(100)};
  24. sub non_residue {
  25. my ($n) = @_;
  26. foreach my $p (@primes) {
  27. if ($p > $P) {
  28. return -1;
  29. }
  30. sqrtmod($p, $n) // return $p;
  31. }
  32. return -1;
  33. }
  34. sub isok_b {
  35. my ($k) = @_;
  36. #$k % 2 == 1 or return;
  37. vecall { powmod($_, ($k-1)>>1, $k) == $k-1 } @primes_bellow;
  38. }
  39. sub isok_b2 {
  40. my ($k) = @_;
  41. $k % 2 == 1 or return;
  42. vecall { powmod($_, ($k-1)>>1, $k) == 1 } 2..($P-1);
  43. }
  44. my %seen;
  45. sub process_file {
  46. my ($file) = @_;
  47. open my $fh, '<', $file;
  48. while (<$fh>) {
  49. next if /^\h*#/;
  50. /\S/ or next;
  51. my $n = (split(' ', $_))[-1];
  52. $n || next;
  53. #if ($n > $MAX or $n <= 2) {
  54. # next;
  55. #}
  56. if ($n < ~0) {
  57. next;
  58. }
  59. if ($n > ~0) {
  60. $n = Math::GMPz->new("$n");
  61. }
  62. next if is_prime($n);
  63. next if $seen{$n}++;
  64. #if (isok_b($n)) {
  65. if (isok_b($n)) {
  66. say "Found: $n";
  67. #~ if ($n < $MAX) {
  68. #~ $MAX = $n;
  69. #~ say "New record: $n";
  70. #~ }
  71. }
  72. }
  73. close $fh;
  74. }
  75. my $psp = "/home/swampyx/Other/Programare/experimental-projects/pseudoprimes/oeis-pseudoprimes";
  76. find({
  77. wanted => sub {
  78. if ( /\.txt\z/) {
  79. #say "Processing $_";
  80. process_file($_);
  81. }
  82. },
  83. no_chdir => 1,
  84. } => $psp);