least_k_such_that_k_times_k-th_prime_is_greater_than_10_to_the_n.pl 1.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. #!/usr/bin/perl
  2. # Daniel "Trizen" Șuteu
  3. # Date: 26 February 2019
  4. # https://github.com/trizen
  5. # Given a positive integer n, find the smallest integer `k` such that `k*prime(k) > 10^n`.
  6. # See also:
  7. # https://oeis.org/A090977 -- Least k such that k*prime(k) > 10^n.
  8. use 5.010;
  9. use strict;
  10. use warnings;
  11. use Math::AnyNum qw(:overload bsearch_ge);
  12. use ntheory qw(nth_prime nth_prime_lower nth_prime_upper);
  13. sub a {
  14. my ($n) = @_;
  15. my $lim = 10**$n;
  16. my $min_approx = int(sqrt($lim / log($lim+1)));
  17. my $max_approx = 2*$min_approx;
  18. my $min = bsearch_ge($min_approx, $max_approx, sub {
  19. nth_prime_upper($_) * $_ <=> $lim
  20. });
  21. my $max = bsearch_ge($min, $max_approx, sub {
  22. nth_prime_lower($_) * $_ <=> $lim
  23. });
  24. bsearch_ge($min, $max, sub {
  25. nth_prime($_) * $_ <=> $lim
  26. });
  27. }
  28. foreach my $n(0..22) {
  29. say "a($n) = ", a($n);
  30. }
  31. __END__
  32. a(0) = 1
  33. a(1) = 3
  34. a(2) = 7
  35. a(3) = 17
  36. a(4) = 48
  37. a(5) = 134
  38. a(6) = 382
  39. a(7) = 1115
  40. a(8) = 3287
  41. a(9) = 9786
  42. a(10) = 29296
  43. a(11) = 88181
  44. a(12) = 266694
  45. a(13) = 809599
  46. a(14) = 2465574
  47. a(15) = 7528976
  48. a(16) = 23045352
  49. a(17) = 70684657
  50. a(18) = 217196605
  51. a(19) = 668461874
  52. a(20) = 2060257099
  53. a(21) = 6358076827
  54. a(22) = 19644205359