codexhelstrom-zero-plus-measurement.py
helstrom-zero-plus-measurement.py
"""Original Born-probability comparison of Z and Helstrom measurements.
Tested with Python 3.14.4, NumPy 2.3.5, Matplotlib 3.10.7+dfsg1.
Run from _media; writes the matching opaque white PNG basename to cwd.
"""
from pathlib import Path
import matplotlib
matplotlib.use("Agg")
import matplotlib.pyplot as plt
import numpy as np
def main():
plt.rcParams.update({"font.size": 11, "figure.facecolor": "white",
"axes.facecolor": "white", "savefig.facecolor": "white"})
zero = np.array([1., 0.])
plus = np.array([1., 1.]) / np.sqrt(2)
states = [np.outer(zero, zero), np.outer(plus, plus)]
eigenvalues, eigenvectors = np.linalg.eigh(states[0] - states[1])
positive = eigenvectors[:, eigenvalues > 0]
p_positive = positive @ positive.T
measurements = [[states[0], np.eye(2) - states[0]],
[p_positive, np.eye(2) - p_positive]]
probabilities = [np.array([[np.trace(effect @ state) for effect in effects]
for state in states]) for effects in measurements]
successes = [0.5 * (values[0, 0] + values[1, 1]) for values in probabilities]
gaps = [values[0, 0] - values[1, 0] for values in probabilities]
blue, green, gold = "#2367a0", "#188454", "#a36d08"
fig, axes = plt.subplots(1, 3, figsize=(10.6, 4.9), dpi=120,
gridspec_kw={"width_ratios": [1, 1, 0.85]})
labels = [["0\nGuess zero", "1\nGuess plus"],
["+\nGuess zero", "−\nGuess plus"]]
for idx, ax in enumerate(axes[:2]):
x = np.arange(2)
for state_idx, (color, label) in enumerate([(blue, r"Input $|0\rangle$"),
(green, r"Input $|+\rangle$")]):
bars = ax.bar(x + (state_idx - 0.5) * 0.34,
probabilities[idx][state_idx], width=0.32,
color=color, label=label)
ax.bar_label(bars, labels=[f"{v:.3f}" for v in probabilities[idx][state_idx]],
padding=4, fontsize=10)
ax.set_xticks(x, labels[idx])
ax.set_ylim(0, 1.15)
ax.set_yticks([0, 0.25, 0.5, 0.75, 1])
ax.set_title(["Z measurement", "Optimal Helstrom measurement"][idx],
fontsize=12, pad=12)
ax.set_xlabel(f"Outcome and decision\nEvent gap = TV = {gaps[idx]:.6f}",
labelpad=10, fontsize=10)
ax.grid(axis="y", alpha=0.18)
ax.set_axisbelow(True)
ax.spines[["top", "right"]].set_visible(False)
axes[0].set_ylabel("Conditional outcome probability")
bars = axes[2].bar([0, 1], successes, width=0.55, color=["#7c8791", gold])
axes[2].bar_label(bars, labels=[f"{v:.6f}" for v in successes], padding=5,
fontsize=10)
axes[2].set(ylim=(0, 1.15), title="Equal-prior success")
axes[2].set_xticks([0, 1], ["Z", "Helstrom"])
axes[2].set_yticks([0, 0.25, 0.5, 0.75, 1])
axes[2].axhline(0.5, color="#555555", ls=":", lw=1.2)
axes[2].text(0.5, 0.52, "Guessing: 0.5", ha="center", fontsize=10,
bbox={"facecolor": "white", "edgecolor": "none", "pad": 1})
axes[2].set_xlabel(f"Success gain: +{successes[1] - successes[0]:.6f}",
labelpad=10, fontsize=10)
axes[2].grid(axis="y", alpha=0.18)
axes[2].set_axisbelow(True)
axes[2].spines[["top", "right"]].set_visible(False)
fig.suptitle("Zero versus plus: the measurement basis changes distinguishability",
fontsize=15, y=0.97)
handles, legend_labels = axes[0].get_legend_handles_labels()
fig.legend(handles, legend_labels, loc="upper center", bbox_to_anchor=(0.37, 0.9),
ncol=2, frameon=False, fontsize=11)
fig.text(0.5, 0.03,
"For either input color, the two outcome probabilities sum to 1."
" Trials use separate copies.", ha="center", fontsize=10)
fig.subplots_adjust(left=0.065, right=0.985, bottom=0.25, top=0.73, wspace=0.38)
fig.savefig(Path.cwd() / Path(__file__).with_suffix(".png").name,
facecolor="white", transparent=False)
plt.close(fig)
if __name__ == "__main__":
main()