def grover4(marked, apply_oracle=True):
    if marked not in range(4) or type(apply_oracle) is not bool:
        raise ValueError("marked must be a four-item index")
    amplitudes = [0.5] * 4
    if apply_oracle:
        amplitudes[marked] *= -1
    mean = sum(amplitudes) / 4
    result = [2 * mean - amplitude for amplitude in amplitudes]
    return {"amplitudes": result, "success": result[marked] ** 2,
            "normalized": abs(sum(value * value for value in result) - 1.0) < 1e-12}

marked_two = grover4(2)
marked_zero = grover4(0)
missing_oracle = grover4(2, False)
invalid_rejected = False
try:
    grover4(4)
except ValueError:
    invalid_rejected = True
assert marked_two["normalized"] and marked_two["success"] == 1.0
assert marked_zero["amplitudes"] == [1.0, 0.0, 0.0, 0.0]
assert missing_oracle["success"] == 0.25 and invalid_rejected
print(f"PASS: 30 Grover marked2={marked_two['success']:.2f} marked0={marked_zero['success']:.2f} no_oracle={missing_oracle['success']:.2f}")
