B
    [nC                 @   s  d Z ddlmZmZmZmZmZmZ ddlm	Z	m
Z
mZ ddlmZ ddlmZ ddlmZ ddd	d
ddddgZG dd de	ZG dd deZG dd deZG dd	 d	eZG dd
 d
eZG dd deZG dd de
ZG dd deZdd Zdd ZdS )zPauli operators and states    )IMulAddPowexpInteger)OperatorKetBra)ComplexSpace)Matrix)KroneckerDeltaSigmaXSigmaYSigmaZ
SigmaMinus	SigmaPlus	SigmaZKet	SigmaZBraqsimplify_paulic               @   sD   e Zd ZdZedd Zedd Zedd Zdd	 Z	d
d Z
dS )SigmaOpBasez Pauli sigma operator, base classc             C   s
   | j d S )Nr   )args)self r   :lib/python3.7/site-packages/sympy/physics/quantum/pauli.pyname   s    zSigmaOpBase.namec             C   s   t | jd dk	S )Nr   F)boolr   )r   r   r   r   use_name   s    zSigmaOpBase.use_namec             C   s   dS )N)Fr   )r   r   r   r   default_args   s    zSigmaOpBase.default_argsc             O   s   t j| f||S )N)r   __new__)clsr   hintsr   r   r   r      s    zSigmaOpBase.__new__c             K   s   t dS )Nr   )r   )r   otherr!   r   r   r   _eval_commutator_BosonOp!   s    z$SigmaOpBase._eval_commutator_BosonOpN)__name__
__module____qualname____doc__propertyr   r   classmethodr   r   r#   r   r   r   r   r      s   r   c               @   sh   e Zd ZdZdd Zdd Zdd Zdd	 Zd
d Zdd Z	dd Z
dd Zdd Zdd Zdd ZdS )r   a  Pauli sigma x operator

    Parameters
    ==========

    name : str
        An optional string that labels the operator. Pauli operators with
        different names commute.

    Examples
    ========

    >>> from sympy.physics.quantum import represent
    >>> from sympy.physics.quantum.pauli import SigmaX
    >>> sx = SigmaX()
    >>> sx
    SigmaX()
    >>> represent(sx)
    Matrix([
    [0, 1],
    [1, 0]])
    c             O   s   t j| f||S )N)r   r   )r    r   r!   r   r   r   r   =   s    zSigmaX.__new__c             K   s*   | j |j krtdS dt t| j  S d S )Nr      )r   r   r   r   )r   r"   r!   r   r   r   _eval_commutator_SigmaY@   s    zSigmaX._eval_commutator_SigmaYc             K   s*   | j |j krtdS dt t| j  S d S )Nr   )r   r   r   r   )r   r"   r!   r   r   r   _eval_commutator_SigmaZF   s    zSigmaX._eval_commutator_SigmaZc             K   s   t dS )Nr   )r   )r   r"   r!   r   r   r   r#   L   s    zSigmaX._eval_commutator_BosonOpc             K   s   t dS )Nr   )r   )r   r"   r!   r   r   r   _eval_anticommutator_SigmaYO   s    z"SigmaX._eval_anticommutator_SigmaYc             K   s   t dS )Nr   )r   )r   r"   r!   r   r   r   _eval_anticommutator_SigmaZR   s    z"SigmaX._eval_anticommutator_SigmaZc             C   s   | S )Nr   )r   r   r   r   _eval_adjointU   s    zSigmaX._eval_adjointc             G   s   | j rdt| j S dS d S )Nz{\sigma_x^{(%s)}}z
{\sigma_x})r   strr   )r   printerr   r   r   r   _print_contents_latexX   s    zSigmaX._print_contents_latexc             G   s   dS )NzSigmaX()r   )r   r2   r   r   r   r   _print_contents^   s    zSigmaX._print_contentsc             C   s(   |j r$|jr$t| jt|d S d S )Nr*   )
is_Integeris_positiver   r   __pow__int)r   er   r   r   _eval_powera   s    zSigmaX._eval_powerc             K   s<   | dd}|dkr(tddgddggS td| d d S )Nformatsympyr      zRepresentation in format z not implemented.)getr   NotImplementedError)r   optionsr;   r   r   r   _represent_default_basise   s
    zSigmaX._represent_default_basisN)r$   r%   r&   r'   r   r+   r-   r#   r.   r/   r0   r3   r4   r:   rA   r   r   r   r   r   %   s   c               @   s`   e Zd ZdZdd Zdd Zdd Zdd	 Zd
d Zdd Z	dd Z
dd Zdd Zdd ZdS )r   a  Pauli sigma y operator

    Parameters
    ==========

    name : str
        An optional string that labels the operator. Pauli operators with
        different names commute.

    Examples
    ========

    >>> from sympy.physics.quantum import represent
    >>> from sympy.physics.quantum.pauli import SigmaY
    >>> sy = SigmaY()
    >>> sy
    SigmaY()
    >>> represent(sy)
    Matrix([
    [0, -I],
    [I,  0]])
    c             O   s   t j| f| S )N)r   r   )r    r   r!   r   r   r   r      s    zSigmaY.__new__c             K   s*   | j |j krtdS dt t| j  S d S )Nr   r*   )r   r   r   r   )r   r"   r!   r   r   r   r-      s    zSigmaY._eval_commutator_SigmaZc             K   s*   | j |j krtdS dt t| j  S d S )Nr   r,   )r   r   r   r   )r   r"   r!   r   r   r   _eval_commutator_SigmaX   s    zSigmaY._eval_commutator_SigmaXc             K   s   t dS )Nr   )r   )r   r"   r!   r   r   r   _eval_anticommutator_SigmaX   s    z"SigmaY._eval_anticommutator_SigmaXc             K   s   t dS )Nr   )r   )r   r"   r!   r   r   r   r/      s    z"SigmaY._eval_anticommutator_SigmaZc             C   s   | S )Nr   )r   r   r   r   r0      s    zSigmaY._eval_adjointc             G   s   | j rdt| j S dS d S )Nz{\sigma_y^{(%s)}}z
{\sigma_y})r   r1   r   )r   r2   r   r   r   r   r3      s    zSigmaY._print_contents_latexc             G   s   dS )NzSigmaY()r   )r   r2   r   r   r   r   r4      s    zSigmaY._print_contentsc             C   s(   |j r$|jr$t| jt|d S d S )Nr*   )r5   r6   r   r   r7   r8   )r   r9   r   r   r   r:      s    zSigmaY._eval_powerc             K   s>   | dd}|dkr*tdt gtdggS td| d d S )Nr;   r<   r   zRepresentation in format z not implemented.)r>   r   r   r?   )r   r@   r;   r   r   r   rA      s
    zSigmaY._represent_default_basisN)r$   r%   r&   r'   r   r-   rB   rC   r/   r0   r3   r4   r:   rA   r   r   r   r   r   n   s   c               @   s`   e Zd ZdZdd Zdd Zdd Zdd	 Zd
d Zdd Z	dd Z
dd Zdd Zdd ZdS )r   a  Pauli sigma z operator

    Parameters
    ==========

    name : str
        An optional string that labels the operator. Pauli operators with
        different names commute.

    Examples
    ========

    >>> from sympy.physics.quantum import represent
    >>> from sympy.physics.quantum.pauli import SigmaZ
    >>> sz = SigmaZ()
    >>> sz ** 3
    SigmaZ()
    >>> represent(sz)
    Matrix([
    [1,  0],
    [0, -1]])
    c             O   s   t j| f| S )N)r   r   )r    r   r!   r   r   r   r      s    zSigmaZ.__new__c             K   s*   | j |j krtdS dt t| j  S d S )Nr   r*   )r   r   r   r   )r   r"   r!   r   r   r   rB      s    zSigmaZ._eval_commutator_SigmaXc             K   s*   | j |j krtdS dt t| j  S d S )Nr   r,   )r   r   r   r   )r   r"   r!   r   r   r   r+      s    zSigmaZ._eval_commutator_SigmaYc             K   s   t dS )Nr   )r   )r   r"   r!   r   r   r   rC      s    z"SigmaZ._eval_anticommutator_SigmaXc             K   s   t dS )Nr   )r   )r   r"   r!   r   r   r   r.      s    z"SigmaZ._eval_anticommutator_SigmaYc             C   s   | S )Nr   )r   r   r   r   r0      s    zSigmaZ._eval_adjointc             G   s   | j rdt| j S dS d S )Nz{\sigma_z^{(%s)}}z
{\sigma_z})r   r1   r   )r   r2   r   r   r   r   r3      s    zSigmaZ._print_contents_latexc             G   s   dS )NzSigmaZ()r   )r   r2   r   r   r   r   r4      s    zSigmaZ._print_contentsc             C   s(   |j r$|jr$t| jt|d S d S )Nr*   )r5   r6   r   r   r7   r8   )r   r9   r   r   r   r:      s    zSigmaZ._eval_powerc             K   s<   | dd}|dkr(tddgddggS td| d d S )Nr;   r<   r=   r   zRepresentation in format z not implemented.)r>   r   r?   )r   r@   r;   r   r   r   rA      s
    zSigmaZ._represent_default_basisN)r$   r%   r&   r'   r   rB   r+   rC   r.   r0   r3   r4   r:   rA   r   r   r   r   r      s   c               @   s   e Zd ZdZdd Zdd Zdd Zdd	 Zd
d Zdd Z	dd Z
dd Zdd Zdd Zdd Zdd Zdd Zdd ZdS )r   a  Pauli sigma minus operator

    Parameters
    ==========

    name : str
        An optional string that labels the operator. Pauli operators with
        different names commute.

    Examples
    ========

    >>> from sympy.physics.quantum import represent, Dagger
    >>> from sympy.physics.quantum.pauli import SigmaMinus
    >>> sm = SigmaMinus()
    >>> sm
    SigmaMinus()
    >>> Dagger(sm)
    SigmaPlus()
    >>> represent(sm)
    Matrix([
    [0, 0],
    [1, 0]])
    c             O   s   t j| f| S )N)r   r   )r    r   r!   r   r   r   r     s    zSigmaMinus.__new__c             K   s$   | j |j krtdS t| j  S d S )Nr   )r   r   r   )r   r"   r!   r   r   r   rB     s    z"SigmaMinus._eval_commutator_SigmaXc             K   s&   | j |j krtdS tt| j  S d S )Nr   )r   r   r   r   )r   r"   r!   r   r   r   r+     s    z"SigmaMinus._eval_commutator_SigmaYc             K   s   d|  S )Nr*   r   )r   r"   r!   r   r   r   r-   #  s    z"SigmaMinus._eval_commutator_SigmaZc             K   s
   t | jS )N)r   r   )r   r"   r!   r   r   r   _eval_commutator_SigmaMinus&  s    z&SigmaMinus._eval_commutator_SigmaMinusc             K   s   t dS )Nr   )r   )r   r"   r!   r   r   r   r/   )  s    z&SigmaMinus._eval_anticommutator_SigmaZc             K   s   t dS )Nr=   )r   )r   r"   r!   r   r   r   rC   ,  s    z&SigmaMinus._eval_anticommutator_SigmaXc             K   s   t  td S )Nr=   )r   r   )r   r"   r!   r   r   r   r.   /  s    z&SigmaMinus._eval_anticommutator_SigmaYc             K   s   t dS )Nr=   )r   )r   r"   r!   r   r   r   _eval_anticommutator_SigmaPlus2  s    z)SigmaMinus._eval_anticommutator_SigmaPlusc             C   s
   t | jS )N)r   r   )r   r   r   r   r0   5  s    zSigmaMinus._eval_adjointc             C   s   |j r|jrtdS d S )Nr   )r5   r6   r   )r   r9   r   r   r   r:   8  s    zSigmaMinus._eval_powerc             G   s   | j rdt| j S dS d S )Nz{\sigma_-^{(%s)}}z
{\sigma_-})r   r1   r   )r   r2   r   r   r   r   r3   <  s    z SigmaMinus._print_contents_latexc             G   s   dS )NzSigmaMinus()r   )r   r2   r   r   r   r   r4   B  s    zSigmaMinus._print_contentsc             K   s<   | dd}|dkr(tddgddggS td| d d S )Nr;   r<   r   r=   zRepresentation in format z not implemented.)r>   r   r?   )r   r@   r;   r   r   r   rA   E  s
    z#SigmaMinus._represent_default_basisN)r$   r%   r&   r'   r   rB   r+   r-   rE   r/   rC   r.   rF   r0   r:   r3   r4   rA   r   r   r   r   r      s   c               @   s   e Zd ZdZdd Zdd Zdd Zdd	 Zd
d Zdd Z	dd Z
dd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zd S )!r   a  Pauli sigma plus operator

    Parameters
    ==========

    name : str
        An optional string that labels the operator. Pauli operators with
        different names commute.

    Examples
    ========

    >>> from sympy.physics.quantum import represent, Dagger
    >>> from sympy.physics.quantum.pauli import SigmaPlus
    >>> sp = SigmaPlus()
    >>> sp
    SigmaPlus()
    >>> Dagger(sp)
    SigmaMinus()
    >>> represent(sp)
    Matrix([
    [0, 1],
    [0, 0]])
    c             O   s   t j| f| S )N)r   r   )r    r   r!   r   r   r   r   h  s    zSigmaPlus.__new__c             K   s"   | j |j krtdS t| j S d S )Nr   )r   r   r   )r   r"   r!   r   r   r   rB   k  s    z!SigmaPlus._eval_commutator_SigmaXc             K   s&   | j |j krtdS tt| j  S d S )Nr   )r   r   r   r   )r   r"   r!   r   r   r   r+   q  s    z!SigmaPlus._eval_commutator_SigmaYc             K   s    | j |j krtdS d|  S d S )Nr   r,   )r   r   )r   r"   r!   r   r   r   r-   w  s    z!SigmaPlus._eval_commutator_SigmaZc             K   s
   t | jS )N)r   r   )r   r"   r!   r   r   r   rE   }  s    z%SigmaPlus._eval_commutator_SigmaMinusc             K   s   t dS )Nr   )r   )r   r"   r!   r   r   r   r/     s    z%SigmaPlus._eval_anticommutator_SigmaZc             K   s   t dS )Nr=   )r   )r   r"   r!   r   r   r   rC     s    z%SigmaPlus._eval_anticommutator_SigmaXc             K   s   t td S )Nr=   )r   r   )r   r"   r!   r   r   r   r.     s    z%SigmaPlus._eval_anticommutator_SigmaYc             K   s   t dS )Nr=   )r   )r   r"   r!   r   r   r   _eval_anticommutator_SigmaMinus  s    z)SigmaPlus._eval_anticommutator_SigmaMinusc             C   s
   t | jS )N)r   r   )r   r   r   r   r0     s    zSigmaPlus._eval_adjointc             C   s   | | S )Nr   )r   r"   r   r   r   	_eval_mul  s    zSigmaPlus._eval_mulc             C   s   |j r|jrtdS d S )Nr   )r5   r6   r   )r   r9   r   r   r   r:     s    zSigmaPlus._eval_powerc             G   s   | j rdt| j S dS d S )Nz{\sigma_+^{(%s)}}z
{\sigma_+})r   r1   r   )r   r2   r   r   r   r   r3     s    zSigmaPlus._print_contents_latexc             G   s   dS )NzSigmaPlus()r   )r   r2   r   r   r   r   r4     s    zSigmaPlus._print_contentsc             K   s<   | dd}|dkr(tddgddggS td| d d S )Nr;   r<   r   r=   zRepresentation in format z not implemented.)r>   r   r?   )r   r@   r;   r   r   r   rA     s
    z"SigmaPlus._represent_default_basisN)r$   r%   r&   r'   r   rB   r+   r-   rE   r/   rC   r.   rG   r0   rH   r:   r3   r4   rA   r   r   r   r   r   N  s    c               @   st   e Zd ZdZdd Zedd Zedd Zedd	 Z	d
d Z
dd Zdd Zdd Zdd Zdd Zdd ZdS )r   zKet for a two-level system quantum system.

    Parameters
    ==========

    n : Number
        The state number (0 or 1).

    c             C   s   |dkrt dt| |S )N)r   r=   zn must be 0 or 1)
ValueErrorr	   r   )r    nr   r   r   r     s    zSigmaZKet.__new__c             C   s
   | j d S )Nr   )label)r   r   r   r   rJ     s    zSigmaZKet.nc             C   s   t S )N)r   )r   r   r   r   
dual_class  s    zSigmaZKet.dual_classc             C   s   t dS )Nr*   )r   )r    rK   r   r   r   _eval_hilbert_space  s    zSigmaZKet._eval_hilbert_spacec             K   s   t | j|jS )N)r   rJ   )r   Zbrar!   r   r   r   _eval_innerproduct_SigmaZBra  s    z&SigmaZKet._eval_innerproduct_SigmaZBrac             K   s   | j dkr| S td|  S d S )Nr   rD   )rJ   r   )r   opr@   r   r   r   _apply_operator_SigmaZ  s    
z SigmaZKet._apply_operator_SigmaZc             K   s   | j dkrtdS tdS )Nr   r=   )rJ   r   )r   rO   r@   r   r   r   _apply_operator_SigmaX  s    z SigmaZKet._apply_operator_SigmaXc             K   s$   | j dkrttd S t td S )Nr   r=   )rJ   r   r   )r   rO   r@   r   r   r   _apply_operator_SigmaY  s    z SigmaZKet._apply_operator_SigmaYc             K   s   | j dkrtdS tdS d S )Nr   r=   )rJ   r   r   )r   rO   r@   r   r   r   _apply_operator_SigmaMinus  s    
z$SigmaZKet._apply_operator_SigmaMinusc             K   s   | j dkrtdS tdS d S )Nr   )rJ   r   r   )r   rO   r@   r   r   r   _apply_operator_SigmaPlus  s    
z#SigmaZKet._apply_operator_SigmaPlusc             K   sR   | dd}|dkr>| jdkr.tdgdggS tdgdggS td| d d S )Nr;   r<   r   r=   zRepresentation in format z not implemented.)r>   rJ   r   r?   )r   r@   r;   r   r   r   rA     s
    *z"SigmaZKet._represent_default_basisN)r$   r%   r&   r'   r   r(   rJ   r)   rL   rM   rN   rP   rQ   rR   rS   rT   rA   r   r   r   r   r     s   	c               @   s0   e Zd ZdZdd Zedd Zedd ZdS )	r   z{Bra for a two-level quantum system.

    Parameters
    ==========

    n : Number
        The state number (0 or 1).

    c             C   s   |dkrt dt| |S )N)r   r=   zn must be 0 or 1)rI   r
   r   )r    rJ   r   r   r   r     s    zSigmaZBra.__new__c             C   s
   | j d S )Nr   )rK   )r   r   r   r   rJ     s    zSigmaZBra.nc             C   s   t S )N)r   )r   r   r   r   rL     s    zSigmaZBra.dual_classN)	r$   r%   r&   r'   r   r(   rJ   r)   rL   r   r   r   r   r     s   	c             C   sp  t | trt |tst| |S | j|jkrN| j|jk r@t| |S t|| S nt | trt |trjtdS t |trtt| j S t |trt t| j S t |t	rtdd t| jd  S t |t
rtdd t| jd  S nt | trt |trt t| j S t |tr$tdS t |tr>tt| j S t |t	rft tdt| j  d S t |t
rlttdt| j  d S nt | trt |trtt| j S t |trt t| j S t |trtdS t |t	rt	| j S t |t
rlt
| jS nTt | t	rt |trFtdt| j d S t |trnt tdt| j  d S t |trt	|jS t |t	rtdS t |t
rltdd t| jd  S nt | t
rdt |trtdt| j d S t |trttdt| j  d S t |tr,t
| j S t |t	rNtdt| j d S t |t
rltdS n| | S dS )zO
    Internal helper function for simplifying products of Pauli operators.
    r=   r*   r   N)
isinstancer   r   r   r   r   r   r   r   r   r   )abr   r   r   _qsimplify_pauli_product  s|    









rX   c       
      C   s   t | tr| S t | tttfr:t| }|dd | jD  S t | tr|  \}}g }x|r|	d}xdt
|rt |trt |d tr|j|d jkr|	d}t||}| \}}	t|	 }|| }qfW || qVW t| t|  S | S )a  
    Simplify an expression that includes products of pauli operators.

    Parameters
    ==========

    e : expression
        An expression that contains products of Pauli operators that is
        to be simplified.

    Examples
    ========

    >>> from sympy.physics.quantum.pauli import SigmaX, SigmaY
    >>> from sympy.physics.quantum.pauli import qsimplify_pauli
    >>> sx, sy = SigmaX(), SigmaY()
    >>> sx * sy
    SigmaX()*SigmaY()
    >>> qsimplify_pauli(sx * sy)
    I*SigmaZ()
    c             s   s   | ]}t |V  qd S )N)r   ).0argr   r   r   	<genexpr>  s    z"qsimplify_pauli.<locals>.<genexpr>r   )rU   r   r   r   r   typer   r   Zargs_cncpoplenr   r   rX   append)
r9   tcZncZnc_sZcurrxyZc1Znc1r   r   r   r   j  s,    






N)r'   r<   r   r   r   r   r   r   Zsympy.physics.quantumr   r	   r
   r   Zsympy.matricesr   Z(sympy.functions.special.tensor_functionsr   __all__r   r   r   r   r   r   r   r   rX   r   r   r   r   r   <module>   s"    IFFTZ@i