Dressed Gates and Pauli Propagation

qc/mitigation qc/math

The algebra underlying all twirling-based mitigation methods. A gate “dressed” with Paulis on either side is the basic operation that both Pauli Twirling and Samplomatic rely on.

Dressed gate definition

For any -qubit unitary , a dressed version is:

where and are products of single-qubit unitaries. The dressing is invariant when:

This means the gate’s logical action is unchanged, but any noise attached to gets twirled by and .

Clifford conjugation rule

For any Pauli and Clifford :

where is another Pauli. Finding given amounts to propagating through . In Qiskit:

Pauli("IX").evolve(U, frame='s')   # returns U·P·U† with correct sign
Pauli.equiv(other)                  # compare up to global phase

CZ propagation table (key rules)

For the CZ gate (used throughout this section’s Ising circuits):

  • Z on either qubit → passes through unchanged
  • X or Y on one qubit → picks up a Z on the other qubit
  • The pair XY ↔ YX picks up a minus sign

This asymmetry is why CZ is symmetric (both qubits play equal roles) while CX is not.

# Examples
CZ · IX · CZ = ZX    (X on q0 picks up Z on q1)
CZ · XI · CZ = XZ    (X on q1 picks up Z on q0)
CZ · IZ · CZ = IZ    (Z passes through)
CZ · ZI · CZ = ZI    (Z passes through)

Two maps from the propagation table

MapContainsUsed for
cz_twirl_map (unsigned)What to physically apply as dressing
cz_commutation_mapPropagation rules including sign

The sign does not affect gate invariance (absorbed as global phase) but does matter when propagating Paulis through a circuit to track observable modifications (as in PNA).

Scale of application

The same Clifford conjugation operation is used at every level, only the scope differs:

MethodScope
twirling.enable_gates in EstimatorOptionsWhole circuit, uniform
Twirl box in SamplomaticPer box (layer or gate)
PNA propagationPer box, forward through entire circuit into observable

Qiskit helpers

from qiskit.quantum_info import Pauli
 
# Propagate P through U: returns ±P'
result = Pauli("IX").evolve(cz_layer, frame='s')
result.to_label()    # e.g. "+ZX" or "-YX"
 
# Compare up to global phase
Pauli("ZX").equiv(Pauli("-ZX"))   # True

Self-Check

  • Could you explain what “dressing” a gate means and why the dressing has to be invariant?
  • Why does propagating a Pauli through a CZ sometimes pick up a minus sign, and why does that sign matter for PNA but not for basic twirling?
  • What’s the one operation (Clifford conjugation) that shows up at every scale, from whole-circuit twirling to per-box Samplomatic to PNA?