
    z	i                     f    S 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   " S S	\
5      rg
)zD
Simulator command to perform multiple pauli gates in a single pass
    )CircuitInstruction)XGate)YGate)ZGate)Gate)CircuitErrorc                   T   ^  \ rS rSrSrU 4S jrS rS
S\4S jjrSS jr	S r
S	rU =r$ )	PauliGate   a  A multi-qubit Pauli gate.

This gate exists for optimization purposes for the
quantum statevector simulation, since applying multiple
pauli gates to different qubits at once can be done via
a single pass on the statevector.

The functionality is equivalent to applying
the pauli gates sequentially using standard Qiskit gates.

Can be applied to a :class:`~qiskit.circuit.QuantumCircuit`
with the :meth:`~qiskit.circuit.QuantumCircuit.pauli` method.
c                 <   > [         TU ]  S[        U5      U/5        g )Npauli)super__init__len)selflabel	__class__s     h/home/james-whalen/.local/lib/python3.13/site-packages/qiskit/circuit/library/generalized_gates/pauli.pyr   PauliGate.__init__(   s    #e*ug6    c                 |   SSK JnJn  [        [        [
        S.nU" [        U R                  S   5      S5      nU" X@R                   SU R                  S    S3S9nU R                  S   n[        [        U5      5       H3  u  pxUS:X  a  M  UR                  [        X8   " 5       XG   4S	5      5        M5     XPl        g
)z6
gate pauli (p1 a1,...,pn an) { p1 a1; ... ; pn an; }
r   )QuantumCircuitQuantumRegister)XYZq())nameI N)qiskit.circuitr   r   r   r   r   r   paramsr    	enumeratereversed_appendr   
definition)	r   r   r   gatesr   qcpaulisips	            r   _definePauliGate._define+   s    
 	C%e4CA/5Ayyk4;;q>2B!$DEQhv./DACxJJ)%(*qtgrBC 0 r   	annotatedc                 2    [        U R                  S   5      $ )z$Return inverted pauli gate (itself).r   )r
   r$   )r   r0   s     r   inversePauliGate.inverse=   s    Q((r   c                 R    SSK Jn  U" U R                  S   5      R                  XS9$ )zJReturn a Numpy.array for the pauli gate.
i.e. tensor product of the paulisr   )Pauli)dtypecopy)qiskit.quantum_info.operatorsr5   r$   	__array__)r   r6   r7   r5   s       r   r9   PauliGate.__array__A   s(     	8T[[^$..U.FFr   c                     [        U[        5      (       a(  [        S U 5       5      (       a  U$ [        SU S35      e[        SU S35      e)Nc              3   *   #    U  H	  oS ;   v   M     g7f))r!   r   r   r   Nr"   ).0cs     r   	<genexpr>/PauliGate.validate_parameter.<locals>.<genexpr>K   s     @i,,is   zParameter string z2 should contain only 'I', 'X', 'Y', 'Z' charactersz
Parameter z4 should be a string of 'I', 'X', 'Y', 'Z' characters)
isinstancestrallr   )r   	parameters     r   validate_parameterPauliGate.validate_parameterI   s\    i%%@i@@@  "'	{2de  YK'[\ r   )r(   )F)NN)__name__
__module____qualname____firstlineno____doc__r   r.   boolr2   r9   rE   __static_attributes____classcell__)r   s   @r   r
   r
      s.    7$) )G r   r
   N)rK   !qiskit.circuit.quantumcircuitdatar   'qiskit.circuit.library.standard_gates.xr   'qiskit.circuit.library.standard_gates.yr   'qiskit.circuit.library.standard_gates.zr   qiskit.circuit.gater   qiskit.circuit.exceptionsr   r
   r"   r   r   <module>rU      s+    A 9 9 9 $ 2; ;r   