o
    8VanC                     @   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 g d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   
   | j d S Nr   )argsself r   =/usr/lib/python3/dist-packages/sympy/physics/quantum/pauli.pyname      
zSigmaOpBase.namec                 C   s   t | jd duS )Nr   F)boolr   r   r   r   r   use_name   s   zSigmaOpBase.use_namec                 C      dS )N)Fr   r   r   r   r   default_args      zSigmaOpBase.default_argsc                 O      t j| g|R i |S N)r   __new__clsr   hintsr   r   r   r(         zSigmaOpBase.__new__c                 K      t dS r   r   r   otherr+   r   r   r   _eval_commutator_BosonOp!      z$SigmaOpBase._eval_commutator_BosonOpN)__name__
__module____qualname____doc__propertyr   r"   classmethodr$   r(   r1   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   r&   r'   r   r(   r)   r   r   r   r(   =   r,   zSigmaX.__new__c                 K   &   | j |j kr
tdS dt t| j  S Nr      r   r   r   r   r/   r   r   r   _eval_commutator_SigmaY@      zSigmaX._eval_commutator_SigmaYc                 K   r:   Nr   r   r   r   r   r/   r   r   r   _eval_commutator_SigmaZF   r?   zSigmaX._eval_commutator_SigmaZc                 K   r-   r   r.   r/   r   r   r   r1   L   r2   zSigmaX._eval_commutator_BosonOpc                 K   r-   r   r.   r/   r   r   r   _eval_anticommutator_SigmaYO   r2   z"SigmaX._eval_anticommutator_SigmaYc                 K   r-   r   r.   r/   r   r   r   _eval_anticommutator_SigmaZR   r2   z"SigmaX._eval_anticommutator_SigmaZc                 C      | S r'   r   r   r   r   r   _eval_adjointU      zSigmaX._eval_adjointc                 G      | j r
dt| j S dS )Nz{\sigma_x^{(%s)}}z
{\sigma_x}r"   strr   r   Zprinterr   r   r   r   _print_contents_latexX      zSigmaX._print_contents_latexc                 G   r#   )NzSigmaX()r   rL   r   r   r   _print_contents^   rH   zSigmaX._print_contentsc                 C   ,   |j r|jrt| jt|d S d S d S Nr<   )
is_Integeris_positiver   r   __pow__intr   er   r   r   _eval_powera      zSigmaX._eval_powerc                 K   s8   | dd}|dkrtddgddggS td| d Nformatsympyr      Representation in format  not implemented.getr   NotImplementedErrorr   optionsr[   r   r   r   _represent_default_basise      zSigmaX._represent_default_basisN)r3   r4   r5   r6   r(   r>   rC   r1   rD   rE   rG   rM   rO   rX   re   r   r   r   r   r   %   s    r   c                   @   `   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      t j| g|R  S r'   r9   r)   r   r   r   r(         zSigmaY.__new__c                 K   r:   r;   r   r   r   r   r/   r   r   r   rC      r?   zSigmaY._eval_commutator_SigmaZc                 K   r:   r@   r=   r/   r   r   r   _eval_commutator_SigmaX   r?   zSigmaY._eval_commutator_SigmaXc                 K   r-   r   r.   r/   r   r   r   _eval_anticommutator_SigmaX   r2   z"SigmaY._eval_anticommutator_SigmaXc                 K   r-   r   r.   r/   r   r   r   rE      r2   z"SigmaY._eval_anticommutator_SigmaZc                 C   rF   r'   r   r   r   r   r   rG      rH   zSigmaY._eval_adjointc                 G   rI   )Nz{\sigma_y^{(%s)}}z
{\sigma_y}rJ   rL   r   r   r   rM      rN   zSigmaY._print_contents_latexc                 G   r#   )NzSigmaY()r   rL   r   r   r   rO      rH   zSigmaY._print_contentsc                 C   rP   rQ   )rR   rS   r   r   rT   rU   rV   r   r   r   rX      rY   zSigmaY._eval_powerc                 K   s:   | dd}|dkrtdt gtdggS td| d )Nr[   r\   r   r^   r_   )ra   r   r   rb   rc   r   r   r   re      s   zSigmaY._represent_default_basisN)r3   r4   r5   r6   r(   rC   rk   rl   rE   rG   rM   rO   rX   re   r   r   r   r   r   n       r   c                   @   rg   )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   rh   r'   r9   r)   r   r   r   r(      ri   zSigmaZ.__new__c                 K   r:   r;   rB   r/   r   r   r   rk      r?   zSigmaZ._eval_commutator_SigmaXc                 K   r:   r@   rj   r/   r   r   r   r>      r?   zSigmaZ._eval_commutator_SigmaYc                 K   r-   r   r.   r/   r   r   r   rl      r2   z"SigmaZ._eval_anticommutator_SigmaXc                 K   r-   r   r.   r/   r   r   r   rD      r2   z"SigmaZ._eval_anticommutator_SigmaYc                 C   rF   r'   r   r   r   r   r   rG      rH   zSigmaZ._eval_adjointc                 G   rI   )Nz{\sigma_z^{(%s)}}z
{\sigma_z}rJ   rL   r   r   r   rM      rN   zSigmaZ._print_contents_latexc                 G   r#   )NzSigmaZ()r   rL   r   r   r   rO      rH   zSigmaZ._print_contentsc                 C   rP   rQ   )rR   rS   r   r   rT   rU   rV   r   r   r   rX      rY   zSigmaZ._eval_powerc                 K   s8   | dd}|dkrtddgddggS td| d )Nr[   r\   r]   r   r^   r_   r`   rc   r   r   r   re      rf   zSigmaZ._represent_default_basisN)r3   r4   r5   r6   r(   rk   r>   rl   rD   rG   rM   rO   rX   re   r   r   r   r   r      rm   r   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   rh   r'   r9   r)   r   r   r   r(     ri   zSigmaMinus.__new__c                 K   s    | j |j kr
tdS t| j  S r   r   r   r   r/   r   r   r   rk     s   z"SigmaMinus._eval_commutator_SigmaXc                 K   "   | j |j kr
tdS tt| j  S r   r=   r/   r   r   r   r>        z"SigmaMinus._eval_commutator_SigmaYc                 K   s   d|  S rQ   r   r/   r   r   r   rC   #  r2   z"SigmaMinus._eval_commutator_SigmaZc                 K   
   t | jS r'   r   r   r/   r   r   r   _eval_commutator_SigmaMinus&     
z&SigmaMinus._eval_commutator_SigmaMinusc                 K   r-   r   r.   r/   r   r   r   rE   )  r2   z&SigmaMinus._eval_anticommutator_SigmaZc                 K   r-   Nr]   r.   r/   r   r   r   rl   ,  r2   z&SigmaMinus._eval_anticommutator_SigmaXc                 K   s   t  td S rv   r   r   r/   r   r   r   rD   /     z&SigmaMinus._eval_anticommutator_SigmaYc                 K   r-   rv   r.   r/   r   r   r   _eval_anticommutator_SigmaPlus2  r2   z)SigmaMinus._eval_anticommutator_SigmaPlusc                 C   rr   r'   )r   r   r   r   r   r   rG   5  ru   zSigmaMinus._eval_adjointc                 C      |j r
|jrtdS d S d S r   rR   rS   r   rV   r   r   r   rX   8     zSigmaMinus._eval_powerc                 G   rI   )Nz{\sigma_-^{(%s)}}z
{\sigma_-}rJ   rL   r   r   r   rM   <  rN   z SigmaMinus._print_contents_latexc                 G   r#   )NzSigmaMinus()r   rL   r   r   r   rO   B  rH   zSigmaMinus._print_contentsc                 K   s8   | dd}|dkrtddgddggS td| d rZ   r`   rc   r   r   r   re   E  rf   z#SigmaMinus._represent_default_basisN)r3   r4   r5   r6   r(   rk   r>   rC   rt   rE   rl   rD   ry   rG   rX   rM   rO   re   r   r   r   r   r      s     r   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   rh   r'   r9   r)   r   r   r   r(   h  ri   zSigmaPlus.__new__c                 K   s   | j |j kr
tdS t| j S r   ro   r/   r   r   r   rk   k  s   
z!SigmaPlus._eval_commutator_SigmaXc                 K   rp   r   r=   r/   r   r   r   r>   q  rq   z!SigmaPlus._eval_commutator_SigmaYc                 K   s   | j |j kr
tdS d|  S r@   )r   r   r/   r   r   r   rC   w  s   z!SigmaPlus._eval_commutator_SigmaZc                 K   rr   r'   rs   r/   r   r   r   rt   }  ru   z%SigmaPlus._eval_commutator_SigmaMinusc                 K   r-   r   r.   r/   r   r   r   rE     r2   z%SigmaPlus._eval_anticommutator_SigmaZc                 K   r-   rv   r.   r/   r   r   r   rl     r2   z%SigmaPlus._eval_anticommutator_SigmaXc                 K   s   t td S rv   rw   r/   r   r   r   rD     s   z%SigmaPlus._eval_anticommutator_SigmaYc                 K   r-   rv   r.   r/   r   r   r   _eval_anticommutator_SigmaMinus  r2   z)SigmaPlus._eval_anticommutator_SigmaMinusc                 C   rr   r'   )r   r   r   r   r   r   rG     ru   zSigmaPlus._eval_adjointc                 C   s   | | S r'   r   )r   r0   r   r   r   	_eval_mul  r2   zSigmaPlus._eval_mulc                 C   rz   r   r{   rV   r   r   r   rX     r|   zSigmaPlus._eval_powerc                 G   rI   )Nz{\sigma_+^{(%s)}}z
{\sigma_+}rJ   rL   r   r   r   rM     rN   zSigmaPlus._print_contents_latexc                 G   r#   )NzSigmaPlus()r   rL   r   r   r   rO     rH   zSigmaPlus._print_contentsc                 K   s8   | dd}|dkrtddgddggS td| d rZ   r`   rc   r   r   r   re     rf   z"SigmaPlus._represent_default_basisN)r3   r4   r5   r6   r(   rk   r>   rC   rt   rE   rl   rD   r}   rG   r~   rX   rM   rO   re   r   r   r   r   r   N  s"    r   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      |dvrt dt| |S N)r   r]   zn must be 0 or 1)
ValueErrorr	   r(   r*   nr   r   r   r(        zSigmaZKet.__new__c                 C   r   r   labelr   r   r   r   r     r    zSigmaZKet.nc                 C      t S r'   )r   r   r   r   r   
dual_class  r%   zSigmaZKet.dual_classc                 C   r-   rQ   r   )r*   r   r   r   r   _eval_hilbert_space  s   zSigmaZKet._eval_hilbert_spacec                 K   s   t | j|jS r'   )r   r   )r   Zbrar+   r   r   r   _eval_innerproduct_SigmaZBra  rx   z&SigmaZKet._eval_innerproduct_SigmaZBrac                 K   s   | j dkr| S td|  S )Nr   rn   )r   r   r   oprd   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]   )r   r   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 r   )r   r   r   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 r   )r   r   r   r   r   r   r   _apply_operator_SigmaMinus     
z$SigmaZKet._apply_operator_SigmaMinusc                 K   s   | j dkr	tdS tdS r   )r   r   r   r   r   r   r   _apply_operator_SigmaPlus  r   z#SigmaZKet._apply_operator_SigmaPlusc                 K   sN   | 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 rZ   )ra   r   r   rb   rc   r   r   r   re     s   *z"SigmaZKet._represent_default_basisN)r3   r4   r5   r6   r(   r7   r   r8   r   r   r   r   r   r   r   r   re   r   r   r   r   r     s     



r   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   r   r   )r   r
   r(   r   r   r   r   r(     r   zSigmaZBra.__new__c                 C   r   r   r   r   r   r   r   r     r    zSigmaZBra.nc                 C   r   r'   )r   r   r   r   r   r     r%   zSigmaZBra.dual_classN)	r3   r4   r5   r6   r(   r7   r   r8   r   r   r   r   r   r     s    

r   c                 C   sT  t | tr
t |tst| |S | j|jkr%| j|jk r t| |S t|| S t | trrt |tr3tdS t |tr?tt| j S t |trLt t| j S t |t	r^tdd t| jd  S t |t
rptdd t| jd  S dS t | trt |trt t| j S t |trtdS t |trtt| j S t |t	rt tdt| j  d S t |t
rttdt| j  d S dS t | trt |trtt| j S t |trt t| j S t |trtdS t |t	rt	| j S t |t
rt
| jS dS t | t	rSt |trtdt| j d S t |tr)t tdt| j  d S t |tr4t	|jS t |t	r>tdS t |t
rQtdd t| jd  S dS t | t
rt |trjtdt| j d S t |tr}ttdt| j  d S t |trt
| j S t |t	rtdt| j d S t |t
rtdS dS | | 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   






















r   c           
      C   s  t | tr| S t | tttfrt| }|dd | jD  S t | tr|  \}}g }|r|	d}t
|ryt |tryt |d try|j|d jkry|	d}t||}| \}}	t|	 }|| }t
|ryt |tryt |d try|j|d jksI|| |s,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 r'   )r   ).0argr   r   r   	<genexpr>  s    z"qsimplify_pauli.<locals>.<genexpr>r   )r   r   r   r   r   typer   r   Zargs_cncpoplenr   r   r   append)
rW   tcZncZnc_sZcurrxyZc1Znc1r   r   r   r   j  sB   





r   N)r6   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   r   r   r   r   r   r   <module>   s"     IFFTZ@i