Ë
    7^(h  ã                   ó$  — d 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lmZ ddlmZ dd	lmZmZ dd
lmZ ddlmZ ddlmZmZmZmZmZmZmZm Z  ddl!m"Z" g d¢Z# G d„ de«      Z$e$Z% G d„ de«      Z& G d„ de&«      Z' G d„ de&«      Z(y)at  An implementation of qubits and gates acting on them.

Todo:

* Update docstrings.
* Update tests.
* Implement apply using decompose.
* Implement represent using decompose or something smarter. For this to
  work we first have to implement represent for SWAP.
* Decide if we want upper index to be inclusive in the constructor.
* Fix the printing of Rk gates in plotting.
é    )ÚExpr)ÚIÚIntegerÚpi©ÚSymbol)Úexp)ÚMatrix)Úsqrt)Úqapply)ÚQuantumErrorÚQExpr)Úeye)Úmatrix_tensor_product)ÚGateÚHadamardGateÚSwapGateÚOneQubitGateÚCGateÚ	PhaseGateÚTGateÚZGate)Úsign)ÚQFTÚIQFTÚRkGateÚRkc                   óf   — e Zd ZdZdZdZd„ Zed„ «       Ze	d„ «       Z
e	d„ «       Ze	d„ «       Zdd	„Zy
)r   z This is the R_k gate of the QTF.r   ÚRc                 ó,  — t        |«      dk7  rt        d|z  «      ‚|d   }|d   }|dk(  rt        |«      S |dk(  rt        |«      S |dk(  rt	        |«      S | j                  |«      }t        j                  | g|¢­Ž }| j                  |«      |_	        |S )Né   z)Rk gates only take two arguments, got: %rr   é   é   )
Úlenr   r   r   r   Ú
_eval_argsr   Ú__new__Ú_eval_hilbert_spaceÚhilbert_space)ÚclsÚargsÚtargetÚkÚinsts        úW/var/www/skyplay_api_hub/venv/lib/python3.12/site-packages/sympy/physics/quantum/qft.pyr&   zRkGate.__new__1   s£   € Üˆt‹9˜Š>ÜØ;¸dÑBóð ð �a‘ˆØ�‰GˆØ�Š6Ü˜“=Ð Ø�!ŠVÜ˜VÓ$Ð$Ø�!ŠVÜ˜“=Ð Ø�~‰~˜dÓ#ˆÜ�|‰|˜CÐ' $Ò'ˆØ ×4Ñ4°TÓ:ˆÔØˆó    c                 ó,   — t        j                  |«      S ©N)r   r%   )r)   r*   s     r.   r%   zRkGate._eval_argsF   s   € ô ×Ñ Ó%Ð%r/   c                 ó    — | j                   d   S ©Nr"   ©Úlabel©Úselfs    r.   r,   zRkGate.kL   ó   € à�z‰z˜!‰}Ðr/   c                 ó    — | j                   d d S r3   r4   r6   s    r.   ÚtargetszRkGate.targetsP   s   € à�z‰z˜"˜1ˆ~Ðr/   c                 óN   — d| j                   ›dt        | j                  «      ›d�S )Nú$Ú_)Úgate_name_latexÚstrr,   r6   s    r.   Úgate_name_plotzRkGate.gate_name_plotT   s   � à!×1Ó1´3°t·v±vµ;Ð?Ð?r/   c                 óú   — |dk(  rit        ddgdt        t        | j                  «      t	        d«      z  t
        z  t        z  t	        d«      t        | j                  «      z  z  «      gg«      S t        d|z  «      ‚)NÚsympyr"   r   r!   z#Invalid format for the R_k gate: %r)	r
   r	   r   r,   r   r   r   ÚabsÚNotImplementedError)r7   Úformats     r.   Úget_target_matrixzRkGate.get_target_matrixX   st   € Ø�WÒÜ˜A˜q˜6 A¤s¬4°·±«<¼À»
Ñ+BÄ2Ñ+EÄaÑ+GÌÐQRËÔUXÐY]×Y_ÑY_ÓU`ÑI`Ñ+aÓ'bÐ#cÐdÓeÐeÜ!Ø1°FÑ:ó<ð 	<r/   N)rB   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__Ú	gate_namer>   r&   Úclassmethodr%   Úpropertyr,   r:   r@   rF   © r/   r.   r   r   ,   sk   „ Ù*Ø€IØ€Oòð* ñ&ó ð&ð
 ñó ðð ñó ðð ñ@ó ð@ô<r/   r   c                   ól   — e Zd ZdZed„ «       Zd„ Zd„ Zed„ «       Z	ed„ «       Z
ed„ «       Zed„ «       Zy	)
ÚFourierz@Superclass of Quantum Fourier and Inverse Quantum Fourier Gates.c                 ó�   — t        |«      dk7  rt        d|z  «      ‚|d   |d   k\  rt        d«      ‚t        j                  |«      S )Nr!   z*QFT/IQFT only takes two arguments, got: %rr   r"   z!Start must be smaller than finish)r$   r   r   r%   )r7   r*   s     r.   r%   zFourier._eval_argse   sO   € äˆt‹9˜Š>ÜØ<¸tÑCóð ð �‰7�d˜1‘gÒÜÐBÓCÐCÜ�‰˜tÓ$Ð$r/   c                 ó&   —  | j                   di |¤ŽS )Nr1   )Ú_represent_ZGate)r7   Úoptionss     r.   Ú_represent_default_basisz Fourier._represent_default_basiso   s   € Ø$ˆt×$Ñ$Ñ5¨WÑ5Ð5r/   c                 óB  — |j                  dd«      }|dk(  rt        d«      ‚|| j                  k  rt        d|z  «      ‚| j                  }| j                  }t        |«      D ��cg c]0  }t        |«      D �cg c]  }|||z  |z  z  t        |«      z  ‘Œ c}‘Œ2 }}}t        |«      }	| j                  d   dk7  r%t        t        d| j                  d   z  «      |	«      }	| j                  |k  r%t        |	t        d|| j                  z
  z  «      «      }	|	S c c}w c c}}w )z:
            Represents the (I)QFT In the Z Basis
        Únqubitsr   z.The number of qubits must be given as nqubits.z2The number of qubits %r is too small for the gate.r!   )Úgetr   Ú
min_qubitsÚsizeÚomegaÚranger   r
   r5   r   r   )
r7   ÚbasisrT   rW   rZ   r[   ÚjÚiÚarrayFTÚmatrixFTs
             r.   rS   zFourier._represent_ZGater   s3  € ð —+‘+˜i¨Ó+ˆØ�aŠ<ÜØ@óBð Bà�T—_‘_Ò$ÜØDÀwÑNóð ð �y‰yˆØ—
‘
ˆô CHÈÃ+÷OØ=>¬E°$«Kö9Ø'(ð Øˆa‰C�$‰JñÜ˜T›
ó#ô 9ð Oˆñ Oä˜'“?ˆð �:‰:�a‰=˜AÒÜ,¬S°°D·J±J¸q±MÑ1AÓ-BÀHÓMˆHØ�?‰?˜WÒ$Ü,Øœ#˜a '¨D¯O©OÑ";Ñ<Ó=ó?ˆHð ˆùò9ùó Os   Á&DÁ8DÂDÄDc                 óN   — t        | j                  d   | j                  d   «      S )Nr   r"   )r\   r5   r6   s    r.   r:   zFourier.targets�   s   € ä�T—Z‘Z ‘] D§J¡J¨q¡MÓ2Ð2r/   c                 ó    — | j                   d   S r3   r4   r6   s    r.   rY   zFourier.min_qubits“   r8   r/   c                 óF   — d| j                   d   | j                   d   z
  z  S )z"Size is the size of the QFT matrixr!   r"   r   r4   r6   s    r.   rZ   zFourier.size—   s$   € ð �4—:‘:˜a‘= 4§:¡:¨a¡=Ñ0Ñ1Ð1r/   c                 ó   — t        d«      S )Nr[   r   r6   s    r.   r[   zFourier.omegaœ   s   € ä�g‹Ðr/   N)rG   rH   rI   rJ   rL   r%   rU   rS   rM   r:   rY   rZ   r[   rN   r/   r.   rP   rP   b   sq   „ ÙJàñ%ó ð%ò6òð: ñ3ó ð3ð ñó ðð ñ2ó ð2ð ñó ñr/   rP   c                   ó:   — e Zd ZdZd Zd Zd„ Zd„ Zd„ Ze	d„ «       Z
y)r   z&The forward quantum Fourier transform.c           
      ó\  — | j                   d   }| j                   d   }d}t        t        ||«      «      D ]E  }t        |«      |z  }t        ||z
  «      D ]$  }t	        ||z
  dz
  t        ||dz   «      «      |z  }Œ& ŒG t        ||z
  dz  «      D ]  }t        ||z   ||z
  dz
  «      |z  }Œ |S )z%Decomposes QFT into elementary gates.r   r"   r!   )r5   Úreversedr\   r   r   r   r   )r7   ÚstartÚfinishÚcircuitÚlevelr_   s         r.   Ú	decomposezQFT.decompose§   sÎ   € à—
‘
˜1‘ˆØ—‘˜A‘ˆØˆÜœe E¨6Ó2Ó3ò 	MˆEÜ" 5Ó)¨'Ñ1ˆGÜ˜5 5™=Ó)ò M�Ü ¨¡	¨A¡¬v°e¸QÀ¹UÓ/CÓDÀWÑL‘ñMð	Mô ˜ ™¨Ñ*Ó+ò 	BˆAÜ˜q 5™y¨&°1©*°q©.Ó9¸'ÑA‰Gð	Bàˆr/   c                 ó:   — t        | j                  «       |z  «      S r1   )r   rm   )r7   ÚqubitsrT   s      r.   Ú_apply_operator_QubitzQFT._apply_operator_Qubit´   s   € Ü�d—n‘nÓ& vÑ-Ó.Ð.r/   c                 ó&   — t        | j                  Ž S r1   )r   r*   r6   s    r.   Ú_eval_inversezQFT._eval_inverse·   s   € Ü�T—Y‘YÐÐr/   c                 óN   — t        dt        z  t        z  | j                  z  «      S )Nr!   ©r	   r   r   rZ   r6   s    r.   r[   z	QFT.omegaº   s   € ä�1”R‘4œ‘6˜$Ÿ)™)Ñ#Ó$Ð$r/   N)rG   rH   rI   rJ   rK   r>   rm   rp   rr   rM   r[   rN   r/   r.   r   r   ¡   s2   „ Ù0à€IØ€Oòò/ò ð ñ%ó ñ%r/   r   c                   ó4   — e Zd ZdZd ZdZd„ Zd„ Zed„ «       Z	y)r   z&The inverse quantum Fourier transform.z
{QFT^{-1}}c           
      ó^  — | j                   d   }| j                   d   }d}t        ||z
  dz  «      D ]  }t        ||z   ||z
  dz
  «      |z  }Œ t        ||«      D ]O  }t        t        ||z
  «      «      D ]%  }t	        ||z
  dz
  t        || dz
  «      «      |z  }Œ' t        |«      |z  }ŒQ |S )z&Decomposes IQFT into elementary gates.r   r"   r!   )r*   r\   r   rh   r   r   r   )r7   ri   rj   rk   r_   rl   s         r.   rm   zIQFT.decomposeÅ   sÎ   € à—	‘	˜!‘ˆØ—‘˜1‘ˆØˆÜ˜ ™¨Ñ*Ó+ò 	BˆAÜ˜q 5™y¨&°1©*°q©.Ó9¸'ÑA‰Gð	Bä˜5 &Ó)ò 	2ˆEÜœe E¨E¡MÓ2Ó3ò N�Ü ¨¡	¨A¡¬v°e¸a¸RÀ!¹VÓ/DÓEÀgÑM‘ðNä" 5Ó)¨'Ñ1‰Gð	2ð ˆr/   c                 ó&   — t        | j                  Ž S r1   )r   r*   r6   s    r.   rr   zIQFT._eval_inverseÒ   s   € Ü�D—I‘IˆÐr/   c                 óN   — t        dt        z  t        z  | j                  z  «      S )Néþÿÿÿrt   r6   s    r.   r[   z
IQFT.omegaÕ   s   € ä�2”b‘5œ‘7˜4Ÿ9™9Ñ$Ó%Ð%r/   N)
rG   rH   rI   rJ   rK   r>   rm   rr   rM   r[   rN   r/   r.   r   r   ¿   s-   „ Ù0à€IØ"€Oòòð ñ&ó ñ&r/   r   N))rJ   Úsympy.core.exprr   Úsympy.core.numbersr   r   r   Úsympy.core.symbolr   Ú&sympy.functions.elementary.exponentialr	   Úsympy.matrices.denser
   Úsympy.functionsr   Úsympy.physics.quantum.qapplyr   Úsympy.physics.quantum.qexprr   r   Úsympy.matricesr   Ú#sympy.physics.quantum.tensorproductr   Úsympy.physics.quantum.gater   r   r   r   r   r   r   r   Ú$sympy.functions.elementary.complexesr   Ú__all__r   r   rP   r   r   rN   r/   r.   ú<module>r‡      s�   ðñõ !ß /Ñ /Ý $Ý 6Ý 'Ý  å /ß ;Ý Ý E÷÷ ó õ 6ò€ô0<ˆ\ô 0<ðf €ô<ˆdô <ô~%ˆ'ô %ô<&ˆ7õ &r/   