from math import log, log1p def n_naive(p,H): return max(2,(2 * H * log(1/(1-p)))**.5) def n_clever(p,H): return max(2,(2 * H * -log1p(-p))**.5) def dotable(f): bb = (16, 32, 64, 128, 256, 384, 512) pp = (1e-18, 1e-15, 1e-12, 1e-9, 1e-6, .001) pt = "1e-18 1e-15 1e-12 1e-9 1e-6 .1%".split() print(" " + " ".join(f"{p:>8}" for p in pt)) for b in bb: print(end=f"{b:>3}") for p in pp: print(end=f" {f(p,2**b):8.3g}") print() print("Naive") dotable(n_naive) print() print("With log1p") dotable(n_clever)