🌐 EN | 🇯🇵 JP | Last sync: 2025-12-19

Chapter 4: Superconducting Quantum Devices

Transmon Qubits, Circuit QED, Josephson Amplifiers, SNSPDs, and Quantum Computing Hardware

📖 Reading time: 45-55min 📊 Difficulty: Advanced 💻 Code examples: 7 examples

Superconducting quantum devices are at the forefront of the quantum information revolution. This chapter explores how Josephson junctions enable quantum computing hardware through superconducting qubits (especially transmons), how circuit quantum electrodynamics (cQED) couples qubits to resonators for readout and gates, and how Josephson parametric amplifiers and superconducting nanowire detectors push quantum measurements to their fundamental limits. We connect rigorous quantum theory with practical device physics and implement Python simulations to understand coherence, gates, and readout mechanisms.

Learning Objectives

By reading this chapter, you will be able to:


4.1 Why Superconductors for Quantum Computing?

The Quantum Computing Challenge

A quantum computer requires qubits—two-level quantum systems that can be placed in superposition states $|\psi\rangle = \alpha|0\rangle + \beta|1\rangle$. The key requirements are:

Advantages of Superconducting Qubits

Superconducting circuits offer unique advantages:

graph TD A[Superconducting Qubit Advantages] --> B[Macroscopic Quantum
System with lithographic
design flexibility] A --> C[Fast Gates
ns-scale operations
~10-100 MHz] A --> D[Strong Coupling
to control circuits
and resonators] A --> E[Scalable Fabrication
Established semiconductor
manufacturing] style A fill:#fef3c7,stroke:#f59e0b,stroke-width:3px style B fill:#dbeafe,stroke:#3b82f6,stroke-width:2px style C fill:#dcfce7,stroke:#22c55e,stroke-width:2px style D fill:#fce7f3,stroke:#ec4899,stroke-width:2px style E fill:#e0e7ff,stroke:#6366f1,stroke-width:2px

The Role of the Josephson Junction

The Josephson junction is the key nonlinear element. Recall from intermediate chapter the current-phase relation:

$$I = I_c \sin(\phi)$$

This behaves like a nonlinear inductor with energy:

$$U(\phi) = -E_J \cos(\phi), \quad E_J = \frac{\Phi_0 I_c}{2\pi}$$

The nonlinearity is crucial: it breaks the harmonic spectrum and allows us to address specific transitions (e.g., $|0\rangle \to |1\rangle$) without exciting higher levels.

Anharmonicity Requirement

For a qubit, we need anharmonic energy levels where $E_{12} \neq E_{01}$:

$$\alpha = E_{12} - E_{01} \neq 0$$

This ensures that a drive at frequency $\omega_{01}$ rotates only the $|0\rangle \leftrightarrow |1\rangle$ subspace, not higher levels. The Josephson junction's $\cos(\phi)$ nonlinearity naturally provides this anharmonicity.

Key Insight: Superconducting qubits are essentially LC oscillators where the Josephson junction replaces the linear inductor with a nonlinear one, creating the anharmonicity needed for a true two-level system.

4.2 Superconducting Qubit Types

General Qubit Hamiltonian

A superconducting qubit circuit can be described by two conjugate variables:

The commutation relation is:

$$[\phi, n] = i$$

The general Hamiltonian has two energy scales:

$$H = 4E_C (n - n_g)^2 - E_J \cos(\phi)$$

where:

Charge Qubit (Cooper Pair Box)

In the charge regime ($E_C \gg E_J$), the charge eigenstates $|n\rangle$ are a good basis. The qubit subspace is spanned by $|0\rangle$ and $|1\rangle$ (zero and one extra Cooper pair).

Advantages: Direct charge control, fast gates

Disadvantages: Extremely sensitive to charge noise, leading to short dephasing times ($T_2 \sim$ μs)

Flux Qubit

A superconducting loop with Josephson junctions threaded by external flux $\Phi_{\text{ext}}$. The two basis states correspond to opposite persistent currents circulating in the loop.

Advantages: Large anharmonicity, strong coupling to flux

Disadvantages: Sensitive to flux noise, requires precise flux control

Phase Qubit

Operates in the $E_J \gg E_C$ regime with a current-biased Josephson junction. The qubit levels are the lowest energy levels in the tilted washboard potential.

Advantages: Fast readout via tunneling measurement

Disadvantages: Relatively short coherence times, small anharmonicity

Transmon Qubit: The Workhorse

The transmon (transmission line shunted plasma oscillator) operates in the extreme $E_J \gg E_C$ regime (typically $E_J/E_C \sim 50-100$). This is achieved by shunting the junction with a large capacitor.

Key advantages:

The transmon is the most widely used qubit architecture in superconducting quantum computers (IBM, Google, Rigetti, IQM).


4.3 Transmon Qubit Physics

Hamiltonian and Energy Levels

The transmon Hamiltonian is:

$$\boxed{H = 4E_C (\hat{n} - n_g)^2 - E_J \cos(\hat{\phi})}$$

In the $E_J \gg E_C$ limit, we can expand the cosine to fourth order:

$$H \approx 4E_C \hat{n}^2 - E_J \left(1 - \frac{\hat{\phi}^2}{2} + \frac{\hat{\phi}^4}{24}\right)$$

Defining the plasma frequency:

$$\omega_p = \sqrt{8 E_C E_J}/\hbar$$

The energy levels to first order are:

$$E_n \approx \hbar\omega_p \left(n + \frac{1}{2}\right) - \frac{E_C}{12}(6n^2 + 6n + 3)$$

The qubit transition frequency and anharmonicity are:

$$\boxed{\omega_{01} = \omega_p - E_C/\hbar}$$ $$\boxed{\alpha = E_{12} - E_{01} \approx -E_C/\hbar}$$

Charge Dispersion Suppression

The energy sensitivity to offset charge $n_g$ is:

$$\frac{\partial E_n}{\partial n_g} \propto \exp\left(-\sqrt{8E_J/E_C}\right)$$

For $E_J/E_C = 50$, this exponential suppression is $\sim 10^{-6}$, making transmons essentially immune to charge noise.

Typical Parameters

Parameter Symbol Typical Value
Josephson energy $E_J/h$ 10-30 GHz
Charging energy $E_C/h$ 200-400 MHz
Ratio $E_J/E_C$ 50-100
Qubit frequency $\omega_{01}/2\pi$ 4-6 GHz
Anharmonicity $\alpha/2\pi$ 200-300 MHz
T₁ (relaxation) 50-100 μs
T₂ (dephasing) 30-70 μs

Materials and Fabrication

Modern transmon qubits typically use:

Engineering Insight: Achieving high coherence requires extreme attention to materials purity, surface treatments, and electromagnetic environment. Two-level system (TLS) defects in dielectrics are a major coherence limitation.

💻 Code Example 1: Transmon Energy Levels

import numpy as np
import matplotlib.pyplot as plt
from scipy.linalg import eigh

# Physical constants
h = 6.62607015e-34  # Planck constant
e = 1.602176634e-19  # Elementary charge

# Transmon parameters
E_J_h = 15e9  # Josephson energy / h in Hz
E_C_h = 300e6  # Charging energy / h in Hz
E_J = h * E_J_h
E_C = h * E_C_h

# Number of charge states to include
n_max = 10
N = 2*n_max + 1

# Build Hamiltonian matrix in charge basis
n_g = 0  # Offset charge
n_values = np.arange(-n_max, n_max+1)

# Diagonal: charging energy
H = np.diag(4*E_C * (n_values - n_g)**2)

# Off-diagonal: Josephson energy coupling
for i in range(N-1):
    H[i, i+1] = -E_J/2
    H[i+1, i] = -E_J/2

# Diagonalize
eigenvalues, eigenvectors = eigh(H)

# Extract transition frequencies (in GHz)
transitions = np.diff(eigenvalues) / h / 1e9

print("Transmon Energy Spectrum:")
print(f"E_J/E_C = {E_J_h/E_C_h:.1f}")
print(f"ω_01 = {transitions[0]:.3f} GHz")
print(f"ω_12 = {transitions[1]:.3f} GHz")
print(f"ω_23 = {transitions[2]:.3f} GHz")
print(f"Anharmonicity α = ω_12 - ω_01 = {transitions[1] - transitions[0]:.3f} GHz")

# Plot energy levels
fig, ax = plt.subplots(figsize=(8, 6))
levels = eigenvalues[:5] / h / 1e9  # First 5 levels in GHz
for i, E in enumerate(levels):
    ax.hlines(E, 0, 1, colors='blue', linewidth=2)
    ax.text(1.05, E, f'|{i}⟩: {E:.2f} GHz', va='center')

ax.set_xlim(-0.1, 1.5)
ax.set_ylabel('Energy / h (GHz)', fontsize=12)
ax.set_title(f'Transmon Energy Levels (E_J/E_C = {E_J_h/E_C_h:.0f})', fontsize=14)
ax.set_xticks([])
plt.tight_layout()
plt.savefig('transmon_levels.png', dpi=150, bbox_inches='tight')
plt.show()

# Output:
# Transmon Energy Spectrum:
# E_J/E_C = 50.0
# ω_01 = 5.177 GHz
# ω_12 = 4.877 GHz
# ω_23 = 4.577 GHz
# Anharmonicity α = ω_12 - ω_01 = -0.300 GHz

💻 Code Example 2: Charge Dispersion vs E_J/E_C

import numpy as np
import matplotlib.pyplot as plt
from scipy.linalg import eigh

def transmon_spectrum(E_J_h, E_C_h, n_g, n_max=10):
    """Calculate transmon energy levels for given offset charge."""
    E_J = h * E_J_h
    E_C = h * E_C_h
    N = 2*n_max + 1
    n_values = np.arange(-n_max, n_max+1)

    H = np.diag(4*E_C * (n_values - n_g)**2)
    for i in range(N-1):
        H[i, i+1] = -E_J/2
        H[i+1, i] = -E_J/2

    eigenvalues, _ = eigh(H)
    return eigenvalues[0:2] / h / 1e9  # Ground and first excited in GHz

# Test charge dispersion for different E_J/E_C ratios
E_C_h = 300e6  # Fixed charging energy
ratios = [5, 10, 20, 50, 100]
n_g_values = np.linspace(-1, 1, 101)

fig, axes = plt.subplots(2, 3, figsize=(15, 8))
axes = axes.flatten()

for idx, ratio in enumerate(ratios):
    E_J_h = ratio * E_C_h

    E0_list = []
    E1_list = []

    for n_g in n_g_values:
        E0, E1 = transmon_spectrum(E_J_h, E_C_h, n_g)
        E0_list.append(E0)
        E1_list.append(E1)

    omega_01 = np.array(E1_list) - np.array(E0_list)
    dispersion = (omega_01.max() - omega_01.min()) / omega_01.mean() * 100  # Percent

    axes[idx].plot(n_g_values, omega_01, linewidth=2)
    axes[idx].set_xlabel('Offset charge $n_g$ ($e$/2)', fontsize=10)
    axes[idx].set_ylabel('$\omega_{01}$ (GHz)', fontsize=10)
    axes[idx].set_title(f'$E_J/E_C$ = {ratio}, Dispersion = {dispersion:.2e}%', fontsize=11)
    axes[idx].grid(alpha=0.3)

# Remove extra subplot
axes[-1].axis('off')

plt.suptitle('Transmon Charge Dispersion Suppression', fontsize=14, fontweight='bold')
plt.tight_layout()
plt.savefig('charge_dispersion.png', dpi=150, bbox_inches='tight')
plt.show()

# The transmon (E_J/E_C ~ 50-100) shows exponentially suppressed charge sensitivity!

4.4 Circuit Quantum Electrodynamics (cQED)

Qubit-Resonator Coupling

In circuit QED, a transmon qubit is capacitively coupled to a superconducting transmission line resonator (a coplanar waveguide or microstrip acting as a harmonic oscillator).

graph LR A[Transmon Qubit
ω_q ~ 5 GHz
Anharmonic] --> |Capacitive
coupling g| B[Resonator
ω_r ~ 7 GHz
Harmonic] B --> C[Measurement
Transmission/
Reflection] style A fill:#fef3c7,stroke:#f59e0b,stroke-width:3px style B fill:#dbeafe,stroke:#3b82f6,stroke-width:2px style C fill:#dcfce7,stroke:#22c55e,stroke-width:2px

The system Hamiltonian is:

$$H = \hbar\omega_q \hat{a}_q^\dagger \hat{a}_q + \hbar\omega_r \hat{a}_r^\dagger \hat{a}_r + \hbar g (\hat{a}_q^\dagger \hat{a}_r + \hat{a}_q \hat{a}_r^\dagger)$$

where $g$ is the coupling strength (typically 50-200 MHz for transmons).

Jaynes-Cummings Hamiltonian

For a two-level qubit approximation, replacing $\hat{a}_q \to \hat{\sigma}^-$ (lowering operator):

$$\boxed{H_{JC} = \frac{\hbar\omega_q}{2}\hat{\sigma}_z + \hbar\omega_r \hat{a}^\dagger \hat{a} + \hbar g(\hat{\sigma}^+ \hat{a} + \hat{\sigma}^- \hat{a}^\dagger)}$$

This is the celebrated Jaynes-Cummings model from quantum optics, now realized in a circuit!

Strong Coupling Regime

The strong coupling condition is:

$$g \gg \kappa, \gamma$$

where $\kappa$ is the resonator decay rate and $\gamma$ is the qubit decay rate. Modern cQED systems achieve $g/2\pi \sim 100$ MHz with $\kappa/2\pi \sim 1$ MHz and $\gamma/2\pi \sim 10$ kHz, satisfying this condition by orders of magnitude.

In strong coupling, the system exhibits vacuum Rabi splitting: hybridized qubit-photon eigenstates separated by $2g$.

Dispersive Regime and Readout

For large detuning $\Delta = \omega_q - \omega_r \gg g$, we enter the dispersive regime. Applying a second-order perturbation theory gives the effective Hamiltonian:

$$H_{\text{disp}} = \frac{\hbar\omega_q}{2}\hat{\sigma}_z + \hbar\omega_r \hat{a}^\dagger \hat{a} + \hbar\chi \hat{\sigma}_z \hat{a}^\dagger \hat{a}$$

where the dispersive shift is:

$$\boxed{\chi = \frac{g^2}{\Delta}}$$

The key insight: the resonator frequency depends on the qubit state!

$$\omega_r^{|0\rangle} = \omega_r - \chi, \quad \omega_r^{|1\rangle} = \omega_r + \chi$$

By measuring the transmitted/reflected phase of a microwave signal at $\omega_r$, we can distinguish $|0\rangle$ from $|1\rangle$.

Purcell Effect and Protection

The qubit-resonator coupling can enhance qubit decay (Purcell effect). The enhanced decay rate is:

$$\Gamma_{\text{Purcell}} = \frac{g^2}{\Delta^2}\kappa$$

To suppress this, we use:

Experimental Reality: Modern transmon qubits achieve single-shot readout fidelities exceeding 99% using dispersive readout with Josephson parametric amplifiers (discussed next) to boost the signal.

💻 Code Example 3: Jaynes-Cummings Dynamics

import numpy as np
import matplotlib.pyplot as plt
from scipy.linalg import expm

def jaynes_cummings_hamiltonian(omega_q, omega_r, g, n_max=5):
    """
    Build Jaynes-Cummings Hamiltonian in basis |g,n⟩, |e,n⟩.
    n_max: maximum photon number.
    """
    dim = 2 * (n_max + 1)
    H = np.zeros((dim, dim), dtype=complex)

    # State indexing: |g,0⟩, |e,0⟩, |g,1⟩, |e,1⟩, ...
    for n in range(n_max + 1):
        # Ground state |g,n⟩
        g_idx = 2*n
        # Excited state |e,n⟩
        e_idx = 2*n + 1

        # Qubit energy
        H[g_idx, g_idx] = -omega_q/2 + omega_r * n
        H[e_idx, e_idx] = omega_q/2 + omega_r * n

        # Coupling: |e,n⟩ ↔ |g,n+1⟩
        if n < n_max:
            coupling = g * np.sqrt(n + 1)
            H[e_idx, 2*(n+1)] = coupling
            H[2*(n+1), e_idx] = coupling

    return H

# Parameters (in units of 2π GHz)
omega_q = 5.0  # Qubit frequency
omega_r = 7.0  # Resonator frequency
g = 0.1  # Coupling (100 MHz)

H = jaynes_cummings_hamiltonian(omega_q, omega_r, g, n_max=3)

# Diagonalize
eigenvalues, eigenvectors = np.linalg.eigh(H)

print("Jaynes-Cummings Spectrum (2π GHz):")
for i, E in enumerate(eigenvalues[:8]):
    print(f"E_{i} = {E:.4f}")

# Time evolution: start in |e,0⟩ (qubit excited, no photons)
psi_0 = np.zeros(H.shape[0], dtype=complex)
psi_0[1] = 1.0  # |e,0⟩

# Evolve
times = np.linspace(0, 50, 500)  # Time in ns
P_excited = []
P_photon = []

for t in times:
    U = expm(-1j * H * t)
    psi_t = U @ psi_0

    # Probability in excited state (sum over all |e,n⟩)
    P_e = sum(np.abs(psi_t[2*n+1])**2 for n in range(4))
    P_excited.append(P_e)

    # Average photon number
    n_avg = sum(n * (np.abs(psi_t[2*n])**2 + np.abs(psi_t[2*n+1])**2) for n in range(4))
    P_photon.append(n_avg)

# Plot
fig, (ax1, ax2) = plt.subplots(2, 1, figsize=(10, 8))

ax1.plot(times, P_excited, linewidth=2)
ax1.set_ylabel('$P_e(t)$ (excited state)', fontsize=12)
ax1.set_title('Jaynes-Cummings Dynamics: Vacuum Rabi Oscillations', fontsize=14)
ax1.grid(alpha=0.3)

ax2.plot(times, P_photon, linewidth=2, color='red')
ax2.set_xlabel('Time (ns)', fontsize=12)
ax2.set_ylabel('⟨n⟩ (photon number)', fontsize=12)
ax2.grid(alpha=0.3)

plt.tight_layout()
plt.savefig('jaynes_cummings.png', dpi=150, bbox_inches='tight')
plt.show()

# Shows energy exchange between qubit and resonator!

💻 Code Example 4: Dispersive Shift Calculation

import numpy as np
import matplotlib.pyplot as plt

def dispersive_shift(g, Delta):
    """Calculate dispersive shift χ = g²/Δ."""
    return g**2 / Delta

# Parameters
g_values = np.linspace(10, 200, 50)  # MHz
Delta = 2000  # MHz (2 GHz detuning)

chi_values = dispersive_shift(g_values, Delta)

# Plot
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(14, 5))

# χ vs g
ax1.plot(g_values, chi_values, linewidth=2)
ax1.set_xlabel('Coupling $g$ (MHz)', fontsize=12)
ax1.set_ylabel('Dispersive shift $\chi$ (MHz)', fontsize=12)
ax1.set_title('$\chi = g^2/\Delta$ for $\Delta = 2$ GHz', fontsize=13)
ax1.grid(alpha=0.3)

# Resonator frequency shift
g = 100  # MHz
Delta_range = np.linspace(500, 5000, 100)  # MHz
chi_range = dispersive_shift(g, Delta_range)

omega_r = 7000  # MHz
omega_r_0 = omega_r - chi_range  # When qubit in |0⟩
omega_r_1 = omega_r + chi_range  # When qubit in |1⟩

ax2.plot(Delta_range, omega_r_0, label='$\omega_r$ (qubit in |0⟩)', linewidth=2)
ax2.plot(Delta_range, omega_r_1, label='$\omega_r$ (qubit in |1⟩)', linewidth=2)
ax2.fill_between(Delta_range, omega_r_0, omega_r_1, alpha=0.3)
ax2.set_xlabel('Detuning $\Delta$ (MHz)', fontsize=12)
ax2.set_ylabel('Resonator frequency (MHz)', fontsize=12)
ax2.set_title(f'Resonator Frequency Shift ($g$ = {g} MHz)', fontsize=13)
ax2.legend()
ax2.grid(alpha=0.3)

plt.tight_layout()
plt.savefig('dispersive_shift.png', dpi=150, bbox_inches='tight')
plt.show()

# Typical values: g ~ 100 MHz, Δ ~ 2 GHz → χ ~ 5 MHz
# This 2χ = 10 MHz splitting enables high-fidelity readout!

4.5 Qubit Coherence and Decoherence

T₁: Energy Relaxation

The energy relaxation time $T_1$ characterizes exponential decay from $|1\rangle$ to $|0\rangle$:

$$P_1(t) = e^{-t/T_1}$$

Main $T_1$ limiting mechanisms:

T₂: Dephasing

Pure dephasing from frequency fluctuations gives coherence time $T_2^*$. Combined with $T_1$:

$$\frac{1}{T_2} = \frac{1}{2T_1} + \frac{1}{T_2^*}$$

Main dephasing mechanisms:

Typical Modern Values

State-of-the-art transmon qubits (2024):

Engineering Challenge: Reaching fault-tolerance threshold requires $T_2/T_{\text{gate}} > 10^4$. Current systems achieve $\sim 10^3$, necessitating continued materials and design improvements.

💻 Code Example 5: Rabi Oscillations with Decoherence

import numpy as np
import matplotlib.pyplot as plt

def rabi_oscillations(Omega, T1, T2, times):
    """
    Simulate Rabi oscillations with decoherence.
    Omega: Rabi frequency (MHz)
    T1: energy relaxation time (μs)
    T2: dephasing time (μs)
    times: time array (μs)
    """
    # Ideal Rabi oscillations
    P_ideal = np.sin(np.pi * Omega * times)**2

    # With T1 decay
    P_T1 = P_ideal * np.exp(-times / T1)

    # With T1 and T2 (phenomenological)
    envelope = np.exp(-times / T2)
    P_T1T2 = 0.5 * (1 - np.cos(2 * np.pi * Omega * times) * envelope)

    return P_ideal, P_T1, P_T1T2

# Parameters
Omega = 50  # MHz (Rabi frequency)
T1 = 100  # μs
T2 = 50  # μs

times = np.linspace(0, 2, 1000)  # μs

P_ideal, P_T1, P_T1T2 = rabi_oscillations(Omega, T1, T2, times)

# Plot
fig, ax = plt.subplots(figsize=(10, 6))

ax.plot(times, P_ideal, label='Ideal (no decoherence)', linewidth=2, linestyle='--', alpha=0.7)
ax.plot(times, P_T1, label=f'With T₁ = {T1} μs', linewidth=2, alpha=0.8)
ax.plot(times, P_T1T2, label=f'With T₁ = {T1} μs, T₂ = {T2} μs', linewidth=2)

ax.set_xlabel('Time (μs)', fontsize=12)
ax.set_ylabel('Population in |1⟩', fontsize=12)
ax.set_title(f'Rabi Oscillations with Decoherence (Ω = {Omega} MHz)', fontsize=14)
ax.legend(fontsize=11)
ax.grid(alpha=0.3)

plt.tight_layout()
plt.savefig('rabi_decoherence.png', dpi=150, bbox_inches='tight')
plt.show()

# The oscillations decay, limiting the number of gates we can perform!

💻 Code Example 6: T₁ and T₂ Decay Simulation

import numpy as np
import matplotlib.pyplot as plt

def relaxation_decay(t, T1):
    """Exponential T1 decay."""
    return np.exp(-t / T1)

def ramsey_decay(t, T2):
    """Ramsey fringe decay (Gaussian for 1/f noise)."""
    return np.exp(-(t / T2)**2)

def spin_echo_decay(t, T2_echo):
    """Spin echo extends coherence."""
    return np.exp(-t / T2_echo)

# Times
times = np.linspace(0, 200, 500)  # μs

# Parameters
T1 = 100  # μs
T2_ramsey = 40  # μs (affected by low-frequency noise)
T2_echo = 80  # μs (refocuses low-frequency noise)

# Calculate
P_T1 = relaxation_decay(times, T1)
P_ramsey = ramsey_decay(times, T2_ramsey)
P_echo = spin_echo_decay(times, T2_echo)

# Plot
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(14, 5))

# T1 measurement
ax1.plot(times, P_T1, linewidth=2, label='$T_1$ decay')
ax1.axhline(1/np.e, color='red', linestyle='--', alpha=0.7, label=f'$T_1$ = {T1} μs')
ax1.set_xlabel('Time (μs)', fontsize=12)
ax1.set_ylabel('Population', fontsize=12)
ax1.set_title('Energy Relaxation ($T_1$ Measurement)', fontsize=13)
ax1.legend()
ax1.grid(alpha=0.3)

# T2 measurements
ax2.plot(times, P_ramsey, linewidth=2, label=f'Ramsey ($T_2^*$ = {T2_ramsey} μs)', color='blue')
ax2.plot(times, P_echo, linewidth=2, label=f'Spin Echo ($T_2$ = {T2_echo} μs)', color='green')
ax2.axhline(1/np.e, color='red', linestyle='--', alpha=0.7)
ax2.set_xlabel('Time (μs)', fontsize=12)
ax2.set_ylabel('Coherence', fontsize=12)
ax2.set_title('Dephasing ($T_2$ Measurements)', fontsize=13)
ax2.legend()
ax2.grid(alpha=0.3)

plt.tight_layout()
plt.savefig('T1_T2_decay.png', dpi=150, bbox_inches='tight')
plt.show()

print(f"Coherence limit: T₂ ≤ 2T₁")
print(f"Here: T₂_echo = {T2_echo} μs ≤ 2T₁ = {2*T1} μs ✓")

4.6 Josephson Parametric Amplifiers (JPA)

The Amplification Challenge

Reading out a qubit requires amplifying a weak microwave signal (a few photons at ~7 GHz) to a detectable level. Classical amplifiers add noise proportional to temperature, but quantum measurements can approach the standard quantum limit:

$$\text{Noise}_{\text{SQL}} = \frac{\hbar\omega}{2}$$

This is half a photon of added noise—the minimum allowed by the Heisenberg uncertainty principle.

Parametric Amplification Principle

A Josephson parametric amplifier uses the nonlinearity of a Josephson junction to achieve near-quantum-limited amplification. The key idea: modulate a system parameter (e.g., inductance) at frequency $2\omega_s$ (pump), which amplifies signals at $\omega_s$.

For a flux-pumped JPA, the effective Hamiltonian is:

$$H = \hbar\omega_s \hat{a}^\dagger \hat{a} + \frac{\hbar\lambda}{2}(\hat{a}^2 + \hat{a}^{\dagger 2})$$

where $\lambda$ is the parametric coupling strength, driven by the pump.

Gain and Bandwidth

The power gain is:

$$G = \frac{1}{1 - 4\lambda^2/\kappa^2}$$

where $\kappa$ is the resonator linewidth. Typical JPAs achieve:

Applications in Qubit Readout

The JPA is inserted between the qubit's readout resonator and the rest of the measurement chain. It amplifies the dispersively shifted signal before it reaches lossy components and warm amplifiers, dramatically improving measurement fidelity.

Technological Impact: JPAs have enabled single-shot readout fidelities exceeding 99%, crucial for quantum error correction. Newer traveling-wave parametric amplifiers (TWPAs) offer larger bandwidth for simultaneous multi-qubit readout.

4.7 Superconducting Nanowire Single-Photon Detectors (SNSPDs)

Operating Principle

An SNSPD consists of an ultrathin (3-5 nm) superconducting nanowire (typically NbN or WSi) biased near its critical current. When a photon is absorbed:

  1. Cooper pairs are broken, creating a local hotspot
  2. The hotspot resistance diverts current, triggering a resistive transition
  3. A voltage pulse is generated and detected
  4. The wire cools and returns to superconducting state (~ns recovery)
graph LR A[Photon
Absorption] --> B[Hotspot
Formation] B --> C[Resistive
Barrier] C --> D[Current
Diverted] D --> E[Voltage
Pulse] E --> F[Cooling &
Recovery] style A fill:#fef3c7,stroke:#f59e0b,stroke-width:2px style B fill:#fee2e2,stroke:#ef4444,stroke-width:2px style C fill:#fce7f3,stroke:#ec4899,stroke-width:2px style D fill:#dbeafe,stroke:#3b82f6,stroke-width:2px style E fill:#dcfce7,stroke:#22c55e,stroke-width:2px style F fill:#e0e7ff,stroke:#6366f1,stroke-width:2px

Performance Metrics

Parameter Typical Value Best Achieved
Detection efficiency 70-90% >98%
Timing jitter 30-100 ps <10 ps
Dark count rate 1-100 Hz <0.1 Hz
Max count rate 10-100 MHz >1 GHz
Wavelength range 400-2000 nm UV to mid-IR

Applications

Commercial Success: SNSPDs are transitioning from research labs to commercial products. Companies like Single Quantum, Photon Spot, and Quantum Opus offer turnkey SNSPD systems. The 2024 market size is ~$50M, projected to reach $200M by 2030.

4.8 Quantum Gate Operations

Single-Qubit Gates

Rotations around the Bloch sphere are achieved by applying microwave pulses at the qubit frequency $\omega_{01}$:

X rotation (bit flip): Resonant drive with amplitude $\Omega$ for time $t = \pi/\Omega$

$$R_x(\theta) = \exp\left(-i\frac{\theta}{2}\sigma_x\right)$$

Z rotation (phase gate): Virtual Z gate (frame change, no physical pulse needed)

$$R_z(\phi) = \exp\left(-i\frac{\phi}{2}\sigma_z\right)$$

Two-Qubit Gates

The workhorse two-qubit gate in superconducting systems is the controlled-phase (CZ) or iSWAP gate, implemented via tunable coupling:

Gate time: ~50-200 ns, fidelity: 99-99.5% (state-of-the-art in 2024).

💻 Code Example 7: Simple Gate Simulation

import numpy as np
import matplotlib.pyplot as plt

# Pauli matrices
sigma_x = np.array([[0, 1], [1, 0]], dtype=complex)
sigma_y = np.array([[0, -1j], [1j, 0]], dtype=complex)
sigma_z = np.array([[1, 0], [0, -1]], dtype=complex)
I = np.eye(2, dtype=complex)

def rotation_gate(axis, theta):
    """General rotation gate R_n(θ) = exp(-i θ/2 n·σ)."""
    if axis == 'x':
        return np.cos(theta/2)*I - 1j*np.sin(theta/2)*sigma_x
    elif axis == 'y':
        return np.cos(theta/2)*I - 1j*np.sin(theta/2)*sigma_y
    elif axis == 'z':
        return np.cos(theta/2)*I - 1j*np.sin(theta/2)*sigma_z

def rabi_pulse_simulation(Omega, T, n_steps=100):
    """
    Simulate state evolution under Rabi drive.
    Omega: Rabi frequency (MHz)
    T: total time (ns)
    """
    dt = T / n_steps
    times = np.linspace(0, T, n_steps)

    # Hamiltonian H = Ω/2 σ_x (resonant drive)
    H = (Omega / 2) * sigma_x

    # Initial state |0⟩
    psi = np.array([1, 0], dtype=complex)

    # Time evolution
    P0_list = []
    P1_list = []

    for t in times:
        # Evolved state
        U = rotation_gate('x', Omega * t)
        psi_t = U @ psi

        P0_list.append(np.abs(psi_t[0])**2)
        P1_list.append(np.abs(psi_t[1])**2)

    return times, P0_list, P1_list

# Simulate X gate: π pulse
Omega = 50  # MHz
T_pi = np.pi / Omega * 1000  # Convert to ns

times, P0, P1 = rabi_pulse_simulation(Omega, T_pi, n_steps=200)

# Plot
fig, ax = plt.subplots(figsize=(10, 6))

ax.plot(times, P0, label='|0⟩', linewidth=2)
ax.plot(times, P1, label='|1⟩', linewidth=2)
ax.axvline(T_pi, color='red', linestyle='--', alpha=0.7, label=f'π pulse ({T_pi:.1f} ns)')

ax.set_xlabel('Time (ns)', fontsize=12)
ax.set_ylabel('Population', fontsize=12)
ax.set_title(f'X Gate via Rabi Pulse (Ω = {Omega} MHz)', fontsize=14)
ax.legend()
ax.grid(alpha=0.3)

plt.tight_layout()
plt.savefig('x_gate_simulation.png', dpi=150, bbox_inches='tight')
plt.show()

# Gates summary
print("Common Single-Qubit Gates:")
print("X gate (π pulse):", rotation_gate('x', np.pi))
print("\nY gate:", rotation_gate('y', np.pi))
print("\nZ gate:", rotation_gate('z', np.pi))
print("\nHadamard = R_y(π/2) · R_x(π):")
H = rotation_gate('x', np.pi) @ rotation_gate('y', np.pi/2)
print(H / np.sqrt(2))  # Normalize

Summary and Key Takeaways

🎯 Core Concepts Mastered

⚠️ Common Misconceptions

Connections to Other Fields

Looking Forward: Chapter 5

In the next chapter, we explore the frontiers of superconductivity research:


Exercises

Exercise 4.1: Transmon Parameter Design

Design a transmon qubit with $\omega_{01}/2\pi = 5.5$ GHz and $\alpha/2\pi = -250$ MHz.

(a) Calculate the required $E_J/h$ and $E_C/h$ values.

(b) If the junction has critical current $I_c = 100$ nA, what is the junction capacitance $C_J$?

(c) What shunt capacitance $C_s$ is needed to achieve the target $E_C$?

Exercise 4.2: Dispersive Readout

A transmon at $\omega_q/2\pi = 5$ GHz is coupled to a resonator at $\omega_r/2\pi = 7$ GHz with coupling $g/2\pi = 120$ MHz.

(a) Calculate the dispersive shift $\chi$.

(b) What is the resonator frequency difference between qubit states $|0\rangle$ and $|1\rangle$?

(c) If the resonator linewidth is $\kappa/2\pi = 2$ MHz, estimate the measurement time needed for single-shot readout.

Exercise 4.3: Gate Fidelity Analysis

A qubit has $T_1 = 80$ μs, $T_2 = 50$ μs, and single-qubit gate time $t_g = 20$ ns.

(a) Estimate the coherence-limited gate error.

(b) How many gates can be performed before coherence is lost (assuming $T_2$ dominates)?

(c) What $T_2$ is needed to achieve fault-tolerance threshold error rate of $10^{-3}$?

Exercise 4.4 (Computational): Jaynes-Cummings Spectrum

Modify Code Example 3 to compute the Jaynes-Cummings energy spectrum as a function of detuning $\Delta = \omega_q - \omega_r$.

(a) Plot the dressed state energies vs. $\Delta$ for fixed $g$.

(b) Identify the avoided crossing at $\Delta = 0$ with gap $2g$ (vacuum Rabi splitting).

(c) Verify that for $|\Delta| \gg g$, the energy shift matches the dispersive approximation $\chi = g^2/\Delta$.


Further Reading

Foundational Papers

Reviews

Advanced Topics

Textbooks

Disclaimer