| | """Hermitian conjugation.""" |
| |
|
| | from sympy.core import Expr, sympify |
| | from sympy.functions.elementary.complexes import adjoint |
| |
|
| | __all__ = [ |
| | 'Dagger' |
| | ] |
| |
|
| |
|
| | class Dagger(adjoint): |
| | """General Hermitian conjugate operation. |
| | |
| | Explanation |
| | =========== |
| | |
| | Take the Hermetian conjugate of an argument [1]_. For matrices this |
| | operation is equivalent to transpose and complex conjugate [2]_. |
| | |
| | Parameters |
| | ========== |
| | |
| | arg : Expr |
| | The SymPy expression that we want to take the dagger of. |
| | evaluate : bool |
| | Whether the resulting expression should be directly evaluated. |
| | |
| | Examples |
| | ======== |
| | |
| | Daggering various quantum objects: |
| | |
| | >>> from sympy.physics.quantum.dagger import Dagger |
| | >>> from sympy.physics.quantum.state import Ket, Bra |
| | >>> from sympy.physics.quantum.operator import Operator |
| | >>> Dagger(Ket('psi')) |
| | <psi| |
| | >>> Dagger(Bra('phi')) |
| | |phi> |
| | >>> Dagger(Operator('A')) |
| | Dagger(A) |
| | |
| | Inner and outer products:: |
| | |
| | >>> from sympy.physics.quantum import InnerProduct, OuterProduct |
| | >>> Dagger(InnerProduct(Bra('a'), Ket('b'))) |
| | <b|a> |
| | >>> Dagger(OuterProduct(Ket('a'), Bra('b'))) |
| | |b><a| |
| | |
| | Powers, sums and products:: |
| | |
| | >>> A = Operator('A') |
| | >>> B = Operator('B') |
| | >>> Dagger(A*B) |
| | Dagger(B)*Dagger(A) |
| | >>> Dagger(A+B) |
| | Dagger(A) + Dagger(B) |
| | >>> Dagger(A**2) |
| | Dagger(A)**2 |
| | |
| | Dagger also seamlessly handles complex numbers and matrices:: |
| | |
| | >>> from sympy import Matrix, I |
| | >>> m = Matrix([[1,I],[2,I]]) |
| | >>> m |
| | Matrix([ |
| | [1, I], |
| | [2, I]]) |
| | >>> Dagger(m) |
| | Matrix([ |
| | [ 1, 2], |
| | [-I, -I]]) |
| | |
| | References |
| | ========== |
| | |
| | .. [1] https://en.wikipedia.org/wiki/Hermitian_adjoint |
| | .. [2] https://en.wikipedia.org/wiki/Hermitian_transpose |
| | """ |
| |
|
| | @property |
| | def kind(self): |
| | """Find the kind of a dagger of something (just the kind of the something).""" |
| | return self.args[0].kind |
| |
|
| | def __new__(cls, arg, evaluate=True): |
| | if hasattr(arg, 'adjoint') and evaluate: |
| | return arg.adjoint() |
| | elif hasattr(arg, 'conjugate') and hasattr(arg, 'transpose') and evaluate: |
| | return arg.conjugate().transpose() |
| | return Expr.__new__(cls, sympify(arg)) |
| |
|
| | adjoint.__name__ = "Dagger" |
| | adjoint._sympyrepr = lambda a, b: "Dagger(%s)" % b._print(a.args[0]) |
| |
|