U
    ZÊ¹jbC  ã                   @   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/bwave/python/venv/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   z‚Ket 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 �nôt | tƒrÚt |tƒrhtjS t |tƒr€tt	| jƒ S t |t	ƒršt t| jƒ S t |t
ƒr¸tjt	| jƒd  S t |tƒrÖt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 �nÆt | t	ƒ�rt |tƒ�r¢tt| jƒ S t |tƒ�r¾t t| jƒ S t |t	ƒ�rÐtjS t |t
ƒ�rèt
| jƒ S t |tƒ�rBt| jƒS �n@t | t
ƒ�ržt |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 n¤t | tƒ�r:t |tƒ�rÊtjt	| jƒ d S t |tƒ�rît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
|ƒrÄt |tƒrÄt |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