# Educational example from Sarovi journal. Python 3; no extra dependencies.
def posterior(prior, sensitivity, false_positive):
    if not all(0 <= p <= 1 for p in (prior, sensitivity, false_positive)):
        raise ValueError("probabilities must be between 0 and 1")
    true_alert = prior * sensitivity
    total_alert = true_alert + (1-prior) * false_positive
    if total_alert == 0:
        raise ValueError("conditioning event has zero probability")
    return true_alert / total_alert

assert abs(posterior(.02, .9, .05) - 18/67) < 1e-12
assert abs(posterior(.20, .9, .05) - 180/220) < 1e-12
print(posterior(.02, .9, .05))
