
    \h                     $   S r SSKJr  SSKJrJrJr  SSKJr  SSK	J
r
  SSKJr  SSKJr  SSKJr  SS	KJrJr  SS
KJr  SSKJr  SSKJrJrJrJrJrJrJrJ r   SSK!J"r"  / SQr# " S S\5      r$\$r% " S S\5      r& " S S\&5      r' " S S\&5      r(g)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                   p    \ rS rSrSrSrSrS r\S 5       r	\
S 5       r\
S 5       r\
S	 5       rSS
 jrSrg)r   ,   z This is the R_k gate of the QTF.r   Rc                 6   [        U5      S:w  a  [        SU-  5      eUS   nUS   nUS:X  a  [        U5      $ US:X  a  [        U5      $ US:X  a  [	        U5      $ U R                  U5      n[        R                  " U /UQ76 nU R                  U5      Ul	        U$ )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        Q/var/www/auris/envauris/lib/python3.13/site-packages/sympy/physics/quantum/qft.pyr'   RkGate.__new__1   s    t9>;dB  aG6= !VV$$!V= ~~d#||C'$' 44T:    c                 .    [         R                  " U5      $ N)r   r&   )r*   r+   s     r/   r&   RkGate._eval_argsF   s     %%r1   c                      U R                   S   $ Nr#   labelselfs    r/   r-   RkGate.kL       zz!}r1   c                      U R                   S S $ r6   r7   r9   s    r/   targetsRkGate.targetsP   s    zz"1~r1   c                 R    SU R                   < S[        U R                  5      < S3$ )N$_)gate_name_latexstrr-   r9   s    r/   gate_name_plotRkGate.gate_name_plotT   s    !113tvv;??r1   c                     US:X  ai  [        SS/S[        [        U R                  5      [	        S5      -  [
        -  [        -  [	        S5      [        U R                  5      -  -  5      //5      $ [        SU-  5      e)Nsympyr#   r   r"   z#Invalid format for the R_k gate: %r)	r
   r	   r   r-   r   r   r   absNotImplementedError)r:   formats     r/   get_target_matrixRkGate.get_target_matrixX   st    WAq6As4<
+B2+Ea+GQRUXY]Y_Y_U`I`+a'b#cdee!1F:< 	<r1    N)rH   )__name__
__module____qualname____firstlineno____doc__	gate_namerC   r'   classmethodr&   propertyr-   r>   rE   rL   __static_attributes__rN   r1   r/   r   r   ,   sk    *IO* & &
     @ @<r1   r   c                   t    \ rS rSrSr\S 5       rS rS r\	S 5       r
\	S 5       r\	S 5       r\	S	 5       rS
rg)Fourierb   z@Superclass of Quantum Fourier and Inverse Quantum Fourier Gates.c                     [        U5      S:w  a  [        SU-  5      eUS   US   :  a  [        S5      e[        R                  " U5      $ )Nr"   z*QFT/IQFT only takes two arguments, got: %rr   r#   z!Start must be smaller than finish)r%   r   r   r&   )r:   r+   s     r/   r&   Fourier._eval_argse   sO    t9><tC  7d1gBCCt$$r1   c                 &    U R                   " S0 UD6$ )Nr3   )_represent_ZGate)r:   optionss     r/   _represent_default_basis Fourier._represent_default_basiso   s    $$5W55r1   c                 P   UR                  SS5      nUS:X  a  [        S5      eX0R                  :  a  [        SU-  5      eU R                  nU R                  n[        U5       VVs/ s H3  n[        U5       Vs/ s H  nUXv-  U-  -  [        U5      -  PM     snPM5     nnn[        U5      n	U R                  S   S:w  a%  [        [        SU R                  S   -  5      U	5      n	U R                  U:  a$  [        U	[        SX0R                  -
  -  5      5      n	U	$ s  snf s  snnf )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
   r8   r   r   )
r:   basisr_   rc   rf   rg   jiarrayFTmatrixFTs
             r/   r^   Fourier._represent_ZGater   s4    ++i+a<@B B__$DwN  yy

 CH+OBMQE$K9,7q C$JT
#,79BM 	 O'? ::a=A,SDJJqM1A-BHMH??W$,#a'OO";<=?H 9 Os   'D": DD"D"c                 N    [        U R                  S   U R                  S   5      $ )Nr   r#   )rh   r8   r9   s    r/   r>   Fourier.targets   s    TZZ]DJJqM22r1   c                      U R                   S   $ r6   r7   r9   s    r/   re   Fourier.min_qubits   r<   r1   c                 F    SU R                   S   U R                   S   -
  -  $ )z"Size is the size of the QFT matrixr"   r#   r   r7   r9   s    r/   rf   Fourier.size   s$     4::a=4::a=011r1   c                     [        S5      $ )Nrg   r   r9   s    r/   rg   Fourier.omega   s    gr1   rN   N)rO   rP   rQ   rR   rS   rU   r&   r`   r^   rV   r>   re   rf   rg   rW   rN   r1   r/   rY   rY   b   sq    J% %6: 3 3   2 2  r1   rY   c                   B    \ rS rSrSrS rS rS rS rS r	\
S 5       rSrg)	r      z&The forward quantum Fourier transform.c           
      Z   U R                   S   nU R                   S   nSn[        [        X5      5       HE  n[        U5      U-  n[        XA-
  5       H#  n[	        XE-
  S-
  [        XES-   5      5      U-  nM%     MG     [        X!-
  S-  5       H  n[        XQ-   X%-
  S-
  5      U-  nM     U$ )z%Decomposes QFT into elementary gates.r   r#   r"   )r8   reversedrh   r   r   r   r   )r:   startfinishcircuitlevelrk   s         r/   	decomposeQFT.decompose   s    

1AeE23E"5)'1G5=)	AveU/CDWL * 4 *+Aqy&*q.9'AG ,r1   c                 :    [        U R                  5       U-  5      $ r3   )r   r   )r:   qubitsr_   s      r/   _apply_operator_QubitQFT._apply_operator_Qubit   s    dnn&v-..r1   c                 &    [        U R                  6 $ r3   )r   r+   r9   s    r/   _eval_inverseQFT._eval_inverse   s    TYYr1   c                 N    [        S[        -  [        -  U R                  -  5      $ )Nr"   r	   r   r   rf   r9   s    r/   rg   	QFT.omega   s    1R46$))#$$r1   rN   N)rO   rP   rQ   rR   rS   rT   rC   r   r   r   rV   rg   rW   rN   r1   r/   r   r      s2    0IO/  % %r1   r   c                   <    \ rS rSrSrS rSrS rS r\	S 5       r
Srg)	r      z&The inverse quantum Fourier transform.z
{QFT^{-1}}c           
      \   U R                   S   nU R                   S   nSn[        X!-
  S-  5       H  n[        XA-   X$-
  S-
  5      U-  nM     [        X5       HO  n[        [        XQ-
  5      5       H$  n[	        XT-
  S-
  [        XT* S-
  5      5      U-  nM&     [        U5      U-  nMQ     U$ )z&Decomposes IQFT into elementary gates.r   r#   r"   )r+   rh   r   rz   r   r   r   )r:   r{   r|   r}   rk   r~   s         r/   r   IQFT.decompose   s    		!1*+Aqy&*q.9'AG ,5)EeEM23	AveR!V/DEgM 4"5)'1G * r1   c                 &    [        U R                  6 $ r3   )r   r+   r9   s    r/   r   IQFT._eval_inverse   s    DIIr1   c                 N    [        S[        -  [        -  U R                  -  5      $ )Nr   r9   s    r/   rg   
IQFT.omega   s    2b57499$%%r1   rN   N)rO   rP   rQ   rR   rS   rT   rC   r   r   rV   rg   rW   rN   r1   r/   r   r      s-    0I"O & &r1   r   N))rS   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   rY   r   r   rN   r1   r/   <module>r      s    ! / / $ 6 '   / ;  E   60<\ 0<f <d <~%' %<&7 &r1   