from sympy import *
from sympy.physics.quantum import *
from sympy.physics.quantum.density import *
from sympy.physics.quantum.spin import (
Jx, Jy, Jz, Jplus, Jminus, J2,
JxBra, JyBra, JzBra,
JxKet, JyKet, JzKet,
)
from IPython.core.display import display_pretty
%load_ext sympyprinting
Create n density matrix using symbolic states
psi = Ket('psi')
phi = Ket('phi')
d = Density((psi,0.5),(phi,0.5)); d
display_pretty(d)
ρ((❘ψ⟩, 0.5),(❘φ⟩, 0.5))
d.states()
d.probs()
d.doit()
Dagger(d)
A = Operator('A')
d.apply_op(A)
Now create a density matrix using spin states
up = JzKet(S(1)/2,S(1)/2)
down = JzKet(S(1)/2,-S(1)/2)
d2 = Density((up,0.5),(down,0.5)); d2
represent(d2)
d2.apply_op(Jz)
qapply(_)
qapply((Jy*d2).doit())
entropy(d2)
entropy(represent(d2))
entropy(represent(d2,format="numpy"))
(0.69314718056-0j)
entropy(represent(d2,format="scipy.sparse"))
(0.69314718056-0j)
from sympy.core.trace import Tr
A, B, C, D = symbols('A B C D',commutative=False)
t1 = TensorProduct(A,B,C)
d = Density([t1, 1.0])
d.doit()
t2 = TensorProduct(A,B)
t3 = TensorProduct(C,D)
d = Density([t2, 0.5], [t3, 0.5])
d.doit()
#mixed states
d = Density([t2+t3, 1.0])
d.doit()
from sympy.physics.quantum.density import Density
from sympy.physics.quantum.spin import (
Jx, Jy, Jz, Jplus, Jminus, J2,
JxBra, JyBra, JzBra,
JxKet, JyKet, JzKet,
)
from sympy.core.trace import Tr
d = Density([JzKet(1,1),0.5],[JzKet(1,-1),0.5]);
t = Tr(d);
display_pretty(t)
print t.doit()
Tr(ρ((❘1,1⟩, 0.5),(❘1,-1⟩, 0.5)))
1.00000000000000
#Partial trace on mixed state
from sympy.core.trace import Tr
A, B, C, D = symbols('A B C D',commutative=False)
t1 = TensorProduct(A,B,C)
d = Density([t1, 1.0])
d.doit()
t2 = TensorProduct(A,B)
t3 = TensorProduct(C,D)
d = Density([t2, 0.5], [t3, 0.5])
tr = Tr(d,[1])
tr.doit()
from sympy.physics.quantum.density import Density
from sympy.physics.quantum.spin import (
Jx, Jy, Jz, Jplus, Jminus, J2,
JxBra, JyBra, JzBra,
JxKet, JyKet, JzKet,
)
from sympy.core.trace import Tr
tp1 = TensorProduct(JzKet(1,1), JzKet(1,-1))
#trace out 0 index
d = Density([tp1,1]);
t = Tr(d,[0]);
display_pretty(t)
display_pretty(t.doit())
#trace out 1 index
t = Tr(d,[1])
display_pretty(t)
t.doit()
Tr((❘1,1⟩⨂ ❘1,-1⟩, 1))
❘1,-1⟩⟨1,-1❘
Tr((❘1,1⟩⨂ ❘1,-1⟩, 1))
psi = Ket('psi')
phi = Ket('phi')
u = UnitaryOperator()
d = Density((psi,0.5),(phi,0.5)); d
display_pretty(qapply(u*d))
# another example
up = JzKet(S(1)/2, S(1)/2)
down = JzKet(S(1)/2, -S(1)/2)
d = Density((up,0.5),(down,0.5))
uMat = Matrix([[0,1],[1,0]])
display_pretty(qapply(uMat*d))
ρ((O⋅❘ψ⟩, 0.5),(O⋅❘φ⟩, 0.5))
⎡ 0 ρ((❘1/2,1/2⟩, 0.5),(❘1/2,-1/2⟩, 0.5))⎤ ⎢ ⎥ ⎣ρ((❘1/2,1/2⟩, 0.5),(❘1/2,-1/2⟩, 0.5)) 0 ⎦
from sympy.physics.quantum.gate import UGate
from sympy.physics.quantum.qubit import Qubit
uMat = UGate((0,), Matrix([[0,1],[1,0]]))
d = Density([Qubit('0'),0.5],[Qubit('1'), 0.5])
display_pretty(d)
#after applying Not gate
display_pretty(qapply(uMat*d) )
ρ((❘0⟩, 0.5),(❘1⟩, 0.5))
ρ((❘1⟩, 0.5),(❘0⟩, 0.5))