lucas-carmichael_gcd_is_term_cached.pl 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. #!/usr/bin/perl
  2. # Generate new Lucas-Carmichael numbers of the form gcd(a,b),
  3. # where a,b are both B-smooth Lucas-Carmichael numbers, for some small B.
  4. use 5.020;
  5. use strict;
  6. use warnings;
  7. use Storable;
  8. use Math::GMPz;
  9. use ntheory qw(:all);
  10. use Math::Prime::Util::GMP;
  11. use experimental qw(signatures);
  12. use List::Util qw(uniq);
  13. my $lucas_carmichael_file = "cache/factors-lucas-carmichael.storable";
  14. my $lucas_carmichael = retrieve($lucas_carmichael_file);
  15. my %table;
  16. sub my_lucas_carmichael_lambda ($factors) {
  17. Math::Prime::Util::GMP::lcm(map { Math::Prime::Util::GMP::addint($_, 1) } @$factors);
  18. }
  19. sub is_lucas_carmichael ($n, $factors) {
  20. scalar(@$factors) >= 3 or return;
  21. my $np1 = Math::GMPz->new($n) + 1;
  22. return if not vecall { Math::GMPz::Rmpz_divisible_p($np1, Math::GMPz->new($_) + 1) } @$factors;
  23. scalar(uniq(@$factors)) == scalar(@$factors);
  24. }
  25. my $min = 1e12;
  26. my @c = grep { (split(' ', $lucas_carmichael->{$_}))[-1] <= 1e3 } keys %$lucas_carmichael;
  27. #~ my @c = grep { (split(' ', $lucas_carmichael->{$_}))[0] > 1e9 } keys %$lucas_carmichael;
  28. #~ my @c = grep { (split(' ', $lucas_carmichael->{$_}))[1] <= 11 } keys %$lucas_carmichael;
  29. say "# ", scalar @c;
  30. say "# ", binomial(scalar(@c), 2);
  31. #~ exit;
  32. forcomb {
  33. my $c = Math::Prime::Util::GMP::gcd(@c[@_]);
  34. if ($c > $min and not exists $lucas_carmichael->{$c} and is_lucas_carmichael($c, [factor($c)])) {
  35. say $c;
  36. $lucas_carmichael->{$c} = 1;
  37. }
  38. }
  39. scalar(@c), 2;