Qubit Tapering
A compact guide to reducing qubit count via symmetry after fermion-to-qubit encoding.
The quantum simulation pipeline delivers a qubit Hamiltonian — a Pauli sum ready for VQE, QPE, or other quantum algorithms. Before running that algorithm, there is often a hidden opportunity: the encoded Hamiltonian frequently respects symmetries that allow you to permanently remove qubits without losing physics.
This is qubit tapering.
A tapered system needs fewer qubits, smaller circuits, and less quantum noise — a direct path to solving larger problems on near-term quantum hardware. This tutorial covers FockMap’s tapering capabilities: v1 diagonal Z₂ tapering for single-qubit generators, and v2 general Clifford tapering for arbitrary multi-qubit Z₂ symmetries.
Prerequisites: You should have seen a fermion-to-qubit encoding (e.g., Jordan–Wigner or Bravyi–Kitaev) and understand Pauli strings. Read From Molecules to Qubits first if these are unfamiliar.
The Tapering Pipeline
Encoded Hamiltonian → Detect Symmetries → Fix Sectors → Remove Qubits → Tapered Hamiltonian
At each stage, the Pauli sum structure is preserved — you continue to work with exact symbolic operators, not matrices. Only the number of qubits shrinks.
Chapters
| # | Chapter | What you’ll learn |
|---|---|---|
| 1 | Why Tapering? | How encoding creates Z₂ symmetries and why removing qubits is safe |
| 2 | The Diagonal Z₂ Approach | Detecting symmetries, sectors, and fixing eigenvalues |
| 3 | FockMap Implementation | The v1 tapering API in practice with step-by-step examples |
| 4 | General Z₂ and Clifford Tapering | Symplectic representation, general symmetry detection, and the unified pipeline |
Quick Example
open System.Numerics
open Encodings
// A 4-qubit Hamiltonian with diagonal Z₂ symmetries
let h =
[| PauliRegister("ZIZI", Complex(0.8, 0.0))
PauliRegister("ZZII", Complex(-0.4, 0.0))
PauliRegister("IIZZ", Complex(0.3, 0.0)) |]
|> PauliRegisterSequence
// Detect which qubits are diagonal Z₂ symmetric
let symQubits = diagonalZ2SymmetryQubits h
// → [| 0; 1; 2; 3 |]
// Taper qubits 1 and 3 in the +1/−1 sector
let tapered = taperDiagonalZ2 [(1, 1); (3, -1)] h
// → 2 qubits removed, result is a 2-qubit Hamiltonian
Related Resources
- Interactive example: Qubit Tapering Lab
- Full pipeline: From Molecules to Qubits — encoding comes before tapering
- Theory: Why Encodings? — motivation for encoding schemes