factors_of_mersenne.pl 856 B

123456789101112131415161718192021222324252627282930313233343536
  1. #!/usr/bin/perl
  2. # Try to find factors of a Mersenne number.
  3. use 5.036;
  4. use Math::GMPz;
  5. use ntheory qw(forprimes foroddcomposites);
  6. use Math::Prime::Util::GMP qw(:all);
  7. eval { require GDBM_File };
  8. my $cache_db = "cache/factors.db";
  9. dbmopen(my %db, $cache_db, 0444)
  10. or die "Can't create/access database <<$cache_db>>: $!";
  11. my $n = Math::GMPz::Rmpz_init();
  12. while (my ($key, $value) = each %db) {
  13. my @factors = split(' ', $value);
  14. $factors[-1] < ~0 and next;
  15. Math::Prime::Util::GMP::is_pseudoprime($key, 2) || next;
  16. foreach my $f (@factors) {
  17. if ($f > ~0 and length($f) < 70) {
  18. my $order = znorder(2, $f);
  19. if ($order > 1e6 and $order < 1e9 and is_prime($order)) {
  20. #say "M$order has a factor: $f";
  21. say "2^$order - 1 = $f"
  22. }
  23. }
  24. }
  25. }