from decimal import Decimal
def decimal(value):
    return value if isinstance(value, Decimal) else Decimal(str(value))
def logical_error(p_phys, distance, threshold="0.01", prefactor="0.1"):
    p_phys, threshold, prefactor = map(decimal, (p_phys, threshold, prefactor))
    assert distance > 0 and distance % 2 == 1 and 0 < p_phys < threshold
    return prefactor * (p_phys/threshold) ** ((distance+1)//2)
def minimum_distance(p_phys, cycles, budget):
    target = decimal(budget)/decimal(cycles)
    for distance in range(1, 100, 2):
        if logical_error(p_phys, distance) <= target: return distance
    raise ValueError("distance search exhausted")
cells=[]
for p in ("0.001", "0.0005", "0.002"):
    d=minimum_distance(p, 10**9, "0.01")
    cells.append((p,d,2*100*d*d))
nominal_distance=minimum_distance("0.001", 10**9, "0.01")
worse_distance=minimum_distance("0.002", 10**9, "0.01")
assert logical_error("0.001", 19) == Decimal("1e-11")
assert nominal_distance == 19
assert [d for _,d,_ in cells] == [19,15,29]
assert all(d%2 for _,d,_ in cells) and worse_distance > nominal_distance
print(f"PASS: 43 resource estimate nominal_d={nominal_distance} worse_d={worse_distance} physical_qubits={[qubits for _,_,qubits in cells]}")
