from_psp.pl 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. #!/usr/bin/perl
  2. use 5.020;
  3. use ntheory qw(:all);
  4. use IO::Uncompress::Bunzip2;
  5. my $z = IO::Uncompress::Bunzip2->new("psps-below-2-to-64.txt.bz2");
  6. my %fermat;
  7. my %carmichael;
  8. while (defined(my $line = $z->getline())) {
  9. if ($. % 100_000 == 0) {
  10. say "[$. of 118968378] Processing: ", sprintf('%.2f', ($. / 118968378) * 100), "% done";
  11. }
  12. chomp($line);
  13. my @f = factor($line);
  14. my $p = (factor($f[0] - 1))[-1];
  15. next if ($p > 104729);
  16. if (not exists $fermat{$p}) {
  17. if ((vecall { ($_-1) % $p == 0 } @f) and (vecall { (factor($_ - 1))[-1] == $p } @f)) {
  18. $fermat{$p} = $line;
  19. }
  20. }
  21. if (not exists $carmichael{$p} and scalar(@f) >= 3 and (vecall { ($_-1) % $p == 0 and ($line - 1) % ($_ - 1) == 0 } @f) and is_carmichael($line)) {
  22. if (vecall { (factor($_ - 1))[-1] == $p } @f) {
  23. $carmichael{$p} = $line;
  24. }
  25. }
  26. last if ($. >= 300000);
  27. }
  28. open my $all_fer, '>', 'all_fermat.txt';
  29. open my $all_car, '>', 'all_carmichael.txt';
  30. open my $nogap_fer, '>', 'nogaps_fermat.txt';
  31. open my $nogap_car, '>', 'nogaps_carmichael.txt';
  32. foreach my $p (sort { $a <=> $b } keys %fermat) {
  33. my $n = prime_count($p);
  34. say {$all_fer} "$n $fermat{$p}";
  35. }
  36. foreach my $p (sort { $a <=> $b } keys %carmichael) {
  37. my $n = prime_count($p);
  38. say {$all_car} "$n $carmichael{$p}";
  39. }
  40. {
  41. my $prev = 0;
  42. foreach my $p (sort { $a <=> $b } keys %fermat) {
  43. my $n = prime_count($p);
  44. $n == $prev + 1 or last;
  45. say {$nogap_fer} "$n $fermat{$p}";
  46. $prev = $n;
  47. }
  48. }
  49. {
  50. my $prev = 1;
  51. foreach my $p (sort { $a <=> $b } keys %carmichael) {
  52. my $n = prime_count($p);
  53. $n == $prev + 1 or last;
  54. say {$nogap_car} "$n $carmichael{$p}";
  55. $prev = $n;
  56. }
  57. }
  58. close $all_car;
  59. close $all_fer;
  60. close $nogap_car;
  61. close $nogap_fer;