Manuscript En02-D@4 · En02-D-v4.tex · section · e19ec871
Computational supplement
Computational supplement · lines 1500–1592
def ptrace(A,keep,n): keep = tuple(keep) drop = tuple(j for j in range(n) if j not in keep) axes = keep+drop+tuple(n+j for j in keep)+tuple(n+j for j in drop) A = A.reshape((2,)*(2*n)).transpose(axes) A = A.reshape(2**len(keep),2**len(drop), 2**len(keep),2**len(drop)) return np.einsum("abcb->ac",A)
def entropy(A): e = np.linalg.eigvalsh(herm(A)) need(e.min()>=-TOL,"entropy positivity") # Eigenvalue handling only; no simulation amplitudes are dropped. e = e[e>1e-12] return float(-np.sum(e*np.log2(e)))
def units(d=2): for a,b in it.product(range(d),repeat=2): E = np.zeros((d,d),complex) E[a,b] = 1 yield a,b,E
def dep(A): return np.trace(A)*I/2
def choi(N): return sum((np.kron(N[a,b],E) for a,b,E in units()), np.zeros((2*N[0,0].shape[0],)*2,complex))
def idchoi(): return choi((a,b):E for a,b,E in units())
def channel(A): return (a,b):A[:,:,a]@A[:,:,b].conj().T for a,b,E in units()
def decoupling(A): C = (a,b):A[:,:,a].T@A[:,:,b].conj() for a,b,E in units() rho = np.block([[C[0,0],C[0,1]],[C[1,0],C[1,1]]])/2 env = (C[0,0]+C[1,1])/2 return float(np.abs(np.linalg.eigvalsh( herm(rho-np.kron(I/2,env)))).sum()/2)
def encoder(): U = np.eye(8,dtype=complex) seq = [(CZ,(1,2)),(CZ,(0,1)),(SD,(2,)),(H,(2,)), (SD,(0,)),(H,(0,)),(CX,(0,1)),(CX,(2,1)),(Y,(1,))] for G,p in seq: U = embed(G,p,3)@U J = np.zeros((32,2),complex) for m,a,b in it.product(range(2),repeat=3): J[integer((a,m,b,a,b)),m] = .5 return U,np.kron(U.conj().T,np.eye(4))@J
def benchmark(V,w0=.25,gamma=(.5,2/3,.75),t=3): entries = {} def put(key,v): entries[key] = entries.get(key,np.zeros(2,complex))+v for b in it.product(range(2),repeat=5): v = V[integer(b)] put(((0,)*t,(0,b,(0,)*t)),np.sqrt(w0)*v) for mask in it.product(range(2),repeat=t): d = tuple(b[j]+1 if mask[j] else 0 for j in range(t)) f = tuple(0 if mask[j] else b[j]+1 for j in range(t)) z = np.sqrt(1-w0)*np.prod([ np.sqrt(gamma[j] if mask[j] else 1-gamma[j]) for j in range(t)]) put((d,(1,b[t:],f)),z*v) dk = list(it.product(range(3),repeat=t)) ek = sorted(e for d,e in entries) dl,el = d:i for i,d in enumerate(dk),e:i for i,e in enumerate(ek) A = np.zeros((len(dk),len(ek),2),complex) for (d,e),v in entries.items(): A[dl[d],el[e]] += v return A,dk
B12 = kron(H,I)@kron(SD,I)@CX@kron(I,H) R0 = H@SD
def parity(A,O,P): return sum((np.trace((np.eye(len(A))+z*O)@A/2)*(I+z*P)/2 for z in (-1,1)),np.zeros((2,2),complex))
def full_decode(A,odd): early = B12@(CZ if odd else np.eye(4)) out = np.zeros((2,2),complex) for t,s in it.product(range(2),repeat=2): C = np.linalg.matrix_power(X,1-t)@np.linalg.matrix_power(Z,1-s) K = C@R0@kron(early[2*t+s][None,:],I) out += K@[email protected]().T return out