§
    ¹³ÙgE:  ã                  óº   — d Z ddlmZ ddlmZ ddl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  G d
„ de	¦  «        Z G d„ de¦  «        Z G d„ de¦  «        ZdS )zPhase Gate.é    )Úannotations)ÚexpN)ÚControlledGate)ÚGate)ÚQuantumRegister)ÚParameterValueType)ÚStandardGatec                  ó|   ‡ — e Zd ZdZej        Z	 ddddœdˆ fd	„Zd
„ Z	 	 	 	 ddˆ fd„Z	dd d„Z
d!d„Zdd"d„Zd„ Zˆ xZS )#Ú	PhaseGateu{  Single-qubit rotation about the Z axis.

    This is a diagonal gate. It can be implemented virtually in hardware
    via framechanges (i.e. at zero error and duration).

    Can be applied to a :class:`~qiskit.circuit.QuantumCircuit`
    with the :meth:`~qiskit.circuit.QuantumCircuit.p` method.

    **Circuit symbol:**

    .. code-block:: text

             â”Œâ”€â”€â”€â”€â”€â”€â”�
        q_0: â”¤ P(Î¸) â”œ
             â””â”€â”€â”€â”€â”€â”€â”˜

    **Matrix Representation:**

    .. math::

        P(\theta) =
            \begin{pmatrix}
                1 & 0 \\
                0 & e^{i\theta}
            \end{pmatrix}

    **Examples:**

        .. math::

            P(\theta = \pi) = Z

        .. math::

            P(\theta = \pi/2) = S

        .. math::

            P(\theta = \pi/4) = T

    .. seealso::

        :class:`~qiskit.circuit.library.standard_gates.RZGate`:
        This gate is equivalent to RZ up to a phase factor.

            .. math::

                P(\theta) = e^{i{\theta}/2} RZ(\theta)

        Reference for virtual Z gate implementation:
        `1612.00858 <https://arxiv.org/abs/1612.00858>`_
    NÚdt)ÚdurationÚunitÚthetar   Úlabelú
str | Nonec               óX   •— t          ¦   «                              dd|g|||¬¦  «         dS )zCreate new Phase gate.Úpé   )r   r   r   N)ÚsuperÚ__init__)Úselfr   r   r   r   Ú	__class__s        €ú]/granary/edev/quantum/lib/python3.11/site-packages/qiskit/circuit/library/standard_gates/p.pyr   zPhaseGate.__init__Q   s2   ø€ õ 	‰Œ×Ò˜˜a % °ÀÈtÐÑTÔTÐTÐTÐTó    c                óÊ   — ddl m} ddlm} t	          dd¦  «        } ||| j        ¬¦  «        }|                      |dd| j        d         ¦  «        dg¦  «         || _        d S )Nr   ©ÚQuantumCircuitr   )ÚUGateÚq©Úname)	Úqiskit.circuit.quantumcircuitr   Úur   r   r!   ÚappendÚparamsÚ
definition)r   r   r   r   Úqcs        r   Ú_definezPhaseGate._defineW   s€   € à@Ð@Ð@Ð@Ð@Ð@ØÐÐÐÐÐå˜A˜sÑ#Ô#ˆØˆ^˜A D¤IÐ.Ñ.Ô.ˆØ
�	Š	�%�%˜˜1˜dœk¨!œnÑ-Ô-°¨sÑ3Ô3Ð3ØˆŒˆˆr   r   Únum_ctrl_qubitsÚintÚ
ctrl_stateústr | int | NoneÚ	annotatedúbool | Nonec                ó2  •— |s5|dk    r/t          | j        d         ||¬¦  «        }| j        |j        _        n^|s7|€5|dk    r/t	          | j        d         ||¬¦  «        }| j        |j        _        n%t          ¦   «                              ||||¬¦  «        }|S )a:  Return a (multi-)controlled-Phase gate.

        Args:
            num_ctrl_qubits: number of control qubits.
            label: An optional label for the gate [Default: ``None``]
            ctrl_state: control state expressed as integer,
                string (e.g. ``'110'``), or ``None``. If ``None``, use all 1s.
            annotated: indicates whether the controlled gate should be implemented
                as an annotated gate. If ``None``, this is handled as ``False``.

        Returns:
            ControlledGate: controlled version of this gate.
        r   r   )r   r+   N©r   ©r)   r   r+   r-   )Ú
CPhaseGater%   r   Ú	base_gateÚMCPhaseGater   Úcontrol©r   r)   r   r+   r-   Úgater   s         €r   r5   zPhaseGate.controla   s¯   ø€ ð( ð 	˜_°Ò1Ð1Ý˜dœk¨!œn°EÀjÐQÑQÔQˆDØ#'¤:ˆDŒNÔ Ð Øð 		˜zÐ1°oÈÒ6IÐ6IÝ˜tœ{¨1œ~¨ÀeÐLÑLÔLˆDØ#'¤:ˆDŒNÔ Ð å‘7”7—?’?Ø /ØØ%Ø#ð	 #ñ ô ˆDð ˆr   FÚboolc                ó8   — t          | j        d          ¦  «        S )a  Return inverted Phase gate (:math:`Phase(\lambda)^{\dagger} = Phase(-\lambda)`)

        Args:
            annotated: when set to ``True``, this is typically used to return an
                :class:`.AnnotatedOperation` with an inverse modifier set instead of a concrete
                :class:`.Gate`. However, for this class this argument is ignored as the inverse
                of this gate is always another :class:`.PGate` with an inverse parameter value.

        Returns:
            PGate: inverse gate.
        r   )r   r%   ©r   r-   s     r   ÚinversezPhaseGate.inverse„   s   € õ ˜$œ+ aœ.˜Ñ)Ô)Ð)r   c                ó´   — |du rt          d¦  «        ‚t          | j        d         ¦  «        }t          j        ddgdt          d|z  ¦  «        gg|¬¦  «        S )z(Return a numpy.array for the Phase gate.Fú9unable to avoid copy while creating an array as requestedr   r   ù              ð?©Údtype)Ú
ValueErrorÚfloatr%   ÚnumpyÚarrayr   )r   r@   ÚcopyÚlams       r   Ú	__array__zPhaseGate.__array__’   sZ   € à�5ˆ=ˆ=ÝÐXÑYÔYÐYÝ�D”K ”NÑ#Ô#ˆÝŒ{˜Q ˜F Q­¨B°©H©¬Ð$6Ð7¸uÐEÑEÔEÐEr   ÚexponentrB   c                ó8   — | j         \  }t          ||z  ¦  «        S ©N)r%   r   ©r   rH   r-   r   s       r   ÚpowerzPhaseGate.power™   s   € Ø”;‰ˆÝ˜ EÑ)Ñ*Ô*Ð*r   c                óZ   — t          |t          ¦  «        r|                      |¦  «        S dS ©NF)Ú
isinstancer   Ú_compare_parameters©r   Úothers     r   Ú__eq__zPhaseGate.__eq__�   s-   € Ý�e�YÑ'Ô'ð 	3Ø×+Ò+¨EÑ2Ô2Ð2Øˆur   rJ   )r   r   r   r   ©r   NNN©r)   r*   r   r   r+   r,   r-   r.   ©F©r-   r8   ©NN©rH   rB   r-   r8   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r	   r   Ú_standard_gater   r(   r5   r;   rG   rL   rS   Ú__classcell__©r   s   @r   r   r      s  ø€ € € € € ð3ð 3ðj "Ô+€Nð >BðUØOSÐZ^ðUð Uð Uð Uð Uð Uð Uð Uðð ð ð  !Ø Ø'+Ø!%ð!ð !ð !ð !ð !ð !ð !ðF*ð *ð *ð *ð *ðFð Fð Fð Fð+ð +ð +ð +ð +ðð ð ð ð ð ð r   r   c                  ó€   ‡ — e Zd ZdZej        Z	 	 dddddœdˆ fd„Zd„ Z	 	 	 	 ddˆ fd„Z	dd d„Z
dd„Zdd!d„Zd„ Zˆ xZS )"r2   uì  Controlled-Phase gate.

    This is a diagonal and symmetric gate that induces a
    phase on the state of the target qubit, depending on the control state.

    Can be applied to a :class:`~qiskit.circuit.QuantumCircuit`
    with the :meth:`~qiskit.circuit.QuantumCircuit.cp` method.

    **Circuit symbol:**

    .. code-block:: text


        q_0: â”€â– â”€â”€
              â”‚Î¸
        q_1: â”€â– â”€â”€


    **Matrix representation:**

    .. math::

        CPhase =
            I \otimes |0\rangle\langle 0| + P \otimes |1\rangle\langle 1| =
            \begin{pmatrix}
                1 & 0 & 0 & 0 \\
                0 & 1 & 0 & 0 \\
                0 & 0 & 1 & 0 \\
                0 & 0 & 0 & e^{i\theta}
            \end{pmatrix}

    .. seealso::

        :class:`~qiskit.circuit.library.standard_gates.CRZGate`:
        Due to the global phase difference in the matrix definitions
        of Phase and RZ, CPhase and CRZ are different gates with a relative
        phase difference.
    Nr   ©r   r   Ú_base_labelr   r   r   r   r+   r,   c               ó|   •— t          ¦   «                              dd|gd||t          ||¬¦  «        ||¬¦	  «	         dS )zCreate new CPhase gate.Úcpé   r   r0   ©r)   r   r+   r3   r   r   N©r   r   r   )r   r   r   r+   r   r   rc   r   s          €r   r   zCPhaseGate.__init__Í   sZ   ø€ õ 	‰Œ×ÒØØØˆGØØØ!Ý ¨[Ð9Ñ9Ô9ØØð 	ñ 
	
ô 
	
ð 
	
ð 
	
ð 
	
r   c                ó–  — ddl m} t          dd¦  «        } ||| j        ¬¦  «        }|                     | j        d         dz  d¦  «         |                     dd¦  «         |                     | j        d          dz  d¦  «         |                     dd¦  «         |                     | j        d         dz  d¦  «         || _        dS )z›
        gate cphase(lambda) a,b
        { phase(lambda/2) a; cx a,b;
          phase(-lambda/2) b; cx a,b;
          phase(lambda/2) b;
        }
        r   r   rf   r   r    r   N)r"   r   r   r!   r   r%   Úcxr&   )r   r   r   r'   s       r   r(   zCPhaseGate._defineä   sÊ   € ð 	AÐ@Ð@Ð@Ð@Ð@õ ˜A˜sÑ#Ô#ˆØˆ^˜A D¤IÐ.Ñ.Ô.ˆØ
�ŠˆTŒ[˜Œ^˜aÑ Ñ#Ô#Ð#Ø
�Šˆa�‰ŒˆØ
�ŠˆdŒk˜!Œnˆ_˜qÑ  !Ñ$Ô$Ð$Ø
�Šˆa�‰ŒˆØ
�ŠˆTŒ[˜Œ^˜aÑ Ñ#Ô#Ð#ØˆŒˆˆr   r   r)   r*   r-   r.   c                ó¾   •— |s4|€2t          | j        d         |dz   |¬¦  «        }| j        |j        _        n%t	          ¦   «                              ||||¬¦  «        }|S )á2  Controlled version of this gate.

        Args:
            num_ctrl_qubits: number of control qubits.
            label: An optional label for the gate [Default: ``None``]
            ctrl_state: control state expressed as integer,
                string (e.g.``'110'``), or ``None``. If ``None``, use all 1s.
            annotated: indicates whether the controlled gate should be implemented
                as an annotated gate. If ``None``, this is handled as ``False``.

        Returns:
            ControlledGate: controlled version of this gate.
        Nr   r   ©r)   r   r1   )r4   r%   r   r3   r   r5   r6   s         €r   r5   zCPhaseGate.controlý   sq   ø€ ð( ð 		˜ZÐ/Ý˜tœ{¨1œ~¸ÐQRÑ?RÐZ_Ð`Ñ`Ô`ˆDØ#'¤:ˆDŒNÔ Ð å‘7”7—?’?Ø /ØØ%Ø#ð	 #ñ ô ˆDð ˆr   Fr8   c                óF   — t          | j        d          | j        ¬¦  «        S )zRReturn inverted CPhase gate (:math:`CPhase(\lambda)^{\dagger} = CPhase(-\lambda)`)r   )r+   )r2   r%   r+   r:   s     r   r;   zCPhaseGate.inverse  s   € å˜4œ; qœ>˜/°d´oÐFÑFÔFÐFr   c           	     ó  — |du rt          d¦  «        ‚t          dt          | j        d         ¦  «        z  ¦  «        }| j        r$t          j        g d¢g d¢g d¢ddd|gg|¬¦  «        S t          j        g d¢g d¢dd|dgg d	¢g|¬¦  «        S )
z)Return a numpy.array for the CPhase gate.Fr=   r>   r   )r   r   r   r   )r   r   r   r   )r   r   r   r   r?   )r   r   r   r   )rA   r   rB   r%   r+   rC   rD   )r   r@   rE   Úeiths       r   rG   zCPhaseGate.__array__!  sµ   € à�5ˆ=ˆ=ÝÐXÑYÔYÐYÝ�2�˜dœk¨!œnÑ-Ô-Ñ-Ñ.Ô.ˆØŒ?ð 	Ý”;Ø��˜|˜|˜|¨\¨\¨\¸A¸qÀ!ÀT¸?ÐKÐSXðñ ô ð õ Œ{˜L˜L˜L¨,¨,¨,¸¸A¸tÀQ¸ÈÈÈÐVÐ^cÐdÑdÔdÐdr   rH   rB   c                ó8   — | j         \  }t          ||z  ¦  «        S rJ   )r%   r2   rK   s       r   rL   zCPhaseGate.power,  s   € Ø”;‰ˆÝ˜( UÑ*Ñ+Ô+Ð+r   c                óz   — t          |t          ¦  «        r%|                      |¦  «        o| j        |j        k    S dS rN   )rO   r2   rP   r+   rQ   s     r   rS   zCPhaseGate.__eq__0  s=   € Ý�e�ZÑ(Ô(ð 	[Ø×+Ò+¨EÑ2Ô2ÐZ°t´È%ÔJZÒ7ZÐZØˆur   rX   )r   r   r   r   r+   r,   rT   rU   rV   rW   rY   )rZ   r[   r\   r]   r	   r2   r^   r   r(   r5   r;   rG   rL   rS   r_   r`   s   @r   r2   r2   £   s  ø€ € € € € ð%ð %ðN "Ô,€Nð
 !Ø'+ð	
ð ØØð
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð.ð ð ð6  !Ø Ø'+Ø!%ðð ð ð ð ð ð ð@Gð Gð Gð Gð Gð	eð 	eð 	eð 	eð,ð ,ð ,ð ,ð ,ðð ð ð ð ð ð r   r2   c                  ó`   ‡ — e Zd ZdZ	 	 dddddœdˆ fd„Zd„ Z	 	 	 	 ddˆ fd„Zddd„Zd„ Zˆ xZ	S )r4   u  Multi-controlled-Phase gate.

    This is a diagonal and symmetric gate that induces a
    phase on the state of the target qubit, depending on the state of the control qubits.

    Can be applied to a :class:`~qiskit.circuit.QuantumCircuit`
    with the :meth:`~qiskit.circuit.QuantumCircuit.mcp` method.

    **Circuit symbol:**

    .. code-block:: text

            q_0: â”€â”€â”€â– â”€â”€â”€â”€
                    â”‚
                    .
                    â”‚
        q_(n-1): â”€â”€â”€â– â”€â”€â”€â”€
                 â”Œâ”€â”€â”´â”€â”€â”€â”�
            q_n: â”¤ P(Î») â”œ
                 â””â”€â”€â”€â”€â”€â”€â”˜

    .. seealso::

        :class:`~qiskit.circuit.library.standard_gates.CPhaseGate`:
        The singly-controlled-version of this gate.
    Nr   rb   rF   r   r)   r*   r   r   r+   r,   c               ó‚   •— t          ¦   «                              d|dz   |g|||t          ||¬¦  «        ||¬¦	  «	         dS )zCreate new MCPhase gate.Úmcphaser   r0   rg   Nrh   )	r   rF   r)   r   r+   r   r   rc   r   s	           €r   r   zMCPhaseGate.__init__R  s_   ø€ õ 	‰Œ×ÒØØ˜aÑØˆEØ+ØØ!Ý ¨;Ð7Ñ7Ô7ØØð 	ñ 
	
ô 
	
ð 
	
ð 
	
ð 
	
r   c                ód  — ddl m} t          | j        d¦  «        } ||| j        ¬¦  «        }| j        dk    r!|                     | j        d         d¦  «         | j        dk    r$|                     | j        d         dd¦  «         �n | j        d         }t          |¦  «        t          t          fv r–t          t          | j        ¦  «        ¦  «        }| j        }|}t          | j        ¦  «        D ]5}|                     |d|z  z  ||d¬¦  «         |                     ¦   «         }Œ6|                     |d| j        z  z  |¦  «         n`dd	lm}	 | j        d         d| j        dz
  z  z  }
t%          |
¦  «        } |	|| j        |¦  «        D ]\  }}}|                     |||¦  «         Œ|| _        d S )
Nr   r   r   r    r   rf   F)Úuse_basis_gates)Ú_gray_code_chain)r"   r   r   Ú
num_qubitsr!   r)   r   r%   re   ÚtyperB   r*   ÚlistÚrangeÚmcrzÚpopÚu3rx   r2   Ú_appendr&   )r   r   Úqrr'   rF   Ú
q_controlsÚq_targetÚ
new_targetÚkrx   Ú
scaled_lamÚbottom_gateÚ	operationÚqubitsÚclbitss                  r   r(   zMCPhaseGate._definej  sÖ  € à@Ð@Ð@Ð@Ð@Ð@å˜Tœ_¨cÑ2Ô2ˆØˆ^˜B T¤YÐ/Ñ/Ô/ˆàÔ 1Ò$Ð$Ø�DŠD�”˜Q” Ñ#Ô#Ð#ØÔ 1Ò$Ð$Ø�EŠE�$”+˜a”. ! QÑ'Ô'Ð'Ñ'à”+˜a”.ˆCÝ�C‰yŒy�U¥C˜LÐ(Ð(Ý!¥%¨Ô(<Ñ"=Ô"=Ñ>Ô>�
ØÔ/�Ø%�
Ý˜tÔ3Ñ4Ô4ð 2ð 2�Aà—G’G˜C 1 a¡4™L¨*°jÐRW�GÑXÔXÐXØ!+§¢Ñ!1Ô!1�J�JØ—’�S˜A˜tÔ3Ñ3Ñ4°jÑAÔAÐAÐAà0Ð0Ð0Ð0Ð0Ð0à!œ[¨œ^¨q°TÔ5IÈAÑ5MÑ/NÑO�
Ý(¨Ñ4Ô4�Ø1AÐ1AØ˜Ô,¨kñ2ô 2ð :ð :Ñ-�I˜v vð —J’J˜y¨&°&Ñ9Ô9Ð9Ð9ØˆŒˆˆr   r   r-   r.   c                óÈ   •— |s9|€7t          | j        d         || j        z   |¬¦  «        }| j        |j        _        n%t          ¦   «                              ||||¬¦  «        }|S )rl   Nr   rm   r1   )r4   r%   r)   r   r3   r   r5   r6   s         €r   r5   zMCPhaseGate.control‹  s}   ø€ ð( ð 	˜ZÐ/ÝØ”˜A”Ø /°$Ô2FÑ FØðñ ô ˆDð
 $(¤:ˆDŒNÔ Ð å‘7”7—?’?Ø /ØØ%Ø#ð	 #ñ ô ˆDð ˆr   Fr8   c                óD   — t          | j        d          | j        ¦  «        S )zUReturn inverted MCPhase gate (:math:`MCPhase(\lambda)^{\dagger} = MCPhase(-\lambda)`)r   )r4   r%   r)   r:   s     r   r;   zMCPhaseGate.inverse¯  s   € å˜DœK¨œN˜?¨DÔ,@ÑAÔAÐAr   c                ó–   — t          |t          ¦  «        o4| j        |j        k    o$| j        |j        k    o|                      |¦  «        S rJ   )rO   r4   r)   r+   rP   rQ   s     r   rS   zMCPhaseGate.__eq__³  sQ   € å�u�kÑ*Ô*ð 0ØÔ$¨Ô(=Ò=ð0à” 5Ô#3Ò3ð0ð ×(Ò(¨Ñ/Ô/ð		
r   rX   )rF   r   r)   r*   r   r   r+   r,   rT   rU   rV   rW   )
rZ   r[   r\   r]   r   r(   r5   r;   rS   r_   r`   s   @r   r4   r4   6  sØ   ø€ € € € € ðð ð> !Ø'+ð
ð ØØð
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð0ð ð ðF  !Ø Ø'+Ø!%ð"ð "ð "ð "ð "ð "ð "ðHBð Bð Bð Bð Bð
ð 
ð 
ð 
ð 
ð 
ð 
r   r4   )r]   Ú
__future__r   Úcmathr   rC   Úqiskit.circuit.controlledgater   Úqiskit.circuit.gater   Úqiskit.circuit.quantumregisterr   Ú"qiskit.circuit.parameterexpressionr   Úqiskit._accelerate.circuitr	   r   r2   r4   © r   r   ú<module>r–      s8  ðð Ð à "Ð "Ð "Ð "Ð "Ð "Ø Ð Ð Ð Ð Ð Ø €€€Ø 8Ð 8Ð 8Ð 8Ð 8Ð 8Ø $Ð $Ð $Ð $Ð $Ð $Ø :Ð :Ð :Ð :Ð :Ð :Ø AÐ AÐ AÐ AÐ AÐ AØ 3Ð 3Ð 3Ð 3Ð 3Ð 3ðGð Gð Gð Gð G�ñ Gô Gð GðTPð Pð Pð Pð P�ñ Pô Pð PðfC
ð C
ð C
ð C
ð C
�.ñ C
ô C
ð C
ð C
ð C
r   