codex/past-exam-of-the-mathematics-course-of-the-university-of-cambridge/2004/iii/paper-32-capacities.py

past-exam-of-the-mathematics-course-of-the-university-of-cambridge/2004/iii/paper-32-capacities.py
"""Python 3.14; numpy 2.3.5 / matplotlib 3.10.7. Emit opaque PNG to caller CWD.
MPLCONFIGDIR remains under caller control. Both noise conventions are labelled.
"""
from pathlib import Path
import numpy as np
import matplotlib
matplotlib.use('Agg')
import matplotlib.pyplot as plt

def xlogx(x):
 x=np.asarray(x,dtype=float);r=np.zeros_like(x);m=x>0;r[m]=x[m]*np.log2(x[m]);return r
def capacities(p):
 p=np.asarray(p,dtype=float)
 z=2*p/3
 c=1+xlogx(z)+xlogx(1-z)
 ce=2+xlogx(1-p)+3*xlogx(p/3)
 return np.maximum(c,0),np.maximum(ce,0)
fig,axes=plt.subplots(1,2,figsize=(10,4.3),dpi=135,facecolor='white',sharey=True)
for ax in axes:
 ax.set_facecolor('white');ax.grid(alpha=.22);ax.set_ylim(0,2.08);ax.set_xlim(0,1)
p=np.linspace(0,1,751);c,ce=capacities(p)
axes[0].plot(p,c,lw=2.2,label=r'$C_{\rm prod}$',color='#2459a6');axes[0].plot(p,ce,lw=2.2,label=r'$C_E$',color='#b44b12')
axes[0].axvline(.75,color='#666666',ls='--',lw=1)
axes[0].annotate('Both vanish\nat $p=3/4$',xy=(.75,0),xytext=(.52,.76),arrowprops={'arrowstyle':'->','color':'#555555'},fontsize=11)
axes[0].set_xlabel('Total nonidentity Pauli-error probability $p$')
axes[0].set_ylabel('Classical capacity (bits per channel use)')
axes[0].set_title(r'$(1-p)\rho+(p/3)\sum_j\sigma_j\rho\sigma_j$')
q=np.linspace(0,1,751);c,ce=capacities(.75*q)
axes[1].plot(q,c,lw=2.2,label=r'$C_{\rm prod}$',color='#2459a6');axes[1].plot(q,ce,lw=2.2,label=r'$C_E$',color='#b44b12')
axes[1].set_xlabel('Replacement probability $q$ ($p=3q/4$)')
axes[1].set_title(r'$(1-q)\rho+qI/2$')
axes[1].text(.47,1.3,r'$C_E/C_{\rm prod}\longrightarrow 3$'+'\n'+r'as $q\longrightarrow1$',ha='center',fontsize=13)
for ax in axes:ax.legend(loc='upper right',framealpha=.95)
fig.tight_layout(pad=1.2)
fig.savefig(Path(__file__).with_suffix('.png').name,facecolor='white',transparent=False)
plt.close(fig)