code: def logn2(n, p):
      
      with precision(p):
          extra = 10
          while True:
              with precision(p+extra):
                  # use extra precision for intermediate step
                  log2upper = log2(n, RoundTowardPositive)
                  log2lower = log2(n, RoundTowardNegative)
  
              lower = div(1, log2upper, RoundTowardNegative)
              upper = div(1, log2lower, RoundTowardPositive)
  
              # if lower and upper are adjacent (or equal) we're done
              if next_up(lower) == upper:
                  return (Fraction(*lower.as_integer_ratio()),
                          Fraction(*upper.as_integer_ratio()))
  
              # otherwise, increase the precision and try again
              extra += 10
docs: Best p-bit lower and upper bounds for log(2)/log(n), as Fractions.