U
    9%ebC                     @   s,  d Z ddlmZ ddlmZ ddlmZ ddlmZ ddl	m
Z
 ddl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    )Add)MulI)Pow)S)exp)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   Z/var/www/html/Darija-Ai-API/env/lib/python3.8/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 jS r#   r   Zero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 r#   r   r$   r%   r   r   r   r$   B   s    zSigmaX.__new__c                 K   s(   | j |j krtjS dt t| j  S d S N   r   r   r)   r   r   r*   r   r   r   _eval_commutator_SigmaYE   s    zSigmaX._eval_commutator_SigmaYc                 K   s(   | j |j krtjS dt t| j  S d S Nr   r   r)   r   r   r*   r   r   r   _eval_commutator_SigmaZK   s    zSigmaX._eval_commutator_SigmaZc                 K   s   t jS r#   r(   r*   r   r   r   r,   Q   s    zSigmaX._eval_commutator_BosonOpc                 K   s   t jS r#   r(   r*   r   r   r   _eval_anticommutator_SigmaYT   s    z"SigmaX._eval_anticommutator_SigmaYc                 K   s   t jS r#   r(   r*   r   r   r   _eval_anticommutator_SigmaZW   s    z"SigmaX._eval_anticommutator_SigmaZc                 C   s   | S r#   r   r   r   r   r   _eval_adjointZ   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_latex]   s    zSigmaX._print_contents_latexc                 G   s   dS )NzSigmaX()r   rA   r   r   r   _print_contentsc   s    zSigmaX._print_contentsc                 C   s(   |j r$|jr$t| jt|d S d S r4   )
is_Integeris_positiver   r   __pow__intr   er   r   r   _eval_powerf   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      Representation in format  not implemented.getr   NotImplementedErrorr   optionsrM   r   r   r   _represent_default_basisj   s    zSigmaX._represent_default_basisN)r-   r.   r/   r0   r$   r7   r;   r,   r<   r=   r>   rC   rD   rK   rW   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 r#   r3   r%   r   r   r   r$      s    zSigmaY.__new__c                 K   s(   | j |j krtjS dt t| j  S d S r4   r   r   r)   r   r   r*   r   r   r   r;      s    zSigmaY._eval_commutator_SigmaZc                 K   s(   | j |j krtjS dt t| j  S d S r8   r6   r*   r   r   r   _eval_commutator_SigmaX   s    zSigmaY._eval_commutator_SigmaXc                 K   s   t jS r#   r(   r*   r   r   r   _eval_anticommutator_SigmaX   s    z"SigmaY._eval_anticommutator_SigmaXc                 K   s   t jS r#   r(   r*   r   r   r   r=      s    z"SigmaY._eval_anticommutator_SigmaZc                 C   s   | S r#   r   r   r   r   r   r>      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?   rA   r   r   r   rC      s    zSigmaY._print_contents_latexc                 G   s   dS )NzSigmaY()r   rA   r   r   r   rD      s    zSigmaY._print_contentsc                 C   s(   |j r$|jr$t| jt|d S d S r4   )rE   rF   r   r   rG   rH   rI   r   r   r   rK      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 )NrM   rN   r   rP   rQ   )rS   r   r   rT   rU   r   r   r   rW      s    zSigmaY._represent_default_basisN)r-   r.   r/   r0   r$   r;   rY   rZ   r=   r>   rC   rD   rK   rW   r   r   r   r   r   s   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 r#   r3   r%   r   r   r   r$      s    zSigmaZ.__new__c                 K   s(   | j |j krtjS dt t| j  S d S r4   r:   r*   r   r   r   rY      s    zSigmaZ._eval_commutator_SigmaXc                 K   s(   | j |j krtjS dt t| j  S d S r8   rX   r*   r   r   r   r7      s    zSigmaZ._eval_commutator_SigmaYc                 K   s   t jS r#   r(   r*   r   r   r   rZ      s    z"SigmaZ._eval_anticommutator_SigmaXc                 K   s   t jS r#   r(   r*   r   r   r   r<      s    z"SigmaZ._eval_anticommutator_SigmaYc                 C   s   | S r#   r   r   r   r   r   r>      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?   rA   r   r   r   rC      s    zSigmaZ._print_contents_latexc                 G   s   dS )NzSigmaZ()r   rA   r   r   r   rD      s    zSigmaZ._print_contentsc                 C   s(   |j r$|jr$t| jt|d S d S r4   )rE   rF   r   r   rG   rH   rI   r   r   r   rK      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 )NrM   rN   rO   r   rP   rQ   rR   rU   r   r   r   rW      s    zSigmaZ._represent_default_basisN)r-   r.   r/   r0   r$   rY   r7   rZ   r<   r>   rC   rD   rK   rW   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 r#   r3   r%   r   r   r   r$     s    zSigmaMinus.__new__c                 K   s"   | j |j krtjS t| j  S d S r#   r   r   r)   r   r*   r   r   r   rY     s    z"SigmaMinus._eval_commutator_SigmaXc                 K   s$   | j |j krtjS tt| j  S d S r#   r6   r*   r   r   r   r7   "  s    z"SigmaMinus._eval_commutator_SigmaYc                 K   s   d|  S r4   r   r*   r   r   r   r;   (  s    z"SigmaMinus._eval_commutator_SigmaZc                 K   s
   t | jS r#   r   r   r*   r   r   r   _eval_commutator_SigmaMinus+  s    z&SigmaMinus._eval_commutator_SigmaMinusc                 K   s   t jS r#   r(   r*   r   r   r   r=   .  s    z&SigmaMinus._eval_anticommutator_SigmaZc                 K   s   t jS r#   r   Oner*   r   r   r   rZ   1  s    z&SigmaMinus._eval_anticommutator_SigmaXc                 K   s
   t tj S r#   )r   r   NegativeOner*   r   r   r   r<   4  s    z&SigmaMinus._eval_anticommutator_SigmaYc                 K   s   t jS r#   r_   r*   r   r   r   _eval_anticommutator_SigmaPlus7  s    z)SigmaMinus._eval_anticommutator_SigmaPlusc                 C   s
   t | jS r#   )r   r   r   r   r   r   r>   :  s    zSigmaMinus._eval_adjointc                 C   s   |j r|jrtjS d S r#   rE   rF   r   r)   rI   r   r   r   rK   =  s    zSigmaMinus._eval_powerc                 G   s   | j rdt| j S dS d S )Nz{\sigma_-^{(%s)}}z
{\sigma_-}r?   rA   r   r   r   rC   A  s    z SigmaMinus._print_contents_latexc                 G   s   dS )NzSigmaMinus()r   rA   r   r   r   rD   G  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 rL   rR   rU   r   r   r   rW   J  s    z#SigmaMinus._represent_default_basisN)r-   r.   r/   r0   r$   rY   r7   r;   r^   r=   rZ   r<   rb   r>   rK   rC   rD   rW   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 r#   r3   r%   r   r   r   r$   m  s    zSigmaPlus.__new__c                 K   s    | j |j krtjS t| j S d S r#   r\   r*   r   r   r   rY   p  s    z!SigmaPlus._eval_commutator_SigmaXc                 K   s$   | j |j krtjS tt| j  S d S r#   r6   r*   r   r   r   r7   v  s    z!SigmaPlus._eval_commutator_SigmaYc                 K   s   | j |j krtjS d|  S d S r8   )r   r   r)   r*   r   r   r   r;   |  s    z!SigmaPlus._eval_commutator_SigmaZc                 K   s
   t | jS r#   r]   r*   r   r   r   r^     s    z%SigmaPlus._eval_commutator_SigmaMinusc                 K   s   t jS r#   r(   r*   r   r   r   r=     s    z%SigmaPlus._eval_anticommutator_SigmaZc                 K   s   t jS r#   r_   r*   r   r   r   rZ     s    z%SigmaPlus._eval_anticommutator_SigmaXc                 K   s   t S r#   r   r*   r   r   r   r<     s    z%SigmaPlus._eval_anticommutator_SigmaYc                 K   s   t jS r#   r_   r*   r   r   r   _eval_anticommutator_SigmaMinus  s    z)SigmaPlus._eval_anticommutator_SigmaMinusc                 C   s
   t | jS r#   )r   r   r   r   r   r   r>     s    zSigmaPlus._eval_adjointc                 C   s   | | S r#   r   )r   r+   r   r   r   	_eval_mul  s    zSigmaPlus._eval_mulc                 C   s   |j r|jrtjS d S r#   rc   rI   r   r   r   rK     s    zSigmaPlus._eval_powerc                 G   s   | j rdt| j S dS d S )Nz{\sigma_+^{(%s)}}z
{\sigma_+}r?   rA   r   r   r   rC     s    zSigmaPlus._print_contents_latexc                 G   s   dS )NzSigmaPlus()r   rA   r   r   r   rD     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 rL   rR   rU   r   r   r   rW     s    z"SigmaPlus._represent_default_basisN)r-   r.   r/   r0   r$   rY   r7   r;   r^   r=   rZ   r<   rd   r>   re   rK   rC   rD   rW   r   r   r   r   r   S  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   rO   zn must be 0 or 1)
ValueErrorr
   r$   r&   nr   r   r   r$     s    zSigmaZKet.__new__c                 C   s
   | j d S r   labelr   r   r   r   ri     s    zSigmaZKet.nc                 C   s   t S r#   )r   r   r   r   r   
dual_class  s    zSigmaZKet.dual_classc                 C   s   t dS r4   r   )r&   rk   r   r   r   _eval_hilbert_space  s    zSigmaZKet._eval_hilbert_spacec                 K   s   t | j|jS r#   )r   ri   )r   Zbrar'   r   r   r   _eval_innerproduct_SigmaZBra  s    z&SigmaZKet._eval_innerproduct_SigmaZBrac                 K   s   | j dkr| S tj|  S d S r   )ri   r   ra   r   oprV   r   r   r   _apply_from_right_to_SigmaZ  s    
z%SigmaZKet._apply_from_right_to_SigmaZc                 K   s   | j dkrtdS tdS Nr   rO   )ri   r   ro   r   r   r   _apply_from_right_to_SigmaX  s    z%SigmaZKet._apply_from_right_to_SigmaXc                 K   s$   | j dkrttd S t td S rr   )ri   r   r   ro   r   r   r   _apply_from_right_to_SigmaY  s    z%SigmaZKet._apply_from_right_to_SigmaYc                 K   s   | j dkrtdS tjS d S rr   )ri   r   r   r)   ro   r   r   r   _apply_from_right_to_SigmaMinus  s    
z)SigmaZKet._apply_from_right_to_SigmaMinusc                 K   s   | j dkrtjS tdS d S r   )ri   r   r)   r   ro   r   r   r   _apply_from_right_to_SigmaPlus  s    
z(SigmaZKet._apply_from_right_to_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 rL   )rS   ri   r   rT   rU   r   r   r   rW     s    *z"SigmaZKet._represent_default_basisN)r-   r.   r/   r0   r$   r1   ri   r2   rl   rm   rn   rq   rs   rt   ru   rv   rW   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 rf   )rg   r   r$   rh   r   r   r   r$     s    zSigmaZBra.__new__c                 C   s
   | j d S r   rj   r   r   r   r   ri     s    zSigmaZBra.nc                 C   s   t S r#   )r   r   r   r   r   rl     s    zSigmaZBra.dual_classN)	r-   r.   r/   r0   r$   r1   ri   r2   rl   r   r   r   r   r     s   

c                 C   sF  t | trt |tst| |S | j|jkrN| j|jk r@t| |S t|| S nt | trt |trhtjS t |trtt	| j S t |t	rt t| j S t |t
rtjt	| jd  S t |trtjt	| jd  S nht | tr|t |trt t	| j S t |trtjS t |t	r.tt| j S t |t
rTt tjt	| j  d S t |trBttjt	| j  d S nt | t	rt |trtt| j S t |trt t| j S t |t	rtjS t |t
rt
| j S t |trBt| jS n@t | t
rt |tr.tjt	| j d S t |trTt tjt	| j  d S t |t	rjt
|jS t |t
r|tjS t |trBtjt	| jd  S nt | tr:t |trtjt	| j d S t |trttjt	| j  d S t |t	rt| j S t |t
r&tjt	| j d S t |trBtjS n| | S dS )zO
    Internal helper function for simplifying products of Pauli operators.
    r5   N)
isinstancer   r   r   r   r   r`   r   r   r   r   ZHalfr   r)   )abr   r   r   _qsimplify_pauli_product  s|    








rz   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
|rt |trt |d tr|j|d jkr|	d}t||}| \}}	t|	 }|| }qb|| qTt| 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   )rw   r	   r   r   r   typer   r   Zargs_cncpoplenr   r   rz   append)
rJ   tcncZnc_scurrxyc1Znc1r   r   r   r   o  s2    





N)!r0   Zsympy.core.addr   Zsympy.core.mulr   Zsympy.core.numbersr   Zsympy.core.powerr   Zsympy.core.singletonr   Z&sympy.functions.elementary.exponentialr   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   rz   r   r   r   r   r   <module>   s:         IFFTZ@i