| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495 |
- """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])
|