prog.pl 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167
  1. #!/usr/bin/perl
  2. # Least number k > 1 such that A062354(k) is an n-th power, where A062354 is the product of sigma (A000203) and phi (A000010).
  3. # https://oeis.org/A306724
  4. # Found values:
  5. # 9043253832732
  6. # 9224036735340
  7. use 5.014;
  8. use Math::GMPz;
  9. use ntheory qw(:all is_power);
  10. my @smooth_primes;
  11. forprimes {
  12. if ($_ == 2) {
  13. #say $_;
  14. push @smooth_primes, $_;
  15. }
  16. else {
  17. if ((factor($_-1))[-1] <= 7 and (factor($_+1))[-1] <= 7) {
  18. #say $_;
  19. push @smooth_primes, $_;
  20. }
  21. }
  22. } 4801;
  23. push @smooth_primes, 8749;
  24. say "@smooth_primes";
  25. use 5.020;
  26. use warnings;
  27. use Math::GMPz;
  28. use experimental qw(signatures);
  29. use ntheory qw(divisors vecsum primes divisor_sum valuation);
  30. sub check_valuation($n, $p) {
  31. if ($p == 2) {
  32. return (valuation($n, $p) < 20);
  33. }
  34. #~ if ($p == 3) {
  35. #~ return ($n % ($p*$p*$p*$p*$p*$p) != 0);
  36. #~ }
  37. #if ($p == 7) {
  38. # return (valuation($n, $p) < 4);
  39. #}
  40. if ($p <= 7) {
  41. return valuation($n, $p) < 3;
  42. }
  43. #if ($p <= 11) {
  44. # return (valuation($n, $p) < 3);
  45. #}
  46. ($n % $p) != 0;
  47. #($n % ($p*$p)) != 0;
  48. }
  49. sub hamming_numbers ($limit, $primes) {
  50. my @h = (1);
  51. foreach my $p (@$primes) {
  52. say "Prime: $p";
  53. foreach my $n (@h) {
  54. if ($n * $p <= $limit and check_valuation($n, $p)) {
  55. push @h, $n * $p;
  56. }
  57. }
  58. }
  59. return \@h;
  60. }
  61. sub isok {
  62. my ($n) = @_;
  63. my $t = Math::GMPz->new(divisor_sum($n)) * Math::GMPz->new(euler_phi($n));
  64. is_power($t);
  65. }
  66. my $h = hamming_numbers(10**13, \@smooth_primes);
  67. say "Found: ", scalar(@$h), " terms";
  68. my @hello;
  69. my %table;
  70. foreach my $n(@$h) {
  71. my $p = isok($n);
  72. if ($p >= 6) {
  73. say "a($p) = $n -> ", join(' * ', map{"$_->[0]^$_->[1]"}factor_exp($n));
  74. #@push @hello, $n;
  75. push @{$table{$p}}, $n;
  76. }
  77. #foreach my $k(0..30) {
  78. # my $t = ($n * 2**$k);
  79. # if (isok($t)) {
  80. # say $t;
  81. # }
  82. #}
  83. }
  84. # 498892319051
  85. #say vecmin(@hello);#
  86. # a(9) <= 14467877252479.
  87. say '';
  88. foreach my $k(sort {$a <=>$b}keys %table) {
  89. say "a($k) <= ", vecmin(@{$table{$k}});
  90. }
  91. __END__
  92. a(6) <= 592922491
  93. a(7) <= 17194752239
  94. a(8) <= 498892319051
  95. a(8) <= 498892319051
  96. a(9) <= 14467877252479
  97. a(10) <= 421652049419104
  98. a(8) <= 498892319051
  99. a(9) <= 14467877252479
  100. a(10) <= 421652049419104
  101. a(11) <= 12227909433154016
  102. a(8) <= 498892319051
  103. a(9) <= 14467877252479
  104. a(10) <= 421652049419104
  105. a(11) <= 12227909433154016
  106. sub foo {
  107. my ($n) = @_;
  108. my $t = Math::GMPz::Rmpz_init();
  109. foreach my $k(2..1e12) {
  110. Math::GMPz::Rmpz_set_ui($t, divisor_sum($k));
  111. Math::GMPz::Rmpz_mul_ui($t, $t, euler_phi($k));
  112. if (Math::GMPz::Rmpz_perfect_power_p($t) and is_power($t, $n)) {
  113. return $k;
  114. }
  115. #if (divisor_sum($k) *
  116. }
  117. }
  118. foreach my $n(1..10) {
  119. say "a($n) = ", foo($n);
  120. }