upper.pl 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  1. #!/usr/bin/perl
  2. # Daniel "Trizen" Șuteu
  3. # Date: 07 July 2019
  4. # https://github.com/trizen
  5. use 5.014;
  6. use strict;
  7. use ntheory qw(:all);
  8. use experimental qw(signatures);
  9. use Math::GMPz;
  10. prime_precalc(1e6);
  11. #use Math::AnyNum qw(:overload);
  12. sub f($n) {
  13. my $count = -1;
  14. while (is_semiprime($n) && !is_square($n)) {
  15. my ($x, $y) = factor($n);
  16. $n = ($y - $x);
  17. ++$count;
  18. }
  19. $count;
  20. }
  21. use Memoize qw(memoize);
  22. memoize('a');
  23. sub a($n) {
  24. if ($n == 0) {
  25. return 6;
  26. }
  27. if ($n <= 1) {
  28. #return [ 6, 34, 82, 226, 687, 4786, 14367, 28738, 373763, 21408927]->[$n];
  29. #my $k = 2519240627,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,;
  30. #return $k * ($k + Math::GMPz->new("7136306"));
  31. return Math::GMPz->new(2519240627);
  32. #return 26;
  33. #return 79139915
  34. #return Math::AnyNum->new("79139915");
  35. }
  36. #if ($n <= ) {
  37. # return 6
  38. #}
  39. my $t = a($n - 1);
  40. my $res;
  41. #~ foreach my $mul(10000..20000) {
  42. #~ foreach my $rem(0..20) {
  43. #~ foreach my $add(1..100) {
  44. #~ $res = ($t + $add)*$mul + $rem;
  45. #~ if (f($res) >= $n) {
  46. #~ return $res;
  47. #~ }
  48. #~ }
  49. #~ }
  50. #~ }
  51. #my @collect;
  52. for (my $x = 2 ; $x <= 100000 ; $x = next_prime($x)) {
  53. my $r = $x * ($t + $x);
  54. if (is_semiprime($r) and f($r) >= $n) {
  55. for (my $y = 2 ; $y <= 100000 ; $y = next_prime($y)) {
  56. my $u = $y * ($r + $y);
  57. if (is_semiprime($u) and f($u) > $n) {
  58. return $r;
  59. }
  60. }
  61. }
  62. }
  63. #$collect[rand @collect]
  64. #if (f($r) >= $n) {
  65. # return $r;
  66. #}
  67. #~ while (1) {
  68. #~ for(my $x = 2; $x <= 100; $x = next_prime($x)) {
  69. #~ if (f($x * ($t+$x)) >= $n) {
  70. #~ $z = $x;
  71. #~ last;
  72. #~ }
  73. #~ }
  74. #~ last if defined($z);
  75. #~ $t = next_prime($t);
  76. #~ $t += 1;
  77. #~ }
  78. #$z * ($t+$z);
  79. #$res;
  80. }
  81. foreach my $k (0 .. 30) {
  82. say "a(", f(a($k)), ") <= ", a($k);
  83. }
  84. __END__
  85. for k in (0..12) {
  86. say "a(#{k}) <= #{a(k)}"
  87. }