30 min read

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:

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:

  1. 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.

  2. 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.

  3. 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:

  1. 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.

  2. 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.

  3. 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)

  4. 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.

# 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

Pros: Adaptive, avoids barren plateaus, chemically motivated. Cons: Requires many VQE iterations (one per operator), each requiring gradient computation.

18.15.3 Measurement Overhead

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:

  • Naive: $O(M^4)$ groups for an $M$-orbital system (one per term)
  • Commuting groups: $O(M^2)$ groups (grouping commuting Pauli strings)
  • Optimal grouping: $O(M)$ groups using graph coloring algorithms

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.

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}")

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.


18.16 Quantum Volume in Depth

18.16.1 Detailed QV Protocol

The quantum volume benchmark tests whether a device can reliably implement random square circuits of depth $d$ on $d$ qubits. The protocol is:

  1. Choose a width $d$ (number of qubits).
  2. Generate random circuits: Create $S_{d}$ random circuits of depth $d$ on $d$ qubits. Each layer consists of random SU(4) two-qubit gates applied to random pairs of qubits.
  3. Run each circuit and collect the output distribution.
  4. Compute the heavy output probability $h_d$ for each circuit.
  5. Determine if $h_d > 2/3$ with 97.5% confidence over all circuits.
  6. The quantum volume is $2^d$ for the largest $d$ that passes.

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.

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

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.

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

Qiskit is the most widely used quantum computing framework. Key components:

  • Qiskit Terra: Circuit construction, transpilation, and execution
  • Qiskit Aer: Noisy simulation backend
  • Qiskit Nature: Quantum chemistry (VQE, QPE, electronic structure)
  • Qiskit Finance: Financial applications (portfolio optimization, pricing)
  • Qiskit Optimization: Combinatorial optimization (QAOA, VQE)
  • Qiskit Machine Learning: Quantum ML (classifiers, regressors, kernels)

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}")

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.