ó
¡¼™\c           @  st   d  Z  d d l m Z m Z d d l m Z d d l m Z d g Z d e f d „  ƒ  YZ	 d e _
 d „  e _ d S(	   s   Hermitian conjugation.iÿÿÿÿ(   t   print_functiont   division(   t   Expr(   t   adjointt   Daggerc           B  s   e  Z d  Z d „  Z RS(   sQ  General Hermitian conjugate operation.

    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.

    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
    c         C  sq   t  | d ƒ r | j ƒ  } n3 t  | d ƒ rQ t  | d ƒ rQ | j ƒ  j ƒ  } n  | d  k	 ra | St j |  | ƒ S(   NR   t	   conjugatet	   transpose(   t   hasattrR   R   R   t   NoneR   t   __new__(   t   clst   argt   obj(    (    s;   lib/python2.7/site-packages/sympy/physics/quantum/dagger.pyR	   O   s    (   t   __name__t
   __module__t   __doc__R	   (    (    (    s;   lib/python2.7/site-packages/sympy/physics/quantum/dagger.pyR      s   @c         C  s   d | j  |  j d ƒ S(   Ns
   Dagger(%s)i    (   t   _printt   args(   t   at   b(    (    s;   lib/python2.7/site-packages/sympy/physics/quantum/dagger.pyt   <lambda>Y   t    N(   R   t
   __future__R    R   t
   sympy.coreR   t$   sympy.functions.elementary.complexesR   t   __all__R   R   t
   _sympyrepr(    (    (    s;   lib/python2.7/site-packages/sympy/physics/quantum/dagger.pyt   <module>   s   	K	