123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159 |
- from sympy.core.mul import Mul
- from sympy.core.numbers import I
- from sympy.matrices.dense import Matrix
- from sympy.printing.latex import latex
- from sympy.physics.quantum import (Dagger, Commutator, AntiCommutator, qapply,
- Operator, represent)
- from sympy.physics.quantum.pauli import (SigmaOpBase, SigmaX, SigmaY, SigmaZ,
- SigmaMinus, SigmaPlus,
- qsimplify_pauli)
- from sympy.physics.quantum.pauli import SigmaZKet, SigmaZBra
- from sympy.testing.pytest import raises
- sx, sy, sz = SigmaX(), SigmaY(), SigmaZ()
- sx1, sy1, sz1 = SigmaX(1), SigmaY(1), SigmaZ(1)
- sx2, sy2, sz2 = SigmaX(2), SigmaY(2), SigmaZ(2)
- sm, sp = SigmaMinus(), SigmaPlus()
- sm1, sp1 = SigmaMinus(1), SigmaPlus(1)
- A, B = Operator("A"), Operator("B")
- def test_pauli_operators_types():
- assert isinstance(sx, SigmaOpBase) and isinstance(sx, SigmaX)
- assert isinstance(sy, SigmaOpBase) and isinstance(sy, SigmaY)
- assert isinstance(sz, SigmaOpBase) and isinstance(sz, SigmaZ)
- assert isinstance(sm, SigmaOpBase) and isinstance(sm, SigmaMinus)
- assert isinstance(sp, SigmaOpBase) and isinstance(sp, SigmaPlus)
- def test_pauli_operators_commutator():
- assert Commutator(sx, sy).doit() == 2 * I * sz
- assert Commutator(sy, sz).doit() == 2 * I * sx
- assert Commutator(sz, sx).doit() == 2 * I * sy
- def test_pauli_operators_commutator_with_labels():
- assert Commutator(sx1, sy1).doit() == 2 * I * sz1
- assert Commutator(sy1, sz1).doit() == 2 * I * sx1
- assert Commutator(sz1, sx1).doit() == 2 * I * sy1
- assert Commutator(sx2, sy2).doit() == 2 * I * sz2
- assert Commutator(sy2, sz2).doit() == 2 * I * sx2
- assert Commutator(sz2, sx2).doit() == 2 * I * sy2
- assert Commutator(sx1, sy2).doit() == 0
- assert Commutator(sy1, sz2).doit() == 0
- assert Commutator(sz1, sx2).doit() == 0
- def test_pauli_operators_anticommutator():
- assert AntiCommutator(sy, sz).doit() == 0
- assert AntiCommutator(sz, sx).doit() == 0
- assert AntiCommutator(sx, sm).doit() == 1
- assert AntiCommutator(sx, sp).doit() == 1
- def test_pauli_operators_adjoint():
- assert Dagger(sx) == sx
- assert Dagger(sy) == sy
- assert Dagger(sz) == sz
- def test_pauli_operators_adjoint_with_labels():
- assert Dagger(sx1) == sx1
- assert Dagger(sy1) == sy1
- assert Dagger(sz1) == sz1
- assert Dagger(sx1) != sx2
- assert Dagger(sy1) != sy2
- assert Dagger(sz1) != sz2
- def test_pauli_operators_multiplication():
- assert qsimplify_pauli(sx * sx) == 1
- assert qsimplify_pauli(sy * sy) == 1
- assert qsimplify_pauli(sz * sz) == 1
- assert qsimplify_pauli(sx * sy) == I * sz
- assert qsimplify_pauli(sy * sz) == I * sx
- assert qsimplify_pauli(sz * sx) == I * sy
- assert qsimplify_pauli(sy * sx) == - I * sz
- assert qsimplify_pauli(sz * sy) == - I * sx
- assert qsimplify_pauli(sx * sz) == - I * sy
- def test_pauli_operators_multiplication_with_labels():
- assert qsimplify_pauli(sx1 * sx1) == 1
- assert qsimplify_pauli(sy1 * sy1) == 1
- assert qsimplify_pauli(sz1 * sz1) == 1
- assert isinstance(sx1 * sx2, Mul)
- assert isinstance(sy1 * sy2, Mul)
- assert isinstance(sz1 * sz2, Mul)
- assert qsimplify_pauli(sx1 * sy1 * sx2 * sy2) == - sz1 * sz2
- assert qsimplify_pauli(sy1 * sz1 * sz2 * sx2) == - sx1 * sy2
- def test_pauli_states():
- sx, sz = SigmaX(), SigmaZ()
- up = SigmaZKet(0)
- down = SigmaZKet(1)
- assert qapply(sx * up) == down
- assert qapply(sx * down) == up
- assert qapply(sz * up) == up
- assert qapply(sz * down) == - down
- up = SigmaZBra(0)
- down = SigmaZBra(1)
- assert qapply(up * sx, dagger=True) == down
- assert qapply(down * sx, dagger=True) == up
- assert qapply(up * sz, dagger=True) == up
- assert qapply(down * sz, dagger=True) == - down
- assert Dagger(SigmaZKet(0)) == SigmaZBra(0)
- assert Dagger(SigmaZBra(1)) == SigmaZKet(1)
- raises(ValueError, lambda: SigmaZBra(2))
- raises(ValueError, lambda: SigmaZKet(2))
- def test_use_name():
- assert sm.use_name is False
- assert sm1.use_name is True
- assert sx.use_name is False
- assert sx1.use_name is True
- def test_printing():
- assert latex(sx) == r'{\sigma_x}'
- assert latex(sx1) == r'{\sigma_x^{(1)}}'
- assert latex(sy) == r'{\sigma_y}'
- assert latex(sy1) == r'{\sigma_y^{(1)}}'
- assert latex(sz) == r'{\sigma_z}'
- assert latex(sz1) == r'{\sigma_z^{(1)}}'
- assert latex(sm) == r'{\sigma_-}'
- assert latex(sm1) == r'{\sigma_-^{(1)}}'
- assert latex(sp) == r'{\sigma_+}'
- assert latex(sp1) == r'{\sigma_+^{(1)}}'
- def test_represent():
- assert represent(sx) == Matrix([[0, 1], [1, 0]])
- assert represent(sy) == Matrix([[0, -I], [I, 0]])
- assert represent(sz) == Matrix([[1, 0], [0, -1]])
- assert represent(sm) == Matrix([[0, 0], [1, 0]])
- assert represent(sp) == Matrix([[0, 1], [0, 0]])
|