Bloch Vector Noise Models
A qubit channel moves points inside the Bloch ball. Dephasing squeezes transverse coordinates, depolarizing noise shrinks all coordinates equally, and amplitude damping also moves the center. This calculation reconstructs each affine map from four input states and checks its action against density-matrix evolution.
Helpful background. The Bloch sphere identifies the coordinates of a qubit state. Simulating quantum channels supplies the Kraus and Choi tests. The self-contained code below uses Python 3 and NumPy.
Bloch coordinates and the sign of the y component
Section titled “Bloch coordinates and the sign of the y component”Use and . Thus is the north pole, and
The minus sign in matters: belongs to , not . The eigenvalues are , so positivity is equivalent to .
A trace-preserving Hermiticity-preserving linear map acts as . To find it, first send through the map; its output Bloch vector is . Then send through it and subtract to obtain column of .
Three noise models at the same time
Section titled “Three noise models at the same time”Let . With no Hamiltonian rotation, use
| Model | Generator | Finite-time map |
|---|---|---|
| Dephasing | , | |
| Depolarizing | , | |
| Damping into | , ; |
The coefficients in the middle column explain the factors of two in the last column. In particular, damping reduces transverse coherence at half the population-decay rate. Parameters such as are dimensionless probabilities; has units of inverse time.
For rates equal to in the chosen time unit, take and . The expected outputs are , , and . Dephasing and depolarizing agree on this equatorial input, but differ on a north-pole input. One plotted trajectory cannot distinguish every channel.
import numpy as np
I = np.eye(2, dtype=complex)X = np.array([[0, 1], [1, 0]], dtype=complex)Y = np.array([[0, -1j], [1j, 0]])Z = np.diag([1, -1])paulis = [X, Y, Z]
def state(r): return (I + sum(x*S for x, S in zip(r, paulis))) / 2
def bloch(A): return np.array([np.trace(A @ S).real for S in paulis])
def affine(phi): c = bloch(phi(I/2)) M = np.column_stack([bloch(phi((I+S)/2))-c for S in paulis]) return M, c
t = np.log(2.0)lam = np.exp(-t)p = 1-lamK0 = np.diag([1, np.sqrt(1-p)])K1 = np.array([[0, np.sqrt(p)], [0, 0]])channels = { 'dephasing': lambda A: ((1+lam)*A+(1-lam)*Z@A@Z)/2, 'depolarizing': lambda A: lam*A+(1-lam)*np.trace(A)*I/2, 'damping': lambda A: K0@A@K0.conj().T+K1@A@K1.conj().T,}expected = { 'dephasing': (np.diag([lam, lam, 1]), np.zeros(3)), 'depolarizing': (lam*np.eye(3), np.zeros(3)), 'damping': (np.diag([np.sqrt(lam), np.sqrt(lam), lam]), np.array([0, 0, p])),}r0 = np.array([0.6, 0.8, 0.0])assert np.allclose(bloch(state([0, 1, 0])), [0, 1, 0])for name, phi in channels.items(): M, c = affine(phi) assert np.allclose(M, expected[name][0]) assert np.allclose(c, expected[name][1]) out = phi(state(r0)) r = M@r0+c assert np.allclose(out, state(r)) assert np.linalg.eigvalsh(out).min() >= -1e-12 assert np.linalg.norm(r) <= 1+1e-12 print(name, np.round(r, 6))
# Damping composes by multiplying survival probabilities.p1, p2 = 0.2, 0.3combined_p = 1-(1-p1)*(1-p2)assert np.isclose(combined_p, 0.44)Reconstructing and from a spanning set checks the entire linear qubit map. Checking that a few states stay inside the ball serves a different purpose: it does not establish complete positivity. For example, , maps the whole Bloch ball into itself but has a negative Choi eigenvalue.
From a table of points to a trajectory
Section titled “From a table of points to a trajectory”Repeat the calculation for times . Plot each coordinate against time before attempting a three-dimensional sphere: this makes decay rates and fixed points easier to read. For damping, the endpoint is ; for depolarizing it is the origin; for dephasing it is .
These finite-time formulas are exact for their stated generators. They have no time-step error. Compare them with a numerical ODE method on solving Lindblad equations, where halving the integration step tests a different source of error. A discrete dephasing channel may have negative , but the purely dissipative semigroup above never does; such a negative factor cannot be fitted by a positive real rate in this model.
Exercises
Section titled “Exercises”Recover the coordinates. Find the Bloch vector of and its purity.
Solution
and . This complex example distinguishes the two possible signs of .
Distinguish two contractions. What happens to at under dephasing and depolarizing noise with unit rates?
Solution
Dephasing leaves it unchanged. Depolarizing gives . Their identical outputs for an equatorial input did not imply identical channels.
Damping composition. Derive the combined damping probability for two successive steps.
Solution
The excited population is multiplied by , so . The coherence factors also multiply to . Thus two steps with probabilities and give , not .
The depolarizing rate. Show that gives .
Solution
For a fixed Pauli component , the term with vanishes and the two anticommuting Pauli matrices each give . The sum is , which the prefactor converts to .
References
Section titled “References”- I. Bengtsson and K. Życzkowski, Geometry of Quantum States: An Introduction to Quantum Entanglement, Cambridge University Press (2006).
- H.-P. Breuer and F. Petruccione, The Theory of Open Quantum Systems, Oxford University Press (2002).
- M. A. Nielsen and I. L. Chuang, Quantum Computation and Quantum Information, 10th anniversary edition, Cambridge University Press (2010).
- J. Watrous, The Theory of Quantum Information, Cambridge University Press (2018). Author’s manuscript and errata.