non-residue_fermat_records_below_2^64.pl 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. #!/usr/bin/perl
  2. # a(n) is the least Fermat pseudoprime k to base 2, such that the smallest quadratic non-residue of k is prime(n).
  3. # a(n) is the least composite number k such that 2^(k-1) == 1 (mod k) and A020649(k) = prime(n).
  4. # See also:
  5. # https://oeis.org/A020649
  6. # https://oeis.org/A307809
  7. use 5.020;
  8. use ntheory qw(:all);
  9. use experimental qw(signatures);
  10. use Math::GMPz;
  11. use IO::Uncompress::UnZstd;
  12. my $file = "/home/swampyx/Other/Programare/experimental-projects/pseudoprimes/psps-below-2-to-64.txt.zst";
  13. my $z = IO::Uncompress::UnZstd->new($file);
  14. my @primes = @{primes(100)};
  15. sub least_nonresidue_odd ($n) { # for odd n
  16. my @factors = map { $_->[0] } factor_exp($n);
  17. foreach my $p (@primes) {
  18. (vecall { kronecker($p, $_) == 1 } @factors) || return $p;
  19. }
  20. return 101;
  21. }
  22. sub least_nonresidue_sqrtmod ($n) { # for any n
  23. foreach my $p (@primes) {
  24. sqrtmod($p, $n) // return $p;
  25. }
  26. return 101;
  27. }
  28. my %table;
  29. while (1) {
  30. chomp(my $n = $z->getline // last);
  31. #next if ($n < 111893049583818721);
  32. my $q;
  33. if ($n < 111893049583818721) {
  34. $q = least_nonresidue_sqrtmod($n);
  35. }
  36. else {
  37. $q = least_nonresidue_odd($n);
  38. }
  39. if (exists $table{$q}) {
  40. next if ($table{$q} < $n);
  41. }
  42. $table{$q} = $n;
  43. printf("a(%2d) <= %s\n", prime_count($q), $n);
  44. }
  45. say "\nFinal results:";
  46. foreach my $k (sort { $a <=> $b } keys %table) {
  47. my $n = prime_count($k);
  48. printf("a(%2d) = %s\n", $n, $table{$k});
  49. }
  50. __END__
  51. a(1) <= 341
  52. a(2) <= 2047
  53. a(3) <= 18721
  54. a(4) <= 318361
  55. a(5) <= 2163001
  56. a(6) <= 17208601
  57. a(7) <= 6147353521
  58. a(8) <= 18441949681
  59. a(9) <= 24155301361
  60. a(10) <= 2945030568769
  61. a(11) <= 22415236323481
  62. a(12) <= 6328140564467401
  63. a(13) <= 45669044917576081
  64. a(14) <= 111893049583818721