lucas-carmichael_lcm_is_term_cached.pl 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. #!/usr/bin/perl
  2. # Generate new Lucas-Carmichael numbers of the form lcm(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. my $np1 = Math::GMPz->new($n) + 1;
  21. return if not vecall { Math::GMPz::Rmpz_divisible_p($np1, Math::GMPz->new($_) + 1) } @$factors;
  22. scalar(uniq(@$factors)) == scalar(@$factors);
  23. }
  24. my @c = grep { (split(' ', $lucas_carmichael->{$_}))[-1] <= 1e3 } keys %$lucas_carmichael;
  25. #~ my @c = grep { (split(' ', $lucas_carmichael->{$_}))[0] > 1e9 } keys %$lucas_carmichael;
  26. #~ my @c = grep { (split(' ', $lucas_carmichael->{$_}))[1] <= 11 } keys %$lucas_carmichael;
  27. say "# ", scalar @c;
  28. say "# ", binomial(scalar(@c), 2);
  29. #~ exit;
  30. forcomb {
  31. my $c = Math::Prime::Util::GMP::lcm(@c[@_]);
  32. #~ my $c = Math::Prime::Util::GMP::gcd(@c[@_]);
  33. #if ($c > 1e12 and not exists $lucas_carmichael->{$c} and is_lucas_carmichael($c, [factor($c)])) { # for gcd
  34. if (not exists $lucas_carmichael->{$c}
  35. and is_lucas_carmichael($c, [uniq(map { split(' ', $lucas_carmichael->{$_}) } @c[@_])])) { # for lcm
  36. say $c;
  37. $lucas_carmichael->{$c} = 1;
  38. }
  39. }
  40. scalar(@c), 2;