The Partial Trace
The partial trace discards a subsystem to yield the correct local description of the part you keep.
Reducing a composite state
Given a joint state rho_AB on a bipartite system, the state of subsystem A alone is obtained by the partial trace over B: rho_A = Tr_B(rho_AB). Concretely, one sums the diagonal blocks in the B index: rho_A = sum_j (I_A tensor
The defining property
The partial trace is characterized by consistency: for any observable M_A acting only on A, Tr(M_A rho_A) = Tr((M_A tensor I_B) rho_AB). In words, whatever an experimenter with access only to A can measure is fully captured by rho_A. No local operation on A can reveal anything about rho_AB beyond rho_A.
import numpy as np
bell = np.array([1,0,0,1])/np.sqrt(2)
rho = np.outer(bell, bell) # 4x4 on AB
rho = rho.reshape(2,2,2,2) # A,B,A',B'
rho_A = np.trace(rho, axis1=1, axis2=3) # trace out B
print(np.round(rho_A,3)) # I/2
Tracing out one half of a Bell state leaves the maximally mixed state I/2, even though the global state is pure. This is the hallmark of entanglement: strong correlation globally, maximal ignorance locally.
Why it is the right operation
One might ask whether some other reduction could retain more information about B while still describing A correctly. The answer is no: any map that reproduces all local A-statistics must equal the partial trace. It is the quantum analogue of marginalizing a joint probability distribution, and like marginalization it discards information about the other variable and about correlations between them.
Role in open systems
The partial trace is the gateway to open-system dynamics. Evolve system plus environment unitarily, then trace out the environment; the induced map on the system is a completely positive trace-preserving channel. Every Kraus representation arises this way, which is why the partial trace underlies decoherence, noise modeling, and the derivation of master equations.