The Quantum Engineer

K. Qiskit Reference

The 10% of the API you use 90% of the time (Qiskit ≥1.0 — pin versions; 0.x code from older tutorials will not run unchanged). Setup: pip install qiskit qiskit-aer matplotlib.

from qiskit import QuantumCircuit, transpile
from qiskit.quantum_info import Statevector, Operator
from qiskit.primitives import StatevectorSampler
from qiskit_aer import AerSimulator
from qiskit.providers.fake_provider import GenericBackendV2

qc = QuantumCircuit(2, 2)                 # quantum + classical registers
qc.h(0); qc.cx(0, 1)                      # build
qc.measure([0, 1], [0, 1])                # measure (basis-change first for X-basis)

sv = Statevector(qc.remove_final_measurements(inplace=False))
print(sv.probabilities_dict())            # exact, no shots

sim = AerSimulator()
tqc = transpile(qc, sim)
counts = sim.run(tqc, shots=4096, seed_simulator=42).result().get_counts()

backend = GenericBackendV2(7)              # fake heavy-hex device
tqc = transpile(qc, backend, optimization_level=3,
                initial_layout=[0, 1], seed_transpiler=42)
print(tqc.count_ops(), tqc.depth())        # the honest cost report

Debugging gold: Operator(qc).equiv(Operator(target)) (unitary equality up to phase); plot_histogram, plot_bloch_multivector (Ch. 16.12–16.14). Docs: qiskit.org/documentation — prefer version-pinned tutorials.