First power of 2 that has leading decimal digits of 12
func farey_approximations(r, callback) {
var (a1 = r.int, b1 = 1)
var (a2 = a1+1, b2 = 1)
loop {
var a3 = a1+a2
var b3 = b1+b2
if (a3 < r*b3) {
(a1, b1) = (a3, b3)
}
else {
(a2, b2) = (a3, b3)
}
callback(a3 / b3)
}
}
func p(L, nth) {
define ln2 = log(2)
define ln5 = log(5)
define ln10 = log(10)
var t = L.len-1
func isok(n) {
floor(exp(ln2*(n - floor((n*ln2)/ln10) + t) + ln5*(t - floor((n*ln2)/ln10)))) == L
}
var deltas = gather {
farey_approximations(ln2/ln10, {|r|
take(r.de) if (r.de.len == L.len)
break if (r.de.len > L.len)
})
}.sort.uniq
var c = 0
var k = (1..Inf -> first(isok))
loop {
return k if (++c == nth)
k += (deltas.first {|d| isok(k+d) } \\ die "error: #{k}")
}
}
var tests = [
[12, 1],
[12, 2],
[123, 45],
[123, 12345],
[123, 678910],
# extra
[1234, 10000],
[12345, 10000],
]
for a,b in (tests) {
say "p(#{a}, #{b}) = #{p(a,b)}"
}
Output:
p(12, 1) = 7
p(12, 2) = 80
p(123, 45) = 12710
p(123, 12345) = 3510491
p(123, 678910) = 193060223
p(1234, 10000) = 28417587
p(12345, 10000) = 284166722
Last updated