binary_search.sf 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149
  1. #!/usr/bin/ruby
  2. # Numbers k such that the decimal expansion of the k-th harmonic number starts with the digits of k, in the same order.
  3. # https://oeis.org/A337904
  4. # Terms:
  5. # 1, 43, 714, 715, 9763, 122968, 122969, 1478366, 17239955
  6. # Larger terms:
  7. # 196746419, 2209316467, 24499118645, 268950072605, 2928264676792, 31663398162514, 340383084842938, 3640820101879826, 38773735148047406, 38773735148047407, 411354473689969709, 4349378018952283972, 45849102972919835109, 482017272880546223321, 5055191842047792613562, 52899904144628296988725, 552458815055031196782525, 5759002212954326201649741, 59932476432458393252342721, 622733769885549555429595981, 6461284125481523641339765370, 66950973792848320411792499601, 692878680960562864969363384910, 7162360810346449261192969637028, 73958269462680913376461650794152, 762919205903660944920523210661377, 7862462356803215299533205007813806, 80956434902985402104622557703016977, 832874061781047994819672246576419514, 8561758460942363424315837377300688366, 87947013526805356793864093102783600499, 902757327901213687376081267798908754616, 9260377915106116852616564230637740582108, 94931186568893878451195580899916418846736, 972579864870501412683269238042780744028743, 9958420807622547975400738352360988337988344
  8. func isok(k) {
  9. k.harmreal.to_s.sub('.', '').first(k.len) == k.to_s
  10. }
  11. #~ [
  12. #~ 122969
  13. #~ 1478366
  14. #~ 17239955
  15. #~ 196746419
  16. #~ 2209316467
  17. #~ 24499118645
  18. #~ 268950072605
  19. #~ 2928264676792
  20. #~ 31663398162514
  21. #~ 340383084842938
  22. #~ 3640820101879826
  23. #~ 38773735148047407
  24. #~ 411354473689969709
  25. #~ 4349378018952283972
  26. #~ 45849102972919835109
  27. #~ 482017272880546223321
  28. #~ 5055191842047792613562
  29. #~ 52899904144628296988725
  30. #~ 552458815055031196782525
  31. #~ 5759002212954326201649741
  32. #~ 59932476432458393252342721
  33. #~ 622733769885549555429595981
  34. #~ 6461284125481523641339765370
  35. #~ 66950973792848320411792499601
  36. #~ 692878680960562864969363384910
  37. #~ 7162360810346449261192969637028
  38. #~ 73958269462680913376461650794152
  39. #~ 762919205903660944920523210661377
  40. #~ 7862462356803215299533205007813806
  41. #~ 80956434902985402104622557703016977
  42. #~ 832874061781047994819672246576419514
  43. #~ 8561758460942363424315837377300688366
  44. #~ 87947013526805356793864093102783600499
  45. #~ 902757327901213687376081267798908754616
  46. #~ 9260377915106116852616564230637740582108
  47. #~ 94931186568893878451195580899916418846736
  48. #~ 972579864870501412683269238042780744028743
  49. #~ 9958420807622547975400738352360988337988344
  50. #~ ].each{|n|
  51. #~ for j in (-100 .. 100) {
  52. #~ var k = n+j
  53. #~ if (isok(k)) {
  54. #~ say k
  55. #~ }
  56. #~ }
  57. #~ }
  58. #~ __END__
  59. # 196746419
  60. # 2209316467
  61. #say bsearch_le(196397502, 196910435, {|k|
  62. #~ say bsearch_le(2208893886,2213339062 , {|k|
  63. #~ (k / 10**8) <=> harmreal(k)
  64. #~ })
  65. #__END__
  66. var n = 1
  67. for k in (1..10000) {
  68. local Num!PREC = numify(4*(n + 10))
  69. # for n in (1000..2000) {
  70. if (harmreal(k * 10**n).to_s.begins_with(k.to_s)) {
  71. #say (k * 10**n)
  72. #say [k * 10**n, harmreal(k * 10**n) * 10**n, harmreal((k+1) * 10**n) * 10**n]
  73. var (min, max) = (harmreal(k * 10**n) * 10**n, harmreal((k+1) * 10**n) * 10**n)
  74. var v = bsearch_le(min, max, {|k|
  75. (k / 10**n) <=> harmreal(k)
  76. })
  77. var ok = false
  78. if (isok(v-1)) {
  79. say v-1
  80. ok = true
  81. }
  82. if (isok(v)) {
  83. say v
  84. ok = true
  85. }
  86. ++n if ok
  87. }
  88. # ++n
  89. # }
  90. }
  91. __END__
  92. say bsearch_min(196446850/2, 2*196446850, {|k|
  93. (k / 10**8) <=> harmreal(k)
  94. })
  95. __END__
  96. use 5.014;
  97. use Math::MPFR;
  98. my $f = Math::MPFR::Rmpfr_init2(66);
  99. my $t = Math::MPFR::Rmpfr_init2(66);
  100. Math::MPFR::Rmpfr_const_euler($t, 0);
  101. foreach my $k(1..1e9) {
  102. Math::MPFR::Rmpfr_set_ui($f, $k, 0);
  103. Math::MPFR::Rmpfr_digamma($f, $f, 0);
  104. Math::MPFR::Rmpfr_add($f, $f, $t, 0);
  105. my ($mantissa, $exponent) = Math::MPFR::Rmpfr_deref2($f, 10, length($k-1)+2, 0);
  106. if (substr($mantissa, 0, length($k-1)) eq ($k-1)) {
  107. say "$k -> ", $mantissa;
  108. say $k-1;
  109. }
  110. }
  111. __END__
  112. for k in (1..1e9) {
  113. if (k.harmreal.to_s.sub('.', '').first(k.len) == k.to_s) {
  114. print(k, ", ")
  115. }
  116. }