In 2018, John Preskill coined the term NISQ — Noisy Intermediate-Scale Quantum — to describe the era of quantum computing we now inhabit. The phrase captures three essential realities:
In This Chapter
- Learning Objectives
- 18.1 What NISQ Means
- 18.2 Current Hardware Capabilities
- 18.3 The NISQ Algorithm Design Philosophy
- 18.4 Variational Quantum Algorithms: An Overview
- 18.5 Error Mitigation in Depth
- 18.6 The Quantum Volume Metric
- 18.7 The Barren Plateau Problem
- 18.8 Circuit Knitting
- 18.9 Noise Effects on Simple Circuits: A Qiskit Demonstration
- 18.10 Quantum Advantage on NISQ Devices
- 18.11 The Road Ahead
- 18.12 Noise Models: A Deeper Dive
- 18.13 Classical Simulation and Benchmarks
- 18.14 The Error Correction Landscape
- 18.15 The Variational Quantum Eigensolver: A NISQ Case Study
- 18.16 Quantum Volume in Depth
- 18.17 Software Ecosystem for NISQ Computing
Chapter 18: The NISQ Era — Noisy Intermediate-Scale Quantum Computers and the Algorithms Designed for Imperfect Hardware
Learning Objectives
After completing this chapter, you will be able to:
- Define the NISQ era and explain why fault-tolerant quantum computing remains a long-term goal.
- Describe the capabilities and limitations of current quantum hardware (qubit counts, coherence times, gate fidelities).
- Articulate the NISQ algorithm design philosophy: shallow circuits, hybrid classical-quantum loops, and error mitigation.
- Compute and interpret the quantum volume metric.
- Implement noise models in Qiskit and observe their effect on simple circuits.
- Explain circuit knitting and its role in extending NISQ capabilities.
- Analyze the barren plateau problem and its implications for variational algorithms.
- Compare error mitigation techniques: zero-noise extrapolation, probabilistic error cancellation, and readout error mitigation.
- Evaluate the claims and evidence for quantum advantage on NISQ devices.
- Discuss the roadmap from NISQ to fault-tolerant quantum computing.
18.1 What NISQ Means
In 2018, John Preskill coined the term NISQ — Noisy Intermediate-Scale Quantum — to describe the era of quantum computing we now inhabit. The phrase captures three essential realities:
-
Noisy. Gate operations and qubit measurements suffer from errors. Two-qubit gate fidelities hover around 99.0–99.9%, meaning that after a few hundred gates, the probability of an error-free execution becomes vanishingly small. Decoherence times ($T_1$, $T_2$) limit the duration of any computation to tens or hundreds of microseconds.
-
Intermediate-Scale. Current devices contain roughly 50 to 1,000+ qubits. This is far beyond what can be classically simulated by brute force (the state vector of a 50-qubit system requires $2^{50} \approx 10^{15}$ complex amplitudes), yet far short of the millions of logical qubits needed for Shor's algorithm to break RSA-2048.
-
Quantum. These are genuine quantum devices. They exploit superposition, entanglement, and interference. They are not classical simulators.
The NISQ era is therefore a transitional phase. We have devices that can outperform classical computers on certain contrived benchmarks (quantum supremacy experiments), but we cannot yet run the transformative algorithms — Shor's, Grover's at scale, phase estimation for chemistry — that motivated the field. The central question of the NISQ era is: Can we find useful applications for imperfect quantum processors before fault tolerance arrives?
Historical Context. The NISQ concept emerged from a recognition that quantum computing progress would not be a single "quantum leap" from classical to fault-tolerant, but rather a gradual scaling of noisy devices. Preskill's original article (Quantum, 2018) predicted that "NISQ devices will be a scientific playground for developing quantum algorithms and exploring quantum phenomena" but cautioned that "useful applications might or might not arise." This tension between optimism and realism has defined the NISQ era.
18.1.1 Why Fault Tolerance Is Still Far Away
Quantum error correction (QEC) requires encoding each logical qubit into many physical qubits. The surface code, the leading QEC architecture, needs roughly 1,000 physical qubits per logical qubit at current physical error rates. To run Shor's algorithm on RSA-2048, estimates range from $10^6$ to $10^8$ physical qubits. Current devices have $\sim 10^3$ qubits. The gap is two to five orders of magnitude.
Moreover, QEC requires gate fidelities below the threshold (typically $\sim 10^{-3}$ for the surface code). While many platforms now operate near or below threshold, scaling to millions of qubits while maintaining fidelity, connectivity, and control electronics is an enormous engineering challenge. Most estimates place fault-tolerant quantum computing at least a decade away.
Detailed threshold estimates: - Surface code threshold: $\sim 1\%$ error rate for depolarizing noise (Fowler et al., 2012). Current superconducting qubits achieve 0.1-1% two-qubit gate error rates — just at or below threshold. - Logical qubit overhead: At physical error rate $p = 10^{-3}$, achieving logical error rate $p_L = 10^{-6}$ requires code distance $d \approx 33$, which means $d^2 \approx 1,089$ physical qubits per logical qubit. - Total qubit estimate for RSA-2048: Gidney & Ekerå (2021) estimate ~20 million physical qubits, running for ~8 hours. This requires maintaining coherence and gate fidelity across millions of qubits simultaneously — an unprecedented engineering challenge.
Recurring Theme: Noise is the Enemy
Every aspect of NISQ computing is shaped by noise. The algorithms are shallow because deep circuits accumulate too many errors. The error mitigation techniques exist because we can't correct errors. The variational approach works because it minimizes circuit depth. Even the metrics (quantum volume, CLOPS) are designed to account for noise. Understanding noise — its sources, its propagation, and its mitigation — is the single most important skill for working with NISQ devices.
18.2 Current Hardware Capabilities
18.2.1 Qubit Modalities
| Platform | Qubit Count (max) | $T_2$ (typical) | 2-Qubit Gate Fidelity | Connectivity | Key Advantage |
|---|---|---|---|---|---|
| Superconducting (IBM, Google) | 1,121 (IBM Condor) | 100–500 µs | 99.0–99.9% | Fixed lattice | Scalable fabrication |
| Trapped Ions (Quantinuum, IonQ) | 56 (H2) | 1–10 s | 99.5–99.9% | All-to-all | Highest fidelity |
| Neutral Atoms (QuEra, Pasqal) | 256+ | ~1 s | 99.0–99.5% | Reconfigurable | Natural connectivity |
| Photonic (Xanadu, PsiQuantum) | ~100 (squeezed states) | N/A | Variable | All-to-all | Room temperature |
| Silicon Spin (Intel, SQC) | 1–12 | ~1 s | 99.0%+ | Nearest-neighbor | CMOS compatibility |
Superconducting qubits (transmons) are the most mature platform, with IBM leading in qubit count (1,121 qubits on the Condor processor) and Google achieving quantum supremacy in 2019 (53-qubit Sycamore). Their advantages include scalable fabrication using semiconductor processes and fast gate times (10-50 ns). Disadvantages include short coherence times and fixed connectivity requiring SWAP operations for distant qubit pairs.
Trapped ions (Quantinuum, IonQ) hold the record for gate fidelity (99.9%+ for two-qubit gates) and coherence times (seconds). Their all-to-all connectivity eliminates the need for SWAP gates. However, they are limited in qubit count (currently ~50) and have slower gate times (10-100 µs).
Neutral atoms (QuEra, Pasqal) offer a unique combination of large qubit count (256+), reconfigurable connectivity (using optical tweezers to rearrange atoms), and long coherence times. Gate fidelities are improving rapidly (99.5% for two-qubit gates in recent demonstrations).
Try It Yourself: Accessing Real Quantum Hardware
IBM Quantum provides free access to small quantum processors (5-127 qubits) through the IBM Quantum platform. Create an account at quantum-computing.ibm.com, run circuits on real hardware, and compare the results with noiseless simulations. The difference between ideal and noisy outputs will give you an immediate appreciation for the challenges of NISQ computing.
18.2.2 The Noise Budget
A typical superconducting qubit operation incurs:
- Single-qubit gate error: $\epsilon_1 \sim 10^{-4}$ to $10^{-3}$
- Two-qubit gate error: $\epsilon_2 \sim 10^{-3}$ to $10^{-2}$
- Measurement error: $\epsilon_m \sim 10^{-2}$ to $10^{-1}$
- Decoherence error: $\epsilon_{\text{dec}} \approx 1 - e^{-t/T_2}$
For a circuit of depth $D$ with $N$ qubits, the probability of an error-free run is approximately:
$$P_{\text{success}} \approx (1 - \epsilon_1)^{N_1} (1 - \epsilon_2)^{N_2} (1 - \epsilon_m)^{N}$$
where $N_1$ and $N_2$ are the numbers of single- and two-qubit gates. For a 100-qubit circuit with 1,000 two-qubit gates at $\epsilon_2 = 0.01$, we have $P_{\text{success}} \approx (0.99)^{1000} \approx 4.3 \times 10^{-5}$. The output is essentially noise.
This is the fundamental constraint of the NISQ era: circuit depth is severely limited.
Worked Example: Noise Budget Calculation
Consider a 20-qubit circuit with depth 50, using 10 single-qubit gates and 5 two-qubit gates per qubit: - Single-qubit gates: $N_1 = 20 \times 10 = 200$, $\epsilon_1 = 10^{-3}$ - Two-qubit gates: $N_2 = 20 \times 5/2 = 50$ (each 2Q gate involves 2 qubits), $\epsilon_2 = 10^{-2}$ - Measurements: $N_m = 20$, $\epsilon_m = 5 \times 10^{-2}$
$P_{\text{success}} = (0.999)^{200} \times (0.99)^{50} \times (0.95)^{20}$ $= 0.818 \times 0.605 \times 0.358$ $= 0.177$
Only 17.7% of shots are error-free! And this is for a relatively shallow circuit on a small device.
18.2.3 The Coherence Time Budget
Another way to quantify noise is through the ratio of gate time to coherence time:
$$\text{Gate count budget} \approx \frac{T_2}{t_{\text{gate}}}$$
For a transmon qubit with $T_2 = 200$ µs and two-qubit gate time $t_{\text{gate}} = 50$ ns:
$$\text{Gate count budget} \approx \frac{200 \times 10^{-6}}{50 \times 10^{-9}} = 4{,}000$$
This means we can execute roughly 4,000 two-qubit gates before coherence is lost. For a circuit requiring 10,000 two-qubit gates, the output will be dominated by decoherence noise.
ASCII Diagram: The Coherence Window
======================================
Coherence amplitude
1.0 ┤████████████████████████████████████
│ ╲
│ ╲
│ ╲
│ ╲
│ ╲
│ ╲
0.5 ┤ ╲━━━━━ Noise floor
│
│ ←── Gate budget: ~4,000 gates ──→
│
0.0 ┤──────────────────────────────────────────→ Time
0 T₂ = 200 µs
The circuit must complete within the coherence window.
Longer circuits accumulate more decoherence errors.
18.3 The NISQ Algorithm Design Philosophy
Given the constraints, NISQ algorithms share a common design philosophy:
18.3.1 Shallow Circuits
NISQ algorithms use circuits of depth $O(\text{poly}(n))$ with small constant factors, typically $D \sim 10^1$ to $10^2$. This rules out algorithms like quantum phase estimation, which requires $O(1/\epsilon)$ controlled unitaries, each of which may be deep.
Circuit depth constraints by platform:
| Platform | Typical max circuit depth | Max useful gates |
|---|---|---|
| Superconducting | 100-1,000 | 1,000-100,000 |
| Trapped ions | 500-5,000 | 10,000-500,000 |
| Neutral atoms | 50-200 | 5,000-50,000 |
These numbers are approximate and depend on the specific task, error rates, and desired fidelity.
18.3.2 Hybrid Classical-Quantum Loops
The dominant NISQ paradigm is the variational quantum algorithm (VQA). A parameterized quantum circuit $U(\boldsymbol{\theta})$ is executed on the quantum processor, measurements are collected, and a classical optimizer updates the parameters $\boldsymbol{\theta}$ to minimize a cost function $C(\boldsymbol{\theta})$:
┌─────────────────────────────────────────────────────────┐
│ CLASSICAL COMPUTER │
│ ┌───────────────────────────────────────────────────┐ │
│ │ Optimizer: θ ← θ - η ∇C(θ) │ │
│ └───────────────────────┬───────────────────────────┘ │
│ │ │
│ θ │ ⟨ψ(θ)|H|ψ(θ)⟩ │
│ ┌───────────┴───────────┐ │
│ │ │ │
│ ┌───────────┴───────────────────────┴───────────────┐ │
│ │ QUANTUM PROCESSOR │ │
│ │ |0⟩ ──[U(θ)]── Measure ──→ bitstrings │ │
│ └───────────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────┘
The quantum processor acts as a co-processor, evaluating functions that are (hopefully) hard to compute classically. The classical optimizer handles the heavy lifting of navigating the parameter landscape.
Key VQA design choices: 1. Ansatz: What parameterized circuit to use? 2. Cost function: What to measure and minimize? 3. Optimizer: Gradient-based (SPSA, Adam) or gradient-free (COBYLA, Nelder-Mead)? 4. Initialization: How to set initial parameters?
Common Misconception: "Variational algorithms are guaranteed to find the global optimum."
They are not. The cost function landscape of a VQA can have many local minima, saddle points, and barren plateaus (regions where the gradient vanishes exponentially). There is no guarantee that a gradient-based optimizer will find the global minimum. This is a fundamental challenge that we'll discuss in Section 18.7.
18.3.3 Error Mitigation
Since we cannot correct errors, we mitigate them. Error mitigation techniques do not remove errors but reduce their impact on expectation values. Key methods include:
-
Zero-Noise Extrapolation (ZNE): Run the circuit at multiple noise levels (by stretching gate durations or inserting identity-equivalent gates), then extrapolate to the zero-noise limit.
-
Probabilistic Error Cancellation (PEC): Characterize the noise channel and invert it by sampling from a quasi-probability distribution over circuits. PEC can in principle remove all noise but has an exponential sampling overhead.
-
Readout Error Mitigation: Calibrate the measurement error matrix $M_{ij} = P(\text{measure } i \mid \text{prepared } j)$ and invert it to correct measurement statistics.
-
Clifford Data Regression (CDR): Train a classical model on near-Clifford circuits (which can be efficiently simulated) to predict and correct errors in non-Clifford circuits.
We'll explore each of these in detail in Section 18.5.
18.4 Variational Quantum Algorithms: An Overview
The VQA family includes:
| Algorithm | Application | Cost Function | Ansatz |
|---|---|---|---|
| VQE | Ground state energy | $\langle \psi(\boldsymbol{\theta}) \| H \| \psi(\boldsymbol{\theta}) \rangle$ | UCCSD, HEA, ADAPT |
| QAOA | Combinatorial optimization | $\langle \psi(\boldsymbol{\gamma},\boldsymbol{\beta}) \| H_C \| \psi(\boldsymbol{\gamma},\boldsymbol{\beta}) \rangle$ | Problem-inspired |
| QML Classifier | Classification | Cross-entropy loss | Hardware-efficient |
| QNN | Regression | Mean squared error | Trainable layers |
| VQD | Excited states | Overlap penalty | Same as VQE |
| CVaR-VQE | Ground state with risk | Conditional value at risk | Same as VQE |
All share the same structure: a parameterized ansatz, a measurement protocol, and a classical optimizer. Chapters 19–21 explore VQE, QAOA, and QML in depth.
Recurring Theme: Quantum is Linear Algebra, Not Magic
VQAs work because the parameterized quantum circuit defines a manifold of quantum states $|\psi(\boldsymbol{\theta})\rangle$ in the exponentially large Hilbert space. The cost function $C(\boldsymbol{\theta}) = \langle \psi(\boldsymbol{\theta})|H|\psi(\boldsymbol{\theta})\rangle$ is a scalar function on this manifold, and the optimizer navigates this manifold using information from quantum measurements. The quantum computer's role is to compute the cost function efficiently — something that is classically hard for general states — while the classical computer navigates the optimization landscape. It's a division of labor, not a magical quantum speedup.
18.5 Error Mitigation in Depth
18.5.1 Zero-Noise Extrapolation (ZNE)
ZNE is the simplest and most widely used error mitigation technique. The idea is intuitive: if we can increase the noise in a controlled way, we can extrapolate to zero noise.
Algorithm: 1. Run the circuit at the base noise level $\lambda = 1$. 2. Run the circuit at amplified noise levels $\lambda = 2, 3, \ldots$ (by stretching gate times or inserting gate identities). 3. Fit the results to a function $f(\lambda)$ and extrapolate to $\lambda = 0$.
Noise amplification methods: - Unitary folding: Replace each gate $G$ with $G \cdot G^{-1} \cdot G$ (which is equivalent to $G$ but with 3× the noise). More generally, fold $k$ times for noise amplification factor $\lambda = 2k + 1$. - Gate stretching: Increase the duration of each gate by factor $\lambda$, which increases the contribution of stochastic noise (but not coherent errors).
Extrapolation methods: - Linear: $f(\lambda) = a + b\lambda$. Requires 2 noise levels. Assumes noise is linear. - Quadratic: $f(\lambda) = a + b\lambda + c\lambda^2$. Requires 3 noise levels. Accounts for curvature. - Exponential: $f(\lambda) = a + b \cdot e^{-c\lambda}$. Accounts for saturation at high noise.
# ZNE Example: Mitigating noise in a simple expectation value
import numpy as np
from qiskit import QuantumCircuit
from qiskit_aer import AerSimulator
from qiskit_aer.noise import NoiseModel, depolarizing_error
from qiskit.primitives import Estimator
# Build a simple circuit: Bell state + ZZ measurement
qc = QuantumCircuit(2)
qc.h(0)
qc.cx(0, 1)
# Build noise model
noise_model = NoiseModel()
p1 = 0.002 # single-qubit gate error
p2 = 0.01 # two-qubit gate error
noise_model.add_all_qubit_quantum_error(depolarizing_error(p1, 1), ['h'])
noise_model.add_all_qubit_quantum_error(depolarizing_error(p2, 2), ['cx'])
# Ideal value
ideal_zz = 1.0 # <ZZ> for |Φ+⟩ = 1
# Run at different noise levels
from qiskit.quantum_info import SparsePauliOp
H_zz = SparsePauliOp.from_list([('ZZ', 1.0)])
def fold_circuit(qc, scale_factor):
"""Apply unitary folding to amplify noise."""
if scale_factor == 1:
return qc
folded = qc.copy()
# Add inverse + original for each folding
for _ in range(int((scale_factor - 1) / 2)):
folded = folded.compose(qc.inverse())
folded = folded.compose(qc)
return folded
results = {}
for scale in [1, 3, 5]:
folded = fold_circuit(qc, scale)
# ... run on simulator with noise model ...
# results[scale] = measured_zz_value
# Linear extrapolation to zero noise
# expectation(scale=0) ≈ 3 * results[1] - 3 * results[3] + results[5]
# (Richardson extrapolation for noise levels 1, 3, 5)
18.5.2 Probabilistic Error Cancellation (PEC)
PEC is more powerful than ZNE but has an exponential sampling overhead. The idea is to characterize the noise channel $\mathcal{E}$ and construct its inverse $\mathcal{E}^{-1}$ as a quasi-probability distribution over implementable operations.
Formally: If $\mathcal{E}(\rho) = \sum_k E_k \rho E_k^\dagger$ is the noise channel, we can write:
$$\mathcal{E}^{-1} = \sum_i \eta_i \mathcal{B}_i$$
where $\mathcal{B}_i$ are implementable operations and $\eta_i$ are real coefficients (some negative — hence "quasi-probability"). The sampling overhead is:
$$\gamma = \left(\sum_i |\eta_i|\right)^2$$
This is called the gamma factor. For circuits of depth $d$, the total overhead scales as $\gamma^d$, which grows exponentially with circuit depth. This limits PEC to shallow circuits.
Common Misconception: "Error mitigation removes errors."
Error mitigation reduces the impact of errors on expectation values, but it does not remove errors from individual circuit executions. ZNE extrapolates from noisy data to estimate the noiseless result. PEC uses statistical sampling to cancel errors in expectation values. Neither technique produces a noiseless quantum state. They are post-processing techniques applied to measurement data, not quantum error correction.
18.5.3 Readout Error Mitigation
Measurement (readout) errors are among the most significant noise sources on current hardware. A typical 2-qubit measurement has an error matrix:
$$M = \begin{pmatrix} P(00|00) & P(00|01) & P(00|10) & P(00|11) \\ P(01|00) & P(01|01) & P(01|10) & P(01|11) \\ P(10|00) & P(10|01) & P(10|10) & P(10|11) \\ P(11|00) & P(11|01) & P(11|10) & P(11|11) \end{pmatrix}$$
For independent readout errors on each qubit with error probability $p_1, p_2$:
$$M = \begin{pmatrix} (1-p_1)(1-p_2) & (1-p_1)p_2 & p_1(1-p_2) & p_1 p_2 \\ (1-p_1)p_2 & (1-p_1)(1-p_2) & p_1 p_2 & p_1(1-p_2) \\ p_1(1-p_2) & p_1 p_2 & (1-p_1)(1-p_2) & (1-p_1)p_2 \\ p_1 p_2 & p_1(1-p_2) & (1-p_1)p_2 & (1-p_1)(1-p_2) \end{pmatrix}$$
The corrected probability vector is:
$$\vec{p}_{\text{corrected}} = M^{-1} \vec{p}_{\text{measured}}$$
For small systems, $M^{-1}$ can be computed directly. For larger systems, matrix-free methods (M3, measurement error mitigration) are used.
# Readout error mitigation example
from qiskit.result import LocalReadoutMitigator
import numpy as np
# Suppose we have 2 qubits with readout errors
# qubit 0: P(measure 1 | prepared 0) = 0.02, P(measure 0 | prepared 1) = 0.03
# qubit 1: P(measure 1 | prepared 0) = 0.01, P(measure 0 | prepared 1) = 0.04
# The mitigation matrix (simplified for independent errors)
# Corrected = M^(-1) * Measured
# For a single qubit with p(0|1) and p(1|0):
# M = [[1-p10, p01], [p10, 1-p01]]
# M^(-1) = 1/det * [[1-p01, -p01], [-p10, 1-p10]]
p10_0, p01_0 = 0.02, 0.03 # qubit 0
p10_1, p01_1 = 0.01, 0.04 # qubit 1
print("Readout error probabilities:")
print(f" Qubit 0: P(1|0) = {p10_0:.2f}, P(0|1) = {p01_0:.2f}")
print(f" Qubit 1: P(1|0) = {p10_1:.2f}, P(0|1) = {p01_1:.2f}")
18.6 The Quantum Volume Metric
Quantum volume (QV), introduced by IBM, is a single-number metric that captures a device's effective computational power. It accounts for qubit count, connectivity, gate fidelity, and measurement fidelity.
18.6.1 Definition
A device has quantum volume $2^V$ if it can successfully run $V$-qubit random square circuits of depth $V$ (i.e., $V$ layers of random SU(4) two-qubit gates on random pairs) with a heavy-output probability exceeding 2/3 with high confidence.
The heavy-output problem: Given a random circuit $U$, the ideal output distribution has $2^V$ probabilities. The "heavy" outputs are those with probability above the median. A quantum device should produce heavy outputs with probability greater than 1/2 (classically, this is hard). The QV test checks if the heavy-output probability exceeds 2/3.
Formal definition: Let $H_U$ be the set of heavy outputs of circuit $U$. The heavy-output fraction for a set of random circuits $\{U_i\}$ is:
$$h = \frac{1}{|\{U_i\}|} \sum_i \frac{|\{x : \text{measure } x \in H_{U_i}\}|}{\text{shots}}$$
A device achieves QV $2^V$ if $h > 2/3$ with 97.5% confidence over at least 100 random circuits.
18.6.2 Computing Quantum Volume
import numpy as np
from qiskit import QuantumCircuit
from qiskit.quantum_info import random_unitary
def heavy_output_set(circuit: QuantumCircuit) -> set:
"""Compute the set of heavy output bitstrings for a given circuit."""
from qiskit.quantum_info import Statevector
n = circuit.num_qubits
sv = Statevector.from_instruction(circuit)
probs = np.abs(sv.data) ** 2
median = np.median(probs)
heavy_indices = np.where(probs > median)[0]
return {format(i, f'0{n}b') for i in heavy_indices}
# Example: 4-qubit square circuit (depth 4)
n = 4
qc = QuantumCircuit(n)
for layer in range(n):
for i in range(0, n, 2):
qc.append(random_unitary(4).to_instruction(), [i, (i+1) % n])
for i in range(1, n, 2):
qc.append(random_unitary(4).to_instruction(), [i, (i+1) % n])
print(f"Circuit depth: {qc.depth()}")
print(f"2-qubit gate count: {qc.size()}")
18.6.3 Current Quantum Volumes
As of 2025, leading quantum volumes include:
- IBM: $QV = 2^{12} = 4096$ (Heron processor)
- Quantinuum: $QV = 2^{20} = 1{,}048{,}576$ (H2 processor)
- IonQ: $QV = 2^{22} = 4{,}194{,}304$
The exponential growth of QV has been a key indicator of hardware progress, though it is an imperfect metric — it does not capture all aspects of performance relevant to practical applications.
Common Misconception: "Quantum volume is the only metric that matters."
Quantum volume is a useful benchmark, but it measures the performance of random circuits, not application-specific circuits. A device with high QV may still perform poorly on a specific algorithm if the qubit connectivity doesn't match the algorithm's needs, or if the error rates vary significantly across qubits. Other important metrics include:
- CLOPS (Circuit Layer Operations Per Second): Measures throughput, not just quality.
- Application-specific benchmarks: EPL (Error Per Layer) for VQE, QAOA performance on MaxCut, etc.
- Individual qubit metrics: $T_1$, $T_2$, single-qubit and two-qubit gate fidelities, readout fidelities.
- Crosstalk metrics: How simultaneous operations on different qubits affect each other.
18.7 The Barren Plateau Problem
One of the most significant challenges for variational quantum algorithms is the barren plateau phenomenon: for many ansatz architectures, the gradient of the cost function vanishes exponentially with the number of qubits, making optimization impossible at scale.
18.7.1 Formal Definition
A variational quantum algorithm suffers from a barren plateau if the variance of the cost function gradient decays exponentially with the number of qubits:
$$\text{Var}\left[\frac{\partial C}{\partial \theta_k}\right] \leq O\left(\frac{1}{2^n}\right)$$
where $n$ is the number of qubits. This means that as the system size increases, the gradient becomes indistinguishable from zero, and the optimizer cannot determine which direction to move.
18.7.2 Causes of Barren Plateaus
1. Expressibility (too much entanglement): Deep, highly parameterized circuits (hardware-efficient ansatzes, random circuits) tend to converge to 2-designs, meaning the output state is approximately uniformly distributed over the Hilbert space. The gradient variance scales as $O(1/2^n)$ for such circuits.
2. Global cost functions: If the cost function depends on measurements of all qubits (e.g., $\langle Z^{\otimes n} \rangle$), the gradient variance scales as $O(1/2^n)$ regardless of the ansatz. Local cost functions (measurements of individual qubits or small groups) can avoid this.
3. Noise: Noise on NISQ devices adds random fluctuations that can exacerbate barren plateaus by flattening the cost landscape.
18.7.3 Mitigation Strategies
- Layer-wise training: Train parameters layer by layer, starting from the identity circuit.
- Problem-inspired ansatzes: Use chemically motivated ansatzes (UCCSD, ADAPT-VQE) that restrict the search space.
- Local cost functions: Replace global observables with local ones (e.g., $\sum_i \langle Z_i \rangle$ instead of $\langle Z^{\otimes n} \rangle$).
- Parameter initialization: Initialize parameters near known good values (e.g., Hartree-Fock for VQE).
- Block-identity initialization: Initialize each block of the ansatz close to the identity to preserve locality.
Recurring Theme: We're at the Beginning
The barren plateau problem illustrates a fundamental challenge in quantum algorithm design. We don't yet know which ansatzes avoid barren plateaus for specific problem classes, or which cost functions have favorable gradient properties. This is an active area of research, and new theoretical results are emerging regularly. The fact that barren plateaus exist doesn't mean VQAs are doomed — it means we need to design them carefully, with problem-specific structure rather than generic, highly expressive ansatzes.
18.8 Circuit Knitting
Circuit knitting is a technique for running circuits larger than the available device by decomposing them into smaller subcircuits that can be executed independently and recombined classically.
18.8.1 Cut Types
Wire Cutting: A quantum wire (qubit) is cut, replacing it with a measurement and state preparation. The identity channel on a qubit can be decomposed as:
$$\mathcal{I}(\rho) = \sum_i a_i \mathcal{M}_i(\rho)$$
where $\mathcal{M}_i$ are measure-and-prepare channels and $a_i$ are quasi-probability coefficients. The overhead is exponential in the number of cuts.
Gate Cutting: A two-qubit gate is decomposed into local operations and classical communication. For a CNOT gate:
$$\text{CNOT}(\rho) = \frac{1}{2} \sum_{\alpha \in \{I,X,Y,Z\}} \Phi_\alpha(\rho)$$
where each $\Phi_\alpha$ involves single-qubit operations and measurements.
18.8.2 The Exponential Overhead
If a circuit is cut into $K$ fragments, the number of circuit executions required scales as $O(c^K)$ where $c$ is a constant depending on the cutting scheme (typically $c \sim 4$–$16$). This limits circuit knitting to circuits with a small number of cuts.
ASCII Diagram: Circuit Cutting
================================
Original circuit (6 qubits, too big for 4-qubit device):
┌─────────────────────────────────────────────┐
│ A ──H───●───────│──────────────────── │
│ B ───────●──────│──────●─────── │
│ C ──────────────│──────●──H──── │
│ D ──────H───────│─────────────────── │
│ E ──────────────│──────────────────── │
│ F ──────────────│──────────────────── │
└─────────────────────────────────────────────┘
↑ Cut here
Left fragment (4 qubits): Right fragment (2 qubits):
┌─────────────────┐ ┌──────────┐
│ A ──H───●──────│ │ E ──────│
│ B ───────●─────│ │ F ──────│
│ C ─────────────│ └──────────┘
│ D ──────H──────│
└─────────────────┘
Execute both fragments multiple times with different
initializations/measurements at the cut, then recombine
classically. Overhead: O(c^K) where K = number of cuts.
18.8.3 Qiskit Addon for Circuit Knitting
from qiskit import QuantumCircuit
from qiskit.circuit import Parameter
# Create a 6-qubit circuit that exceeds a 4-qubit device
qc = QuantumCircuit(6)
for i in range(6):
qc.h(i)
qc.cx(0, 1)
qc.cx(2, 3)
qc.cx(4, 5)
qc.cx(1, 2) # This gate connects two halves
qc.cx(3, 4) # This gate connects two halves
qc.measure_all()
print("Original circuit requires 6 qubits")
print(f"Circuit depth: {qc.depth()}")
print(f"Gate count: {sum(qc.count_ops().values())}")
# The circuit can be cut at the middle connections
# and executed as two 3-qubit subcircuits
print("\nAfter cutting: two 3-qubit subcircuits with classical post-processing")
print("Overhead: O(4^K) where K is the number of cuts")
print("For K=2 cuts: ~16x overhead in sampling")
18.9 Noise Effects on Simple Circuits: A Qiskit Demonstration
Let us build a noise model and observe how it degrades a simple Bell state circuit.
import numpy as np
from qiskit import QuantumCircuit, transpile
from qiskit_aer import AerSimulator
from qiskit.quantum_info import Statevector, state_fidelity
from qiskit_aer.noise import NoiseModel, depolarizing_error, thermal_relaxation_error
# ── Build a Bell state circuit ──
n_qubits = 2
qc_ideal = QuantumCircuit(n_qubits)
qc_ideal.h(0)
qc_ideal.cx(0, 1)
qc_ideal.save_statevector()
# ── Ideal simulation ──
sim_ideal = AerSimulator(method='statevector')
result_ideal = sim_ideal.run(qc_ideal).result()
psi_ideal = result_ideal.get_statevector()
print(f"Ideal Bell state fidelity: {state_fidelity(psi_ideal, Statevector.from_label('00+11')):.6f}")
# ── Build a realistic noise model ──
noise_model = NoiseModel()
# Single-qubit depolarizing error: 0.1%
p1 = 0.001
error_1q = depolarizing_error(p1, 1)
noise_model.add_all_qubit_quantum_error(error_1q, ['h', 'x', 'y', 'z', 's', 't'])
# Two-qubit depolarizing error: 1%
p2 = 0.01
error_2q = depolarizing_error(p2, 2)
noise_model.add_all_qubit_quantum_error(error_2q, ['cx'])
# Thermal relaxation: T1=100µs, T2=80µs, gate time=50ns
t1 = 100e3 # ns
t2 = 80e3 # ns
gate_time = 50 # ns
error_thermal = thermal_relaxation_error(t1, t2, gate_time)
noise_model.add_all_qubit_quantum_error(error_thermal, ['h', 'cx'], warnings=False)
# Measurement error: 2% readout error
p_meas = 0.02
error_meas = depolarizing_error(p_meas, 1)
noise_model.add_all_qubit_quantum_error(error_meas, ['measure'])
# ── Noisy simulation ──
qc_noisy = QuantumCircuit(n_qubits, n_qubits)
qc_noisy.h(0)
qc_noisy.cx(0, 1)
qc_noisy.measure([0, 1], [0, 1])
sim_noisy = AerSimulator(noise_model=noise_model)
shots = 10000
counts = sim_noisy.run(qc_noisy, shots=shots).result().get_counts()
print("\nNoisy Bell state measurement results:")
for bitstring, count in sorted(counts.items()):
print(f" |{bitstring}⟩: {count} ({100*count/shots:.1f}%)")
# ── Compute expectation values ──
# Ideal: ⟨ZZ⟩ = 1, ⟨XX⟩ = 1
print("\nObservable expectation values (ideal vs. noisy):")
zz_ideal = 1.0
zz_noisy = (counts.get('00', 0) + counts.get('11', 0) - counts.get('01', 0) - counts.get('10', 0)) / shots
print(f" ⟨ZZ⟩: ideal = {zz_ideal:.3f}, noisy = {zz_noisy:.3f}")
Expected output: The ideal Bell state yields $|00\rangle$ and $|11\rangle$ with equal probability. Under noise, we observe leakage into $|01\rangle$ and $|10\rangle$, and the expectation values of Pauli correlators are suppressed. The depolarizing error effectively mixes the state toward the maximally mixed state $\mathbb{I}/4$.
18.9.1 The Effect of Circuit Depth on Fidelity
We can quantify how fidelity decays with circuit depth:
def fidelity_vs_depth(n_qubits, max_depth, noise_model, shots=10000):
"""Compute the fidelity of a GHZ state preparation vs. circuit depth."""
fidelities = []
for depth in range(1, max_depth + 1):
qc = QuantumCircuit(n_qubits, n_qubits)
qc.h(0)
for d in range(depth):
for i in range(n_qubits - 1):
qc.cx(i, i + 1)
qc.measure(range(n_qubits), range(n_qubits))
sim = AerSimulator(noise_model=noise_model)
counts = sim.run(qc, shots=shots).result().get_counts()
ghz_counts = counts.get('0' * n_qubits, 0) + counts.get('1' * n_qubits, 0)
fidelities.append(ghz_counts / shots)
return fidelities
# Run for a 4-qubit GHZ state
fids = fidelity_vs_depth(4, 10, noise_model)
print("\nGHZ fidelity vs. circuit depth (4 qubits):")
for d, f in enumerate(fids, 1):
print(f" Depth {d:2d}: fidelity = {f:.4f}")
The fidelity decays approximately exponentially with circuit depth: $F(d) \approx F_0 \cdot e^{-d/d_0}$, where $d_0$ is a characteristic depth scale determined by the error rates.
18.9.2 Error Mitigation Applied
Let's apply zero-noise extrapolation to the Bell state example:
# ZNE for Bell state ZZ measurement
from qiskit import QuantumCircuit
def zne_bell_state(noise_model, scale_factors=[1, 3, 5]):
"""Apply ZNE to estimate the noiseless <ZZ> value."""
results = []
for scale in scale_factors:
qc = QuantumCircuit(2, 2)
qc.h(0)
qc.cx(0, 1)
# Apply unitary folding to scale noise
if scale > 1:
folds = (scale - 1) // 2
for _ in range(folds):
# Add inverse + original (fold)
qc.cx(0, 1)
qc.cx(0, 1) # CX is self-inverse, so CX * CX * CX = CX
# Actually, for self-inverse gates, folding gives CX^3 = CX
# Let's use a different approach for clarity
qc.measure([0, 1], [0, 1])
sim = AerSimulator(noise_model=noise_model)
counts = sim.run(qc, shots=10000).result().get_counts()
zz = (counts.get('00', 0) + counts.get('11', 0) - counts.get('01', 0) - counts.get('10', 0)) / 10000
results.append((scale, zz))
print("\nZNE results (scale factor, <ZZ>):")
for scale, zz in results:
print(f" λ = {scale}: <ZZ> = {zz:.4f}")
# Linear extrapolation to λ = 0
if len(results) >= 2:
# Fit line through first two points and extrapolate to λ = 0
l1, v1 = results[0]
l2, v2 = results[1]
slope = (v2 - v1) / (l2 - l1)
zne_value = v1 - slope * l1
print(f"\n ZNE estimate (linear): <ZZ> = {zne_value:.4f}")
print(f" Ideal value: <ZZ> = 1.0000")
return results
zne_results = zne_bell_state(noise_model)
Try It Yourself: Noise Model Exploration
Modify the noise model parameters to see how different error rates affect the Bell state fidelity: 1. Set $\epsilon_2 = 0$ (no two-qubit gate error). What is the dominant error source? 2. Set $\epsilon_1 = 0$ (no single-qubit gate error). How much does fidelity improve? 3. Increase $T_1$ from 100 µs to 1 ms. How much does coherence improve? 4. Set measurement error to 0. Which error source dominates now?
18.10 Quantum Advantage on NISQ Devices
18.10.1 The Google Quantum Supremacy Experiment (2019)
In 2019, Google's Sycamore processor (53 qubits) performed a specific random circuit sampling task in ~200 seconds that would take the world's fastest supercomputer ~10,000 years (later revised to ~300 seconds by IBM's alternative classical algorithm). This was the first demonstration of quantum computational advantage on a specific task.
Key details: - Task: Sample from the output distribution of random quantum circuits - Qubits: 53 transmon qubits - Circuit depth: 20 cycles of random SU(4) gates - Fidelity: ~0.2% (meaning ~99.8% of the output is noise) - Classical simulation time (Google estimate): ~10,000 years - Classical simulation time (IBM estimate): ~2.5 days with optimized classical algorithm
Controversy: IBM showed that an optimized classical algorithm running on the Summit supercomputer could simulate the same circuit in ~2.5 days, not 10,000 years. The debate highlights the difficulty of comparing quantum and classical performance on contrived benchmarks.
18.10.2 Subsequent Quantum Advantage Claims
- Chinese group (2020): Jiuzhang photonic quantum computer performed Gaussian boson sampling with up to 76 photons, claiming a ~10^14 speedup over classical simulation.
- IBM (2023): Demonstrated utility-scale quantum computation on 127 qubits for a materials science problem (Ising model simulation).
- Quantinuum (2024): Achieved quantum volume $2^{20} = 1{,}048{,}576$ on the H2 processor, demonstrating high-fidelity operations.
18.10.3 The Gap Between Advantage and Utility
A crucial distinction: quantum advantage on a specific benchmark does not imply quantum utility for a practical problem. Random circuit sampling, Gaussian boson sampling, and other benchmark tasks have no known practical applications. The challenge is to demonstrate quantum advantage on a problem that someone actually wants to solve.
Recurring Theme: Quantum Advantage is Problem-Specific
Quantum advantage is not a single threshold that, once crossed, applies to all problems. Different problems require different resources — some need many qubits, others need deep circuits, others need high connectivity. A device that shows advantage on random circuit sampling may be useless for quantum chemistry, and vice versa. The path to practical quantum computing involves finding the specific problems where quantum hardware provides a genuine, measurable advantage over the best classical algorithms.
18.11 The Road Ahead
The NISQ era is not a destination but a waypoint. The field is progressing toward:
-
Early fault tolerance: Small error-corrected logical qubits running limited-depth circuits. IBM's 2023 roadmap targets 100,000+ qubit processors by 2033, with early error correction expected around 2026-2028.
-
Error suppression: Dynamical decoupling, optimal control (GRAPE, DRAG), and randomized compiling reduce effective error rates without full QEC. These techniques can improve NISQ algorithm performance by 2-10x.
-
Algorithmic breakthroughs: New algorithms that exploit NISQ hardware more effectively. Examples include: - Quantum error mitigation (ZNE, PEC, virtual distillation) - Circuit knitting (partitioning large circuits across small devices) - Problem-specific ansatzes (chemically motivated, symmetry-preserving) - Classical-quantum hybrid algorithms (VQE, QAOA, ADAPT)
-
Post-NISQ devices: Quantum computers with partial error correction (logical qubits with code distance 3-5) that can run deeper circuits than NISQ devices but aren't fully fault-tolerant. This intermediate regime may enable useful applications before full fault tolerance.
ASCII Diagram: The Quantum Computing Roadmap
===============================================
Time ─────────────────────────────────────────────────────→
NISQ Era (now) Early FT Full FT
├─────────────────┤──────┤────────────────┤
│ 50-1000 noisy │ │ │
│ qubits │ │ │
│ Shallow circuits│ │ │
│ Error mitigation│ │ │
│ │ │ │
│ VQE, QAOA, QML │ │ │
│ │ │ │
│ "Useful NISQ" │ │ │
│ (if achieved) │ │ │
│ │ │ │
│ │ 1000+│ 10,000+ │
│ │ qubits│ logical │
│ │ with │ qubits │
│ │ some │ (millions │
│ │ error │ physical) │
│ │ corr. │ │
│ │ │ Shor's, full │
│ │ │ QPE, quantum │
│ │ │ chemistry │
│ │ │ │
├─────────────────┤──────┤────────────────┤
2024-2028 2028-2032 2035+
The chapters that follow dive deep into the three most prominent NISQ algorithm families: VQE for quantum chemistry (Chapter 19), QAOA for combinatorial optimization (Chapter 20), and quantum machine learning (Chapter 21).
18.12 Noise Models: A Deeper Dive
Understanding noise models is essential for designing NISQ algorithms that are robust to errors. Qiskit provides a comprehensive noise modeling framework that allows us to simulate realistic hardware noise.
18.12.1 Types of Quantum Noise
Depolarizing noise: The most common noise model. Replaces the quantum state $\rho$ with a mixture:
$$\mathcal{E}(\rho) = (1-p)\rho + \frac{p}{2^n} I$$
where $p$ is the depolarizing probability and $n$ is the number of qubits. Depolarizing noise is the quantum analog of white noise — it's isotropic and affects all directions equally.
Amplitude damping: Models energy dissipation ($T_1$ decay). A qubit in $|1\rangle$ spontaneously decays to $|0\rangle$ with probability $\gamma$:
$$\mathcal{E}_{AD}(\rho) = E_0 \rho E_0^\dagger + E_1 \rho E_1^\dagger$$
where $E_0 = |0\rangle\langle 0| + \sqrt{1-\gamma}|1\rangle\langle 1|$ and $E_1 = \sqrt{\gamma}|0\rangle\langle 1|$.
Phase damping: Models dephasing ($T_2$ decay). Destroys phase coherence without energy dissipation:
$$\mathcal{E}_{PD}(\rho) = (1-p)\rho + p Z \rho Z$$
Thermal relaxation: Combines amplitude damping and phase damping with characteristic times $T_1$ and $T_2$:
$$\mathcal{E}_{TR}(\rho) = \sum_k E_k \rho E_k^\dagger$$
where the Kraus operators $E_k$ depend on $T_1$, $T_2$, and the gate time $t_g$.
Try It Yourself: Build a Custom Noise Model
Create a noise model for a specific device profile: ```python from qiskit_aer.noise import NoiseModel, depolarizing_error, \ thermal_relaxation_error, phase_damping_error
noise_model = NoiseModel()
Single-qubit gates: 0.1% depolarizing + T1/T2 relaxation
p1 = 0.001 t1_us, t2_us = 100, 80 # microseconds gate_time_ns = 30 # nanoseconds
error_1q = depolarizing_error(p1, 1) + \ thermal_relaxation_error(t1_us1e3, t2_us1e3, gate_time_ns) noise_model.add_all_qubit_quantum_error(error_1q, ['h', 'x', 'sx'])
Two-qubit gates: 1% depolarizing + T1/T2 relaxation
p2 = 0.01 cx_gate_time_ns = 300 # nanoseconds
error_2q = depolarizing_error(p2, 2) + \ thermal_relaxation_error(t1_us1e3, t2_us1e3, cx_gate_time_ns).expand( thermal_relaxation_error(t1_us1e3, t2_us1e3, cx_gate_time_ns)) noise_model.add_all_qubit_quantum_error(error_2q, ['cx'])
print(f"Single-qubit error rate: {p1:.4f}") print(f"Two-qubit error rate: {p2:.4f}") print(f"T1: {t1_us} µs, T2: {t2_us} µs") print(f"Single-qubit gate time: {gate_time_ns} ns") print(f"Two-qubit gate time: {cx_gate_time_ns} ns") ```
18.12.2 The Impact of Noise on Circuit Depth
The relationship between circuit depth and output fidelity can be modeled analytically. For a circuit of depth $D$ on $n$ qubits with per-layer error rate $\epsilon$:
$$F(D) \approx (1-\epsilon)^{Dn} \approx e^{-\epsilon Dn}$$
This exponential decay means that beyond a critical depth $D^* \approx 1/(\epsilon n)$, the output is essentially random noise.
Effective quantum volume: A device with $n$ qubits and per-layer error rate $\epsilon$ has effective quantum volume $\min(n, 1/\epsilon)^2$. This captures the tradeoff between qubit count and error rate.
ASCII Diagram: Fidelity vs. Circuit Depth
=============================================
Fidelity
1.0 ┤████████
│ ████
│ ███
│ ███
0.8 ┤ ██
│ ██
│ ███
0.6 ┤ ███
│ ███
0.5 ┤──────────────────────────────█─── Noise floor (random output)
│
0.0 ┤──────────────────────────────────→ Depth (D)
0 D* 2D* 3D*
D* = 1/(ε·n) = critical depth
Beyond D*, the output is dominated by noise.
18.12.3 Error Mitigation Comparison
Different error mitigation techniques have different strengths, weaknesses, and overheads:
| Technique | Overhead | Best for | Limitation |
|---|---|---|---|
| Zero-noise extrapolation | $O(\lambda_{\max})$ | Expectation values | Bias from extrapolation model |
| Probabilistic error cancellation | $O(\gamma^d)$ | Short circuits | Exponential in depth |
| Readout error mitigation | $O(2^n)$ characterization | Measurement errors | Only fixes readout |
| Clifford data regression | $O(|\mathcal{C}|)$ | Shallow circuits | Limited to near-Clifford |
| Virtual distillation | $O(k^2)$ copies | Reducing noise | Requires multiple copies |
| Symmetry verification | $O(1)$ | Symmetric problems | Only works with symmetries |
Virtual distillation (also called error suppression by symmetry): Prepare $k$ copies of the state $\rho$, measure the swap operator between copies, and use the measurement to compute $\text{Tr}[\rho^k O] / \text{Tr}[\rho^k]$. As $k \to \infty$, this converges to $\langle O \rangle_{\text{pure}}$, the expectation value for the pure state component of $\rho$.
# Virtual distillation concept
def virtual_distillation_concept(rho, k):
"""
Conceptual explanation of virtual distillation.
For k copies of state rho, the expectation value
<O>_k = Tr[rho^k O] / Tr[rho^k]
converges to <O>_pure as k -> infinity.
For a mixed state rho = (1-eps)|psi><psi| + eps * rho_noise,
<O>_2 approximates <psi|O|psi> with error O(eps^2),
while <O>_1 = Tr[rho O] has error O(eps).
"""
# With k=2 copies:
# <O>_2 = Tr[rho^2 O] / Tr[rho^2]
# This suppresses noise by a factor of ~1/eps
# compared to Tr[rho O], which has error O(eps)
pass
18.13 Classical Simulation and Benchmarks
Before running algorithms on real quantum hardware, it's essential to benchmark against classical simulators and classical algorithms.
18.13.1 Classical Simulation of Quantum Circuits
Classical simulation of quantum circuits is limited by the exponential growth of the state vector ($2^n$ complex amplitudes for $n$ qubits). Current limits:
| Method | Max qubits | Memory | Speed |
|---|---|---|---|
| Full state vector | ~50 qubits | ~16 PB | Slow |
| MPS (tensor network) | ~100 qubits (low entanglement) | Variable | Fast |
| Clifford simulation | Unlimited (Clifford only) | $O(n)$ | Very fast |
| Stim (stabilizer) | ~10,000 qubits (Clifford + Pauli) | $O(n^2)$ | Fast |
Key insight: Classical simulation is efficient for circuits with limited entanglement (tensor networks) or Clifford gates (stabilizer formalism). NISQ algorithms that generate high entanglement quickly exceed classical simulation capacity.
18.13.2 Classical Benchmarks for Quantum Advantage
For quantum chemistry (VQE), the classical benchmark is CCSD(T) (coupled cluster with singles, doubles, and perturbative triples), which is the "gold standard" of computational chemistry:
| Method | Scaling | Accuracy | Applicability |
|---|---|---|---|
| Hartree-Fock | $O(N^3)$ | ~1-10 mHartree | Weakly correlated |
| DFT | $O(N^3)$ | Varies | Most systems |
| MP2 | $O(N^5)$ | ~1-10 mHartree | Weakly correlated |
| CCSD | $O(N^6)$ | ~1 mHartree | Weakly correlated |
| CCSD(T) | $O(N^7)$ | ~0.1 mHartree | Weakly correlated |
| FCI | $O(e^N)$ | Exact | All systems (if feasible) |
Quantum advantage in chemistry requires beating CCSD(T) for strongly correlated systems — systems where CCSD(T) fails but FCI is intractable. This is a narrow but important window.
Recurring Theme: Quantum Advantage is Problem-Specific
Quantum advantage in chemistry is not "quantum computers solve all chemistry faster." It's "quantum computers solve strongly correlated chemistry problems that are intractable for CCSD(T)." This is analogous to how quantum advantage in optimization is not "quantum computers solve all optimization problems faster" but rather "quantum computers may solve specific optimization problems faster than classical heuristics."
18.14 The Error Correction Landscape
18.14.1 The Surface Code
The surface code is the leading quantum error correction code. It encodes one logical qubit in a $d \times d$ grid of physical qubits, where $d$ is the code distance.
Key properties: - Threshold error rate: $\sim 1\%$ for depolarizing noise (one of the highest known thresholds) - Physical qubits per logical qubit: $d^2$ data qubits + $d^2 - 1$ ancilla qubits $\approx 2d^2$ - Code distance: $d = 2\lceil \log_{10}(1/\epsilon_L) \rceil + 1$ for logical error rate $\epsilon_L$ - Gate overhead: Each logical gate requires $O(d)$ surface code cycles
Example: To achieve logical error rate $\epsilon_L = 10^{-10}$ with physical error rate $p = 10^{-3}$: - $d \approx 31$ (from $p_L \approx 0.1 (100p)^{(d+1)/2}$) - Physical qubits per logical: $\approx 2 \times 31^2 \approx 1,922$ - Surface code cycle time: $\sim 1$ µs
For Shor's algorithm factoring RSA-2048 (~6,000 logical qubits): - Total physical qubits: $6{,}000 \times 1{,}922 \approx 11.5$ million - With additional overhead for magic state distillation and routing: ~20 million
18.14.2 Other Error Correction Codes
| Code | Threshold | Qubits per logical | Gate set | Notes |
|---|---|---|---|---|
| Surface code | ~1% | ~$2d^2$ | Clifford + T | Most studied, highest threshold |
| Color code | ~0.8% | ~$2d^2$ | Transversal Clifford | Easier logical gates |
| Bacon-Shor | ~0.2% | ~$d^2$ | Subsystem code | Fewer ancilla |
| Steane [[7,1,3]] | ~10^-4 | 7 | Transversal | Small block, low threshold |
| Gottesman-Kitaev-Preskill | ~1% | Variable | Continuous variable | For bosonic systems |
ASCII Diagram: Surface Code Layout (d=5)
==========================================
───●───○───●───○───●───
│ │ │ │ │
───○───●───○───●───○───
│ │ │ │ │
───●───○───●───○───●───
│ │ │ │ │
───○───●───○───●───○───
│ │ │ │ │
───●───○───●───○───●───
● = data qubit (stores logical information)
○ = ancilla qubit (measures stabilizers)
─── = nearest-neighbor connections
Stabilizers: X⊗X⊗X⊗X (plaquette)
Z⊗Z⊗Z⊗Z (star)
Logical qubit: encoded in 25 physical qubits
Code distance: d = 5 (corrects ⌊(d-1)/2⌋ = 2 errors)
18.15 The Variational Quantum Eigensolver: A NISQ Case Study
As a concrete example of a NISQ algorithm, let's examine the Variational Quantum Eigensolver (VQE) in detail. VQE is the most studied NISQ algorithm and exemplifies the design philosophy of hybrid classical-quantum computation.
18.15.1 VQE Algorithm Overview
Goal: Find the ground state energy $E_0 = \min_\theta \langle \psi(\theta) | H | \psi(\theta) \rangle$ of a Hamiltonian $H$.
Algorithm: 1. Choose an ansatz $U(\theta)$ (parameterized quantum circuit). 2. Prepare $|\psi(\theta)\rangle = U(\theta)|0\rangle$. 3. Measure $\langle H \rangle = \sum_j h_j \langle P_j \rangle$ by measuring each Pauli term. 4. Use a classical optimizer to update $\theta$. 5. Repeat until convergence.
18.15.2 Ansatz Selection
The choice of ansatz $U(\theta)$ is critical. It must satisfy two competing requirements: - Expressibility: The ansatz should be able to represent states close to the ground state. - Trainability: The cost landscape should be navigable (no barren plateaus).
Hardware-efficient ansatz (HEA):
from qiskit import QuantumCircuit
from qiskit.circuit import Parameter
def hardware_efficient_ansatz(n_qubits, n_layers):
"""Build a hardware-efficient ansatz with n_layers of rotations and entanglers."""
params = []
qc = QuantumCircuit(n_qubits)
for layer in range(n_layers):
# Rotation layer: RY on each qubit
for i in range(n_qubits):
theta = Parameter(f'theta_{layer}_{i}')
qc.ry(theta, i)
params.append(theta)
# Entangler layer: CNOT ladder
for i in range(n_qubits - 1):
qc.cx(i, i + 1)
if n_qubits > 2:
qc.cx(n_qubits - 1, 0) # wrap around for circular connectivity
return qc, params
# Build a 4-qubit, 2-layer HEA
qc, params = hardware_efficient_ansatz(4, 2)
print(f"Ansatz has {len(params)} parameters")
print(f"Circuit depth: {qc.depth()}")
print(f"CNOT count: {qc.count_ops().get('cx', 0)}")
Pros: Shallow, hardware-native gates, easy to implement. Cons: Prone to barren plateaus, may not capture chemical structure.
Unitary Coupled Cluster (UCCSD) ansatz:
$$U(\theta) = e^{T(\theta) - T^\dagger(\theta)}$$
where $T(\theta) = \sum_{ia} \theta_i^a a_a^\dagger a_i + \sum_{i Pros: Chemically motivated, guaranteed to contain the ground state for small systems.
Cons: Deep circuits, many parameters, Trotterization required. ADAPT-VQE: Iteratively selects the operator with the largest gradient magnitude from a pool of operators, building the ansatz one term at a time. Pros: Adaptive, avoids barren plateaus, chemically motivated.
Cons: Requires many VQE iterations (one per operator), each requiring gradient computation. The Hamiltonian $H = \sum_j h_j P_j$ must be measured term by term (or in groups of commuting terms). The number of measurement groups scales as: For each group, $N_{\text{shots}} = O(\|H\|^2 / \epsilon^2)$ shots are needed for precision $\epsilon$. The total measurement cost per VQE iteration is: $$\text{Total shots} = \text{(number of groups)} \times N_{\text{shots}} = O\left(\frac{M^2 \|H\|^2}{\epsilon^2}\right)$$ For H$_2$ (4 qubits, 15 terms, 5 groups), this is manageable. For FeMoco (150 qubits, ~10$^8$ terms, ~10$^4$ groups), it's prohibitive. This example illustrates the key challenge of NISQ computing: even for a simple 2-qubit Hamiltonian, noise shifts the energy landscape and introduces errors in the VQE minimum. The quantum volume benchmark tests whether a device can reliably implement random square circuits of depth $d$ on $d$ qubits. The protocol is: Heavy output definition: For a random circuit $U$, the ideal output distribution has $2^d$ probabilities $p_0, p_1, \ldots, p_{2^d-1}$. The median probability $p_{\text{med}}$ is defined by $\sum_{p_x > p_{\text{med}}} p_x \leq 1/2$. The heavy outputs are those with $p_x > p_{\text{med}}$. Statistical test: Let $h_d^{(i)}$ be the heavy output fraction for circuit $i$. The test passes if: $$\frac{1}{S_d} \sum_{i=1}^{S_d} h_d^{(i)} > \frac{2}{3}$$ with at least 97.5% confidence. For $S_d = 100$ circuits, this requires the mean heavy output fraction to be at least $2/3 + 2\sigma$, where $\sigma$ is the standard error. Quantum volume is the most widely reported metric, but it has significant limitations:
- Random circuits are not representative: Real algorithms have structure that random circuits don't capture.
- Doesn't measure speed: A device with high QV but slow gates may be less useful than a faster device with lower QV.
- Saturates quickly: Once a device achieves QV = $2^d$, it automatically achieves QV = $2^{d'}$ for all $d' < d$. This means QV doesn't distinguish between devices that are close in capability. Qiskit is the most widely used quantum computing framework. Key components: Recurring Theme: We're at the Beginning The quantum computing software ecosystem is rapidly evolving. APIs change, frameworks are refactored, and best practices are still being established. Code that works today may need significant modification in a year. This is normal for a field in its early stages — but it means that the skills you learn now (understanding quantum algorithms, noise models, error mitigation) will be more enduring than familiarity with any specific API.# Conceptual ADAPT-VQE pseudocode
def adapt_vqe(hamiltonian, operator_pool, convergence_threshold=1e-5):
"""Adaptive VQE: build ansatz iteratively."""
ansatz = IdentityCircuit() # Start with empty ansatz
params = []
energy = compute_energy(ansatz, params, hamiltonian)
while True:
# Compute gradients for all operators in the pool
gradients = {}
for op in operator_pool:
grad = compute_gradient(ansatz, params, op, hamiltonian)
gradients[op] = grad
# Select operator with largest gradient
best_op = max(gradients, key=gradients.get)
if abs(gradients[best_op]) < convergence_threshold:
break # Converged
# Add selected operator to ansatz
ansatz = add_operator(ansatz, best_op)
params.append(0.0) # Initialize new parameter to 0
# Optimize all parameters
params, energy = optimize(ansatz, params, hamiltonian)
return ansatz, params, energy
18.15.3 Measurement Overhead
18.15.4 VQE on Real Hardware
# VQE on a simulated noisy device
from qiskit import QuantumCircuit
from qiskit.circuit import Parameter
from qiskit.primitives import Estimator
from qiskit_aer import AerSimulator
from qiskit_aer.noise import NoiseModel
from qiskit.quantum_info import SparsePauliOp
import numpy as np
# Simple 2-qubit Hamiltonian: H = -ZI - IZ + 0.1*XX
H = SparsePauliOp.from_list([('ZI', -1.0), ('IZ', -1.0), ('XX', 0.1)])
# Simple ansatz: RY(theta) on each qubit + CNOT
theta = Parameter('θ')
ansatz = QuantumCircuit(2)
ansatz.ry(theta, 0)
ansatz.ry(theta, 1)
ansatz.cx(0, 1)
# Ideal VQE
estimator_ideal = Estimator()
energies_ideal = []
thetas = np.linspace(0, 2*np.pi, 50)
for th in thetas:
bound = ansatz.assign_parameters({theta: th})
result = estimator_ideal.run(bound, H).result()
energies_ideal.append(result.values[0])
# Noisy VQE with depolarizing noise
noise_model = NoiseModel()
noise_model.add_all_qubit_quantum_error(
depolarizing_error(0.01, 1), ['ry'])
noise_model.add_all_qubit_quantum_error(
depolarizing_error(0.05, 2), ['cx'])
sim_noisy = AerSimulator(noise_model=noise_model)
estimator_noisy = Estimator(backend=sim_noisy)
energies_noisy = []
for th in thetas:
bound = ansatz.assign_parameters({theta: th})
result = estimator_noisy.run(bound, H, shots=8192).result()
energies_noisy.append(result.values[0])
print("VQE Energy Landscape:")
print(f" Ideal minimum: {min(energies_ideal):.6f}")
print(f" Noisy minimum: {min(energies_noisy):.6f}")
print(f" Exact minimum: {min(np.linalg.eigvalsh(H.to_matrix())):.6f}")
print(f" Noise-induced error: {abs(min(energies_noisy) - min(energies_ideal)):.6f}")
18.16 Quantum Volume in Depth
18.16.1 Detailed QV Protocol
18.16.2 Quantum Volume vs. Other Metrics
Metric
What it measures
Strengths
Weaknesses
QV
Random circuit quality
Single number, holistic
Not application-specific
CLOPS
Circuit throughput
Measures speed
Doesn't measure quality
EPLG
Error per layer of gates
Directly measures gate quality
Platform-specific
Fidelity
Per-circuit quality
Intuitive
Doesn't scale
Qubit count
Hardware size
Simple
Ignores quality
18.16.3 Computing QV: A Worked Example
import numpy as np
from qiskit import QuantumCircuit
from qiskit.quantum_info import random_unitary, Statevector
def compute_quantum_volume(n_qubits, n_trials=200, noise_model=None):
"""Compute the quantum volume for a given number of qubits."""
from qiskit_aer import AerSimulator
from qiskit import transpile
heavy_output_counts = []
for trial in range(n_trials):
# Generate random SU(4) circuit
qc = QuantumCircuit(n_qubits)
for layer in range(n_qubits):
for i in range(0, n_qubits, 2):
pair = (i % n_qubits, (i + 1) % n_qubits)
qc.append(random_unitary(4).to_instruction(), list(pair))
# Compute ideal heavy output set
ideal_sv = Statevector.from_instruction(qc)
ideal_probs = np.abs(ideal_sv.data) ** 2
median = np.median(ideal_probs)
heavy_set = set(np.where(ideal_probs > median)[0])
# Run on (noisy) simulator
if noise_model:
backend = AerSimulator(noise_model=noise_model)
else:
backend = AerSimulator()
qc.measure_all()
qc_compiled = transpile(qc, backend)
result = backend.run(qc_compiled, shots=8192).result()
counts = result.get_counts()
# Compute heavy output fraction
total_shots = sum(counts.values())
heavy_shots = sum(counts.get(format(i, f'0{n_qubits}b'), 0)
for i in heavy_set)
heavy_output_counts.append(heavy_shots / total_shots)
mean_heavy = np.mean(heavy_output_counts)
std_heavy = np.std(heavy_output_counts) / np.sqrt(n_trials)
print(f"Qubits: {n_qubits}")
print(f"Mean heavy output fraction: {mean_heavy:.4f} ± {2*std_heavy:.4f}")
print(f"Threshold: 2/3 = {2/3:.4f}")
print(f"Passes QV test: {mean_heavy > 2/3}")
return mean_heavy
# Compute QV for 3 qubits (ideal)
compute_quantum_volume(3, n_trials=50)
18.17 Software Ecosystem for NISQ Computing
18.17.1 Major Frameworks
Framework
Organization
Language
Focus
Qiskit
IBM
Python
General-purpose, hardware access
Cirq
Google
Python
Algorithms, near-term devices
PennyLane
Xanadu
Python
Differentiable quantum computing
Ocean
D-Wave
Python
Quantum annealing
CUDA-Q
NVIDIA
C++/Python
GPU-accelerated simulation
QuTiP
Open source
Python
Quantum optics simulation
18.17.2 Qiskit Ecosystem
18.17.3 Running on Real Hardware
# Example: Running a circuit on IBM Quantum hardware
from qiskit import QuantumCircuit
from qiskit_ibm_runtime import QiskitRuntimeService, Sampler
# Authenticate (one-time setup)
service = QiskitRuntimeService(channel="ibm_quantum", token="YOUR_TOKEN")
# Create a simple circuit
qc = QuantumCircuit(2, 2)
qc.h(0)
qc.cx(0, 1)
qc.measure([0, 1], [0, 1])
# Run on real hardware
backend = service.least_busy(simulator=False, operational=True)
sampler = Sampler(backend)
job = sampler.run(qc, shots=4096)
result = job.result()
print(f"Ran on backend: {backend.name}")
print(f"Results: {result.quasi_dists}")