Table of Contents

Quantum Circuits

Quantum circuits are the fundamental way to describe quantum computations in Qiskit—an ordered sequence of operations applied to qubits. A circuit specifies which gates to apply, in what order, on which qubits, and where to measure. Think of it like assembly code: abstract and portable, executable on any backend that supports the required gate set.

In Qiskit, a QuantumCircuit object holds qubits (quantum registers) and classical bits (classical registers). Qubits hold quantum state; classical bits hold measurement results. Gates modify qubit state; measurements collapse qubits and write results to classical bits.

from qiskit import QuantumCircuit
 
# Create a 3-qubit, 3-bit circuit
qc = QuantumCircuit(3, 3)
 
# Apply gates
qc.h(0)           # Hadamard on qubit 0
qc.cx(0, 1)       # CNOT: qubit 0 controls qubit 1
qc.rz(0.5, 2)     # RZ rotation on qubit 2
 
# Measure all qubits
qc.measure([0, 1, 2], [0, 1, 2])
 
# Draw the circuit
print(qc.draw())

Circuits are abstract—they don't execute until you send them to a backend (simulator or hardware). This abstraction lets you design once and run on different backends. Before execution, transpilation adapts your circuit to the backend's native gates and qubit topology.

Circuit Construction

Gates can be chained, and Qiskit provides hundreds: single-qubit gates (H, X, Y, Z, S, T, RX, RY, RZ), two-qubit gates (CNOT, CZ, SWAP), and multi-qubit gates (Toffoli, controlled operations). Use the circuit's methods to add gates: qc.h(0), qc.cx(0, 1), etc.

You can also inspect and manipulate circuits: get the number of qubits/bits, decompose gates, remove or insert operations, and compose smaller circuits together.

# Get circuit info
print(qc.num_qubits)      # 3
print(qc.num_clbits)      # 3
print(qc.depth())         # Circuit depth (longest qubit path)
 
# Compose two circuits
qc2 = QuantumCircuit(3, 3)
qc2.h([0, 1, 2])
combined = qc.compose(qc2)

Parameterized Circuits

Parameterized circuits replace fixed rotation angles with parameters, useful for variational algorithms. Define parameters once, then bind them to different values for each evaluation without rebuilding the circuit.