test_commutator.py 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. from sympy.core.numbers import Integer
  2. from sympy.core.symbol import symbols
  3. from sympy.physics.quantum.dagger import Dagger
  4. from sympy.physics.quantum.commutator import Commutator as Comm
  5. from sympy.physics.quantum.operator import Operator
  6. a, b, c = symbols('a,b,c')
  7. n = symbols('n', integer=True)
  8. A, B, C, D = symbols('A,B,C,D', commutative=False)
  9. def test_commutator():
  10. c = Comm(A, B)
  11. assert c.is_commutative is False
  12. assert isinstance(c, Comm)
  13. assert c.subs(A, C) == Comm(C, B)
  14. def test_commutator_identities():
  15. assert Comm(a*A, b*B) == a*b*Comm(A, B)
  16. assert Comm(A, A) == 0
  17. assert Comm(a, b) == 0
  18. assert Comm(A, B) == -Comm(B, A)
  19. assert Comm(A, B).doit() == A*B - B*A
  20. assert Comm(A, B*C).expand(commutator=True) == Comm(A, B)*C + B*Comm(A, C)
  21. assert Comm(A*B, C*D).expand(commutator=True) == \
  22. A*C*Comm(B, D) + A*Comm(B, C)*D + C*Comm(A, D)*B + Comm(A, C)*D*B
  23. assert Comm(A, B**2).expand(commutator=True) == Comm(A, B)*B + B*Comm(A, B)
  24. assert Comm(A**2, C**2).expand(commutator=True) == \
  25. Comm(A*B, C*D).expand(commutator=True).replace(B, A).replace(D, C) == \
  26. A*C*Comm(A, C) + A*Comm(A, C)*C + C*Comm(A, C)*A + Comm(A, C)*C*A
  27. assert Comm(A, C**-2).expand(commutator=True) == \
  28. Comm(A, (1/C)*(1/D)).expand(commutator=True).replace(D, C)
  29. assert Comm(A + B, C + D).expand(commutator=True) == \
  30. Comm(A, C) + Comm(A, D) + Comm(B, C) + Comm(B, D)
  31. assert Comm(A, B + C).expand(commutator=True) == Comm(A, B) + Comm(A, C)
  32. assert Comm(A**n, B).expand(commutator=True) == Comm(A**n, B)
  33. e = Comm(A, Comm(B, C)) + Comm(B, Comm(C, A)) + Comm(C, Comm(A, B))
  34. assert e.doit().expand() == 0
  35. def test_commutator_dagger():
  36. comm = Comm(A*B, C)
  37. assert Dagger(comm).expand(commutator=True) == \
  38. - Comm(Dagger(B), Dagger(C))*Dagger(A) - \
  39. Dagger(B)*Comm(Dagger(A), Dagger(C))
  40. class Foo(Operator):
  41. def _eval_commutator_Bar(self, bar):
  42. return Integer(0)
  43. class Bar(Operator):
  44. pass
  45. class Tam(Operator):
  46. def _eval_commutator_Foo(self, foo):
  47. return Integer(1)
  48. def test_eval_commutator():
  49. F = Foo('F')
  50. B = Bar('B')
  51. T = Tam('T')
  52. assert Comm(F, B).doit() == 0
  53. assert Comm(B, F).doit() == 0
  54. assert Comm(F, T).doit() == -1
  55. assert Comm(T, F).doit() == 1
  56. assert Comm(B, T).doit() == B*T - T*B
  57. assert Comm(F**2, B).expand(commutator=True).doit() == 0
  58. assert Comm(F**2, T).expand(commutator=True).doit() == -2*F
  59. assert Comm(F, T**2).expand(commutator=True).doit() == -2*T
  60. assert Comm(T**2, F).expand(commutator=True).doit() == 2*T
  61. assert Comm(T**2, F**3).expand(commutator=True).doit() == 2*F*T*F + 2*F**2*T + 2*T*F**2