Optimal Quantum Cloning

Finding the Channel That Maximizes Fidelity with Python

The no-cloning theorem says that no physical process can turn an unknown quantum state $|\psi\rangle$ into $|\psi\rangle\otimes|\psi\rangle$ exactly. It does not forbid approximate copies. If we accept imperfect copies, the natural question is how good they can be. This article answers that for a qubit by treating the cloner as a convex optimization problem over quantum channels, and then solving a concrete instance numerically.

1. The Problem

A $1\to 2$ cloning machine is a completely positive trace-preserving (CPTP) map

$$
\Lambda:\ \mathcal{L}(\mathbb{C}^2)\ \to\ \mathcal{L}(\mathbb{C}^2\otimes\mathbb{C}^2),
$$

taking one input qubit to two output qubits, $A$ and $B$. For a pure input $|\psi\rangle$, the single-copy fidelities are

$$
F_A(\psi)=\langle\psi|,\mathrm{Tr}_B,\Lambda(|\psi\rangle\langle\psi|),|\psi\rangle,\qquad
F_B(\psi)=\langle\psi|,\mathrm{Tr}_A,\Lambda(|\psi\rangle\langle\psi|),|\psi\rangle .
$$

We want a universal cloner that works equally well for every input state, so we maximize the average over the Haar measure on pure states:

$$
\bar F_\lambda(\Lambda)=\int d\psi,\Big[\lambda,F_A(\psi)+(1-\lambda),F_B(\psi)\Big],\qquad \lambda\in[0,1].
$$

The symmetric case $\lambda=\tfrac12$ is the classic Bužek–Hillery problem. Other values of $\lambda$ give asymmetric cloners, which trade quality of copy $A$ against copy $B$.

Known analytic answer (our benchmark)

For $\lambda=\tfrac12$ the optimum is

$$
F_{\mathrm{opt}}=\frac56\approx 0.8333,
$$

reached by the transformation

$$
|0\rangle\ \mapsto\ \sqrt{\tfrac23},|00\rangle|\uparrow\rangle+\sqrt{\tfrac13},|\Psi^+\rangle|\downarrow\rangle,\qquad
|\Psi^+\rangle=\tfrac{1}{\sqrt2}(|01\rangle+|10\rangle),
$$

together with its mirror image for $|1\rangle$. Each output qubit’s Bloch vector is shrunk by the factor $\eta=2F-1=\tfrac23$.

We will not hard-code this. We solve the optimization numerically and check that it rediscovers $5/6$, then map the whole asymmetric trade-off curve.

2. Turning the Problem into Linear Algebra

Stinespring form

Every channel $\Lambda$ can be written as an isometry $V:\mathbb{C}^2\to\mathbb{C}^2_A\otimes\mathbb{C}^2_B\otimes\mathbb{C}^{r}_E$ followed by a partial trace over the environment $E$:

$$
\Lambda(\rho)=\mathrm{Tr}_E!\left[V\rho V^\dagger\right],\qquad V^\dagger V=\mathbb{1}_2 .
$$

The Choi rank of a map from $\mathbb{C}^2$ to $\mathbb{C}^4$ is at most $8$, so $r=8$ covers every possible cloner.

Replacing the Haar integral by six states

With $P_\psi=|\psi\rangle\langle\psi|$, the fidelity is

$$
F_A(\psi)=\mathrm{Tr}!\left[\big(P_\psi\otimes\mathbb{1}_B\otimes\mathbb{1}_E\big),V P_\psi V^\dagger\right],
$$

which is a degree-2 polynomial in $P_\psi$. The six states at the vertices of the Bloch-sphere octahedron ($\pm x,\pm y,\pm z$) form a projective 2-design. The Haar average of any such polynomial therefore equals the plain average over these six states, exactly:

$$
\bar F_\lambda(V)=\frac16\sum_{s=1}^{6}\mathrm{Tr}!\left[V^\dagger Q_s V R_s\right],
$$

A fast fixed-point algorithm

Because $Q_s\succeq0$ and $R_s\succeq0$, the objective is a convex quadratic form in $V$. Maximizing it over the set of isometries ${V^\dagger V=\mathbb{1}}$ can be done by a power-iteration-like scheme. Define the gradient matrix

$$
G(V)=\sum_{s=1}^{6}Q_s,V,R_s,
$$

and update with the polar factor of $G$. If $G=U\Sigma W^\dagger$ is a thin singular value decomposition, then

$$
V_{n+1}=U,W^\dagger .
$$

This choice maximizes $\mathrm{Re},\mathrm{Tr}(G^\dagger V)$ over all isometries. Convexity guarantees

$$
\bar F_\lambda(V_{n+1})\ \ge\ \bar F_\lambda(V_n),
$$

so the objective rises monotonically. Each iteration costs a few microseconds. No semidefinite-programming solver is needed, which is also the speed-up for this problem: a generic SDP or gradient solver would take far longer for the 21-point trade-off sweep.

3. Reference Strategies

We compare the optimized cloner against two simple strategies.

CNOT cloner. It maps $\alpha|0\rangle+\beta|1\rangle\mapsto\alpha|00\rangle+\beta|11\rangle$ and is not universal. Its fidelity depends on the input state:

$$
F(\theta)=1-\tfrac12\sin^2\theta,\qquad \bar F=\tfrac23 .
$$

Measure-and-prepare. Optimal state estimation from one copy gives

$$
\bar F=\tfrac23 .
$$

4. Full Source Code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
import numpy as np
import matplotlib.pyplot as plt

plt.style.use("dark_background")
rng = np.random.default_rng(7)

# ------------------------------------------------------------
# 1. Dimensions
# ------------------------------------------------------------
R_ENV = 8 # environment dimension (covers every 1 -> 2 qubit channel)
DIM_OUT = 4 # two output qubits A and B
ROWS = DIM_OUT * R_ENV # row index of V is (a, b, e) -> (2a + b) * R_ENV + e
F_OPT = 5.0 / 6.0 # analytic optimum for the symmetric universal cloner

# ------------------------------------------------------------
# 2. Six octahedron states (an exact projective 2-design)
# ------------------------------------------------------------
sx = np.array([[0, 1], [1, 0]], dtype=complex)
sy = np.array([[0, -1j], [1j, 0]], dtype=complex)
sz = np.array([[1, 0], [0, -1]], dtype=complex)
I2 = np.eye(2, dtype=complex)
IR = np.eye(R_ENV, dtype=complex)

bloch_axes = np.array([[1, 0, 0], [-1, 0, 0],
[0, 1, 0], [0, -1, 0],
[0, 0, 1], [0, 0, -1]], dtype=float)

s2 = 1.0 / np.sqrt(2.0)
octa_states = np.array([[s2, s2], [s2, -s2],
[s2, 1j * s2], [s2, -1j * s2],
[1.0, 0.0], [0.0, 1.0]], dtype=complex)


def projector_from_bloch(n):
return 0.5 * (I2 + n[0] * sx + n[1] * sy + n[2] * sz)


R_list = np.array([projector_from_bloch(n) for n in bloch_axes]) # (6, 2, 2)
QA = np.array([np.kron(np.kron(P, I2), IR) for P in R_list]) # P (x) I_B (x) I_E
QB = np.array([np.kron(np.kron(I2, P), IR) for P in R_list]) # I_A (x) P (x) I_E
N_STATES = R_list.shape[0]


# ------------------------------------------------------------
# 3. Core routines
# ------------------------------------------------------------
def polar_isometry(G):
U, _, Wh = np.linalg.svd(G, full_matrices=False)
return U @ Wh


def random_isometry():
G = rng.normal(size=(ROWS, 2)) + 1j * rng.normal(size=(ROWS, 2))
return polar_isometry(G)


def gradient_and_objective(V, Q):
G = np.einsum('sij,jk,skl->il', Q, V, R_list)
f = float(np.real(np.trace(V.conj().T @ G))) / N_STATES
return G, f


def optimize_cloner(lam, n_restarts=6, n_iter=3000, tol=1e-13):
Q = lam * QA + (1.0 - lam) * QB
best_V, best_f = None, -1.0
all_hist = []
for rs in range(n_restarts):
V = random_isometry()
hist = []
prev = -1.0
for it in range(n_iter):
G, f = gradient_and_objective(V, Q)
hist.append(f)
if f - prev < tol:
break
prev = f
V = polar_isometry(G)
_, f_final = gradient_and_objective(V, Q)
all_hist.append(np.array(hist))
if f_final > best_f:
best_f, best_V = f_final, V.copy()
return best_V, best_f, all_hist


def single_copy_fidelities(V, psi):
# psi: (N, 2) array of pure states; returns F_A and F_B for each state
psiT = psi.T
Psi = (V @ psiT).reshape(2, 2, R_ENV, psi.shape[0])
phiA = np.einsum('an,aben->ben', psiT.conj(), Psi)
phiB = np.einsum('bn,aben->aen', psiT.conj(), Psi)
FA = np.sum(np.abs(phiA) ** 2, axis=(0, 1))
FB = np.sum(np.abs(phiB) ** 2, axis=(0, 1))
return FA, FB


def haar_states(n):
z = rng.normal(size=(n, 2)) + 1j * rng.normal(size=(n, 2))
return z / np.linalg.norm(z, axis=1, keepdims=True)


# ------------------------------------------------------------
# 4. Reference cloner: CNOT copy (|0> -> |00>, |1> -> |11>)
# ------------------------------------------------------------
V_cnot = np.zeros((ROWS, 2), dtype=complex)
V_cnot[0 * R_ENV + 0, 0] = 1.0
V_cnot[3 * R_ENV + 0, 1] = 1.0

# ------------------------------------------------------------
# 5. Symmetric optimal cloner (lambda = 0.5)
# ------------------------------------------------------------
V_sym, f_sym, hist_sym = optimize_cloner(0.5, n_restarts=6, n_iter=3000)

FA_oct, FB_oct = single_copy_fidelities(V_sym, octa_states)

haar_batch = haar_states(20000)
FA_h, FB_h = single_copy_fidelities(V_sym, haar_batch)
FA_cn_h, FB_cn_h = single_copy_fidelities(V_cnot, haar_batch)

Psi0 = (V_sym @ np.array([1.0, 0.0], dtype=complex)).reshape(2, 2, R_ENV)
rhoA0 = np.einsum('abe,cbe->ac', Psi0, Psi0.conj())
eta = float(np.real(rhoA0[0, 0] - rhoA0[1, 1]))

M = V_sym.reshape(DIM_OUT, R_ENV, 2).transpose(1, 0, 2).reshape(R_ENV, DIM_OUT * 2)
sv = np.linalg.svd(M, compute_uv=False)
kraus_rank = int(np.sum(sv > 1e-8))

print("=== Symmetric optimal cloner (lambda = 0.5) ===")
print(f"Optimized average fidelity : {f_sym:.12f}")
print(f"Analytic optimum 5/6 : {F_OPT:.12f}")
print(f"Absolute error : {abs(f_sym - F_OPT):.3e}")
print(f"Isometry error ||V^dag V - I|| : {np.linalg.norm(V_sym.conj().T @ V_sym - np.eye(2)):.3e}")
print(f"F_A (octahedron average) : {np.mean(FA_oct):.12f}")
print(f"F_B (octahedron average) : {np.mean(FB_oct):.12f}")
print(f"Bloch shrinking factor eta : {eta:.12f} (analytic 2/3 = {2.0 / 3.0:.12f})")
print(f"Numerical Kraus rank : {kraus_rank}")
print()
print("=== Haar-random check with 20000 states ===")
print(f"Optimal cloner : mean F_A = {np.mean(FA_h):.9f}, mean F_B = {np.mean(FB_h):.9f}, spread of F_A = {np.ptp(FA_h):.3e}")
print(f"CNOT cloner : mean F_A = {np.mean(FA_cn_h):.9f}, min = {np.min(FA_cn_h):.4f}, max = {np.max(FA_cn_h):.4f}")

# ------------------------------------------------------------
# 6. Asymmetric trade-off curve
# ------------------------------------------------------------
lam_grid = np.linspace(0.0, 1.0, 21)
FA_curve = np.zeros_like(lam_grid)
FB_curve = np.zeros_like(lam_grid)
for i, lam in enumerate(lam_grid):
V_l, _, _ = optimize_cloner(lam, n_restarts=4, n_iter=4000)
fa, fb = single_copy_fidelities(V_l, octa_states)
FA_curve[i] = np.mean(fa)
FB_curve[i] = np.mean(fb)

print()
print("=== Asymmetric trade-off (selected weights) ===")
print(f"{'lambda':>8} {'F_A':>12} {'F_B':>12}")
for idx in [0, 5, 10, 15, 20]:
print(f"{lam_grid[idx]:8.2f} {FA_curve[idx]:12.8f} {FB_curve[idx]:12.8f}")

# ------------------------------------------------------------
# 7. Visualization (one figure)
# ------------------------------------------------------------
theta = np.linspace(0.0, np.pi, 50)
phi = np.linspace(0.0, 2.0 * np.pi, 100)
TH, PH = np.meshgrid(theta, phi, indexing='ij')
psi_grid = np.stack([np.cos(TH / 2.0).ravel(),
(np.exp(1j * PH) * np.sin(TH / 2.0)).ravel()], axis=1)
F_opt_grid = single_copy_fidelities(V_sym, psi_grid)[0].reshape(TH.shape)
F_cnot_grid = single_copy_fidelities(V_cnot, psi_grid)[0].reshape(TH.shape)

fig = plt.figure(figsize=(21, 12))

# (1) convergence of the fixed-point iteration
ax1 = fig.add_subplot(2, 3, 1)
for k, h in enumerate(hist_sym):
ax1.semilogy(np.maximum(F_OPT - h, 1e-16), lw=1.6, label=f"restart {k + 1}")
ax1.set_xlabel("iteration")
ax1.set_ylabel(r"$5/6-\bar F$")
ax1.set_title("Convergence of the polar-decomposition iteration")
ax1.legend(fontsize=8)
ax1.grid(alpha=0.3)

# (2) 3D: fidelity over the Bloch sphere (theta, phi)
ax2 = fig.add_subplot(2, 3, 2, projection='3d')
ax2.plot_surface(PH, TH, F_opt_grid, color='deepskyblue', alpha=0.6, linewidth=0)
ax2.plot_surface(PH, TH, F_cnot_grid, cmap='autumn', alpha=0.9, linewidth=0)
ax2.set_xlabel(r"$\varphi$")
ax2.set_ylabel(r"$\theta$")
ax2.set_zlabel(r"$F_A$")
ax2.set_zlim(0.4, 1.02)
ax2.set_title("Single-copy fidelity: optimal (flat, blue) vs CNOT (dome, warm)")
ax2.view_init(elev=24, azim=-58)

# (3) 3D: trade-off curve (F_A, F_B, lambda)
ax3 = fig.add_subplot(2, 3, 3, projection='3d')
ax3.plot(FA_curve, FB_curve, lam_grid, color='white', lw=1.2)
sc = ax3.scatter(FA_curve, FB_curve, lam_grid, c=lam_grid, cmap='plasma', s=45)
ax3.scatter([np.mean(FA_oct)], [np.mean(FB_oct)], [0.5], color='cyan', s=180, marker='*')
ax3.set_xlabel(r"$F_A$")
ax3.set_ylabel(r"$F_B$")
ax3.set_zlabel(r"weight $\lambda$")
ax3.set_title("Asymmetric cloning trade-off (star = symmetric optimum)")
ax3.view_init(elev=22, azim=-62)
fig.colorbar(sc, ax=ax3, shrink=0.6, pad=0.1, label=r"$\lambda$")

# (4) histogram over Haar-random inputs
ax4 = fig.add_subplot(2, 3, 4)
ax4.hist(FA_h, bins=80, range=(0.4, 1.0), color='deepskyblue', alpha=0.85, label="Optimal cloner")
ax4.hist(FA_cn_h, bins=80, range=(0.4, 1.0), color='orange', alpha=0.7, label="CNOT cloner")
ax4.set_yscale('log')
ax4.set_xlabel(r"single-copy fidelity $F_A$")
ax4.set_ylabel("count (20000 Haar-random inputs)")
ax4.set_title("Universality: fidelity distribution")
ax4.legend()
ax4.grid(alpha=0.3)

# (5) bar comparison of strategies
ax5 = fig.add_subplot(2, 3, 5)
labels = ["Measure &\nprepare\n(analytic)", "CNOT\ncloner\n(numerical)", "Optimized\ncloner\n(numerical)", "Bound 5/6\n(analytic)"]
vals = [2.0 / 3.0, float(np.mean(FA_cn_h)), float(np.mean(FA_h)), F_OPT]
bars = ax5.bar(labels, vals, color=['gray', 'orange', 'deepskyblue', 'limegreen'])
for b, v in zip(bars, vals):
ax5.text(b.get_x() + b.get_width() / 2.0, v + 0.01, f"{v:.4f}", ha='center')
ax5.set_ylim(0.0, 1.0)
ax5.set_ylabel("average single-copy fidelity")
ax5.set_title("Strategy comparison")
ax5.grid(alpha=0.3, axis='y')

# (6) fidelities versus weight lambda
ax6 = fig.add_subplot(2, 3, 6)
ax6.plot(lam_grid, FA_curve, 'o-', color='deepskyblue', label=r"$F_A$")
ax6.plot(lam_grid, FB_curve, 's-', color='orange', label=r"$F_B$")
ax6.axhline(F_OPT, color='limegreen', ls='--', label="5/6")
ax6.axhline(0.5, color='gray', ls=':')
ax6.set_xlabel(r"weight $\lambda$")
ax6.set_ylabel("fidelity")
ax6.set_title("Fidelities of the optimized asymmetric cloners")
ax6.legend()
ax6.grid(alpha=0.3)

fig.suptitle("Optimal quantum cloning of a qubit: fidelity-maximizing channel", fontsize=16)
plt.tight_layout(rect=[0, 0, 1, 0.96])
plt.show()

5. Code Walkthrough

Section 1 – Dimensions

The output space is two qubits, so DIM_OUT = 4. The environment dimension is R_ENV = 8, which is the largest Choi rank a map from $\mathbb{C}^2$ to $\mathbb{C}^4$ can have. The isometry $V$ is therefore a $32\times 2$ complex matrix. Its row index encodes $(a,b,e)$ as $(2a+b)\cdot 8+e$, which matches the Kronecker-product ordering used later.

Section 2 – The octahedron design

octa_states lists the six states $|\pm x\rangle,|\pm y\rangle,|\pm z\rangle$. R_list stores their projectors $R_s$. QA and QB hold $P_s\otimes\mathbb{1}\otimes\mathbb{1}$ and $\mathbb{1}\otimes P_s\otimes\mathbb{1}$, so that $Q_s=\lambda Q^A_s+(1-\lambda)Q^B_s$ can be formed for any weight with a single line of array arithmetic.

Section 3 – Core routines

  • polar_isometry computes $UW^\dagger$ from a thin SVD. It is the projection of an arbitrary matrix onto the nearest isometry.
  • gradient_and_objective evaluates $G=\sum_s Q_sVR_s$ with one einsum call and returns $\bar F=\frac16\mathrm{Re},\mathrm{Tr}(V^\dagger G)$.
  • optimize_cloner runs the monotone iteration $V\leftarrow\mathrm{polar}(G(V))$ from several random isometries and keeps the best one. Random restarts guard against the possibility of non-global stationary points. The loop stops when the increase falls below $10^{-13}$.
  • single_copy_fidelities is a fully vectorized fidelity evaluator. It uses the identity
    $$
    F_A(\psi)=\sum_{b,e}\Big|\sum_a \langle\psi|a\rangle,\Psi_{abe}\Big|^2,\qquad \Psi=V|\psi\rangle,
    $$
    which avoids building density matrices and handles thousands of states in one call. This function runs the Haar-random verification and the Bloch-sphere grid with no Python loops.

Section 4 – The CNOT cloner

The CNOT cloner is encoded as an isometry with a trivial environment: $|0\rangle\to|00\rangle$ sits at row $0$ and $|1\rangle\to|11\rangle$ at row $3\cdot R_{\mathrm{ENV}}$. It serves as a non-universal baseline evaluated with exactly the same machinery.

Section 5 – The symmetric optimum

With $\lambda=\tfrac12$ the optimizer is run from six random starts. The script then reports the following:

  • the optimized average fidelity compared with $5/6$;
  • the isometry defect $|V^\dagger V-\mathbb{1}|$, which verifies that the channel is trace preserving;
  • the Bloch shrinking factor $\eta$ for the input $|0\rangle$, via $\rho_A=\mathrm{Tr}_{B,E}|\Psi\rangle\langle\Psi|$;
  • the numerical Kraus rank, taken from the singular values of the matrix whose rows are the vectorized Kraus operators;
  • a check against $20000$ Haar-random pure states, which confirms that the six-state average really equals the Haar average.

The theory predicts a Kraus rank of $2$, because the optimal cloner can be written as
$$
\Lambda(\rho)=\tfrac23,\Pi_{\mathrm{sym}}(\rho\otimes\mathbb{1})\Pi_{\mathrm{sym}},
$$
with $\Pi_{\mathrm{sym}}$ the projector onto the symmetric subspace of two qubits.

Section 6 – Asymmetric trade-off

The same optimizer is repeated for 21 weights $\lambda\in[0,1]$. At $\lambda=1$ the best strategy is to hand the input to $A$ untouched ($F_A=1$) and give $B$ only a maximally mixed qubit ($F_B=\tfrac12$). The intermediate weights trace out the Pareto frontier between the two copies.

Section 7 – Visualization

All six panels live in a single figure (see the next section for how to read it).

6. Execution Results


=== Symmetric optimal cloner (lambda = 0.5) ===
Optimized average fidelity      : 0.833333333333
Analytic optimum 5/6            : 0.833333333333
Absolute error                  : 6.052e-13
Isometry error ||V^dag V - I||  : 9.956e-16
F_A (octahedron average)        : 0.833333333333
F_B (octahedron average)        : 0.833333333333
Bloch shrinking factor eta      : 0.666664184649   (analytic 2/3 = 0.666666666667)
Numerical Kraus rank            : 2

=== Haar-random check with 20000 states ===
Optimal cloner : mean F_A = 0.833333322, mean F_B = 0.833333322, spread of F_A = 3.110e-06
CNOT cloner    : mean F_A = 0.667233172, min = 0.5000, max = 1.0000

=== Asymmetric trade-off (selected weights) ===
  lambda          F_A          F_B
    0.00   0.50000000   1.00000000
    0.25   0.60367259   0.98163706
    0.50   0.83333333   0.83333333
    0.75   0.98163706   0.60367259
    1.00   1.00000000   0.50000000

7. Reading the Results

Convergence (top left). The vertical axis is the gap $5/6-\bar F$ on a logarithmic scale. Because each update is a polar projection of the gradient of a convex quadratic form, every curve decreases monotonically. All restarts should approach the same floor near machine precision. That agreement is numerical evidence that the symmetric optimum is a global one and that the algorithm does not stall in spurious local maxima.

Fidelity over the Bloch sphere (top middle, 3D). The horizontal plane is the parameter space $(\varphi,\theta)$ of input states, and the height is $F_A$. The optimized cloner appears as a perfectly flat sheet at $5/6$: it copies every state equally well, which is exactly what universal means. The CNOT cloner forms a dome, $1-\tfrac12\sin^2\theta$. It is perfect at the poles ($|0\rangle$ and $|1\rangle$, the basis states it was designed for) and drops to $\tfrac12$ on the equator. Its average over the sphere is only $\tfrac23$. The flatness of the blue sheet is a numerical rediscovery of the covariance of the optimal channel, which the optimizer was never told to impose.

Trade-off curve (top right, 3D). Each point is one optimized cloner with $x=F_A$, $y=F_B$ and height equal to the weight $\lambda$. The curve runs from $(F_A,F_B)=(\tfrac12,1)$ at $\lambda=0$ to $(1,\tfrac12)$ at $\lambda=1$, and passes through the symmetric optimum $(\tfrac56,\tfrac56)$ marked by the star. Its concavity matters physically: improving one copy beyond $5/6$ always costs more than a one-for-one loss in the other, which is a quantitative form of the no-cloning theorem.

Fidelity histogram (bottom left). For 20000 Haar-random inputs, the optimal cloner puts essentially all of its weight in a single bin at $5/6$ (note the logarithmic vertical axis). The CNOT cloner is spread over $[\tfrac12,1]$. The spread, not just the mean, separates a universal machine from a basis-dependent one.

Strategy comparison (bottom middle). Measure-and-prepare and the CNOT cloner both give $\tfrac23$. The optimized quantum cloner reaches $\tfrac56$, which matches the analytic bound. Quantum-coherent copying beats the best classical strategy of measuring once and re-preparing.

Fidelities versus the weight (bottom right). $F_A$ rises and $F_B$ falls as $\lambda$ increases, and the curves cross at $\lambda=\tfrac12$ at the height $5/6$. They saturate at the extremes: $F_A=1$ means the second copy carries no information beyond a random guess of fidelity $\tfrac12$.

8. Summary

  • Optimal approximate cloning is a convex quadratic maximization over isometries, which is a semidefinite program in disguise.
  • Replacing the Haar integral with an exact 2-design (six octahedron states) reduces the problem to a few small matrix products.
  • The fixed-point iteration $V\leftarrow\mathrm{polar}\big(\sum_s Q_sVR_s\big)$ increases the objective monotonically and recovers the Bužek–Hillery value $\bar F=5/6$, the shrinking factor $\eta=2/3$ and a Kraus rank of $2$, without any hand-built ansatz.
  • The same code, with only the weight $\lambda$ changed, maps the whole asymmetric trade-off curve between the two copies.