def f(n, p, N=10**18):
if N == 1:
return n
round_keys = [prf_under_n(N, p, r) for r in range(7 * math.ceil(math.log(N, 2)))]
for r, K in enumerate(round_keys):
n2 = (K - n) % N
if prf_coinflip(max(n, n2), p, r):
n = n2
if n < N // 2:
return f(n, p, N // 2)
return n