First our standard definitions:
import matplotlib.pyplot as plt
from numpy import sqrt,pi,cos,sin,arange,random,exp
from qutip import *
H = Qobj([[1],[0]])
V = Qobj([[0],[1]])
P45 = Qobj([[1/sqrt(2)],[1/sqrt(2)]])
M45 = Qobj([[1/sqrt(2)],[-1/sqrt(2)]])
R = Qobj([[1/sqrt(2)],[-1j/sqrt(2)]])
L = Qobj([[1/sqrt(2)],[1j/sqrt(2)]])
def sim_transform(o_basis1, o_basis2, n_basis1, n_basis2):
a = n_basis1.dag()*o_basis1
b = n_basis1.dag()*o_basis2
c = n_basis2.dag()*o_basis1
d = n_basis2.dag()*o_basis2
return Qobj([[a.data[0,0],b.data[0,0]],[c.data[0,0],d.data[0,0]]])
def Delta(state, op):
"""Calculate std. dev. of an observable in a given state"""
eO2 = state.dag()*op*op*state
eO = state.dag()*op*state
return sqrt(eO2.data[0,0] - (eO.data[0,0])**2)
Phv = H*H.dag() - V*V.dag()
Phv
psi = 1/sqrt(5)*H + 2/sqrt(5)*V
psi.dag()*Phv*psi
psi.dag()*Phv*Phv*psi
1.0 - (-0.6)**2
0.64
random.choice([1,-1],size=10,p=[0.2,0.8])
gives a list of 10 numbers, either 1 or -1 with the associated probability p:
data = random.choice([1, -1],size=20,p=[0.2,0.8])
data.mean()
-0.69999999999999996
data.var()
0.51000000000000001
data = random.choice([1, -1],size=10000,p=[0.2,0.8])
data.mean()
-0.59840000000000004
data.var()
0.64191744000000017
10,000 does pretty well for getting to the predictions. "There is no substitute for an adequate sample size."
# 5.11
P_45 = P45*P45.dag() - M45*M45.dag()
#5.12
P_c = L*L.dag() - R*R.dag()
#5.13
(Phv*P_45 - P_45*Phv) == 2j * P_c
True
#5.14
(Phv*P_c - P_c*Phv) == -2j * P_45
True
#5.15
P_p45 = P45*P45.dag()
P_v = V*V.dag()
P_p45*P_v - P_v*P_p45
psi = 1/sqrt(3)*H + sqrt(2/3.0)*exp(1j*pi/3.0)*V
psi.norm()
1.0
Delta(psi,P_45)*Delta(psi,Phv)
(0.83147941928309788+0j)
1/2j*(psi.dag()*(Phv*P_45 - P_45*Phv)*psi).data[0,0]
(0.81649658092772592+0j)