smooth_search.pl 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. #!/usr/bin/perl
  2. # Numbers k where phi(k) divides k - 3.
  3. # https://oeis.org/A350777
  4. # Known terms:
  5. # 1, 2, 3, 9, 195, 5187
  6. # Conjecture: 5187 is the largest term in this sequence.
  7. use 5.020;
  8. use warnings;
  9. use experimental qw(signatures);
  10. use Math::GMPz;
  11. use ntheory qw(:all);
  12. sub check_valuation ($n, $p) {
  13. if ($p == 2) {
  14. return valuation($n, $p) < 1000;
  15. }
  16. if ($p == 3) {
  17. return valuation($n, $p) < 1000;
  18. }
  19. if ($p == 5) {
  20. return valuation($n, $p) < 100;
  21. }
  22. if ($p == 7) {
  23. return valuation($n, $p) < 100;
  24. }
  25. ($n % $p) != 0;
  26. }
  27. sub smooth_numbers ($limit, $primes) {
  28. my @h = (Math::GMPz->new(1));
  29. foreach my $p (@$primes) {
  30. say "Prime: $p";
  31. foreach my $n (@h) {
  32. if ($n * $p <= $limit and check_valuation($n, $p)) {
  33. push @h, $n * $p;
  34. }
  35. }
  36. }
  37. return \@h;
  38. }
  39. my $h = smooth_numbers(Math::GMPz->new(10)**30, [2,3,5]);
  40. #my $h = smooth_numbers(~0, [2,3,5,7]);
  41. say "\nFound: ", scalar(@$h), " terms";
  42. my $multiple = 2;
  43. say "Searching with multiple = $multiple";
  44. foreach my $n (sort {$a <=> $b} @$h) {
  45. #~ foreach my $k (inverse_totient($n)) {
  46. #~ if (($k-3) % $n == 0) {
  47. #~ say $k;
  48. #~ }
  49. #~ }
  50. my $v = addint(mulint($multiple, $n), 3);
  51. if (euler_phi($v) == $n) {
  52. say $v;
  53. }
  54. }