Dressed Gates and Pauli Propagation
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 phaseCZ 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
| Map | Contains | Used for |
|---|---|---|
cz_twirl_map | (unsigned) | What to physically apply as dressing |
cz_commutation_map | Propagation 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:
| Method | Scope |
|---|---|
twirling.enable_gates in EstimatorOptions | Whole circuit, uniform |
Twirl box in Samplomatic | Per box (layer or gate) |
| PNA propagation | Per 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")) # TrueRelated
- EstimatorOptions and the Five Mitigation Knobs
- Samplomatic — Boxes and Annotations
- PNA — Propagated Noise Absorption
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?