Skill Tracer
Skills › Scientific Agent Skills › qiskit › algorithms.md

algorithms.md

319 lines · skills/qiskit/references/algorithms.md at 5f2bc03

Open on GitHub
1# Algorithms, Addons, and Application Packages
2
3The core `qiskit` distribution provides circuits, operators, primitives, synthesis, transpilation, and quantum-information tools. High-level algorithms and domain applications live in separate packages.
4

Algorithms, Addons, and Application Packages

The core qiskit distribution provides circuits, operators, primitives, synthesis, transpilation, and quantum-information tools. High-level algorithms and domain applications live in separate packages.

Raw lines 1 to 4
5## Reviewed Package Matrix
6
7Release metadata and official API documentation checked on **2026-10-01**. The VQE example was executed against a dense exact reference, and the two-variable Optimization/QAOA example returned the known optimum. Nature, Machine Learning, and addon workflows are illustrative and were not rerun in this refresh:
8
9| Package | Version | Primary role |
10|---|---:|---|
11| `qiskit-algorithms` | 0.4.0 | VQE, QAOA, Grover, phase estimation, eigensolvers, optimizers |
12| `qiskit-nature` | 0.8.0 | Electronic structure, second quantization, mappers |
13| `qiskit-nature-pyscf` | 0.4.0 | PySCF electronic-structure driver integration |
14| `qiskit-machine-learning` | 0.9.1 | Kernels, QNNs, classifiers/regressors, Torch connector |
15| `qiskit-optimization` | 0.7.0 | Quadratic programs, converters, quantum optimization wrappers |
16| `qiskit-addon-cutting` | 0.10.0 | Circuit and operator cutting |
17| `qiskit-addon-sqd` | 0.13.1 | Sample-based quantum diagonalization |
18| `qiskit-addon-obp` | 0.3.0 | Operator backpropagation |
19| `qiskit-addon-mpf` | 0.3.0 | Multi-product formulas |
20| `qiskit-addon-aqc-tensor` | 0.3.1 | Approximate quantum compilation with tensor networks |
22Install exact pins together in a fresh environment:
24```bash
25uv pip install \
26 "qiskit==2.5.2" \
27 "qiskit-algorithms==0.4.0" \
28 "qiskit-optimization==0.7.0"
29```
31For chemistry:
33```bash
34uv pip install \
35 "qiskit==2.5.2" \
36 "qiskit-algorithms==0.4.0" \
37 "qiskit-nature[pyscf]==0.8.0"
38```
40Resolve application packages together; their Qiskit compatibility windows can differ.

Reviewed Package Matrix

Release metadata and official API documentation checked on 2026-10-01. The VQE example was executed against a dense exact reference, and the two-variable Optimization/QAOA example returned the known optimum. Nature, Machine Learning, and addon workflows are illustrative and were not rerun in this refresh:

PackageVersionPrimary role
qiskit-algorithms0.4.0VQE, QAOA, Grover, phase estimation, eigensolvers, optimizers
qiskit-nature0.8.0Electronic structure, second quantization, mappers
qiskit-nature-pyscf0.4.0PySCF electronic-structure driver integration
qiskit-machine-learning0.9.1Kernels, QNNs, classifiers/regressors, Torch connector
qiskit-optimization0.7.0Quadratic programs, converters, quantum optimization wrappers
qiskit-addon-cutting0.10.0Circuit and operator cutting
qiskit-addon-sqd0.13.1Sample-based quantum diagonalization
qiskit-addon-obp0.3.0Operator backpropagation
qiskit-addon-mpf0.3.0Multi-product formulas
qiskit-addon-aqc-tensor0.3.1Approximate quantum compilation with tensor networks

Install exact pins together in a fresh environment:

uv pip install \
  "qiskit==2.5.2" \
  "qiskit-algorithms==0.4.0" \
  "qiskit-optimization==0.7.0"

For chemistry:

uv pip install \
  "qiskit==2.5.2" \
  "qiskit-algorithms==0.4.0" \
  "qiskit-nature[pyscf]==0.8.0"

Resolve application packages together; their Qiskit compatibility windows can differ.

Raw lines 5 to 41
42## Decide Between Manual and Library Implementations
44Use a manual circuit when:
46- teaching or inspecting a small algorithm,
47- testing a new circuit construction,
48- controlling every primitive PUB and compilation step,
49- avoiding an application package dependency.
51Use an application package when:
53- it provides tested problem transformations,
54- the result object and domain post-processing are valuable,
55- the implementation accepts current V2 primitives,
56- its release supports the installed Qiskit version.
58Do not copy a pre-1.0 algorithm tutorial without checking constructors and primitive requirements.

Decide Between Manual and Library Implementations

Use a manual circuit when:

  • teaching or inspecting a small algorithm,
  • testing a new circuit construction,
  • controlling every primitive PUB and compilation step,
  • avoiding an application package dependency.

Use an application package when:

  • it provides tested problem transformations,
  • the result object and domain post-processing are valuable,
  • the implementation accepts current V2 primitives,
  • its release supports the installed Qiskit version.

Do not copy a pre-1.0 algorithm tutorial without checking constructors and primitive requirements.

Raw lines 42 to 59
60## VQE with Qiskit Algorithms 0.4
62This verified local example uses the V2 `StatevectorEstimator`:
64```python
65from qiskit.circuit.library import efficient_su2
66from qiskit.primitives import StatevectorEstimator
67from qiskit.quantum_info import SparsePauliOp
68from qiskit_algorithms import VQE
69from qiskit_algorithms.optimizers import SLSQP
71hamiltonian = SparsePauliOp.from_list(
72 [
73 ("ZI", 1.0),
74 ("IZ", 1.0),
75 ("XX", 0.2),
76 ]
78ansatz = efficient_su2(
79 num_qubits=2,
80 reps=1,
81 entanglement="linear",
84vqe = VQE(
85 estimator=StatevectorEstimator(),
86 ansatz=ansatz,
87 optimizer=SLSQP(maxiter=100),
88 initial_point=[0.0] * ansatz.num_parameters,
90result = vqe.compute_minimum_eigenvalue(hamiltonian)
91energy = float(result.eigenvalue.real)
92# Tiny diagnostic only: dense diagonalization is exponential.
93import numpy as np
94exact_energy = float(np.linalg.eigvalsh(hamiltonian.to_matrix())[0])
95assert abs(energy - exact_energy) < 1e-5
96print(energy, exact_energy)
97```
99For hardware:
1011. Use the Runtime client-side `Estimator`.
1022. Provide a transpiler adapter or manage the parameterized ISA circuit explicitly.
1033. Bound optimizer iterations and requested precision.
1044. Store each job ID and convergence record.
106Do not transpile a newly bound circuit from scratch in every cost-function call.

VQE with Qiskit Algorithms 0.4

This verified local example uses the V2 StatevectorEstimator:

from qiskit.circuit.library import efficient_su2
from qiskit.primitives import StatevectorEstimator
from qiskit.quantum_info import SparsePauliOp
from qiskit_algorithms import VQE
from qiskit_algorithms.optimizers import SLSQP

hamiltonian = SparsePauliOp.from_list(
    [
        ("ZI", 1.0),
        ("IZ", 1.0),
        ("XX", 0.2),
    ]
)
ansatz = efficient_su2(
    num_qubits=2,
    reps=1,
    entanglement="linear",
)

vqe = VQE(
    estimator=StatevectorEstimator(),
    ansatz=ansatz,
    optimizer=SLSQP(maxiter=100),
    initial_point=[0.0] * ansatz.num_parameters,
)
result = vqe.compute_minimum_eigenvalue(hamiltonian)
energy = float(result.eigenvalue.real)
# Tiny diagnostic only: dense diagonalization is exponential.
import numpy as np
exact_energy = float(np.linalg.eigvalsh(hamiltonian.to_matrix())[0])
assert abs(energy - exact_energy) < 1e-5
print(energy, exact_energy)

For hardware:

  1. Use the Runtime client-side Estimator.
  2. Provide a transpiler adapter or manage the parameterized ISA circuit explicitly.
  3. Bound optimizer iterations and requested precision.
  4. Store each job ID and convergence record.

Do not transpile a newly bound circuit from scratch in every cost-function call.

Raw lines 60 to 107
108## QAOA and Qiskit Optimization
110Model a binary problem with `QuadraticProgram`:
112```python
113from qiskit.primitives import StatevectorSampler
114from qiskit_optimization.minimum_eigensolvers import QAOA
115from qiskit_optimization.optimizers import COBYLA
116from qiskit_optimization.utils import algorithm_globals
117from qiskit_optimization import QuadraticProgram
118from qiskit_optimization.algorithms import MinimumEigenOptimizer
120problem = QuadraticProgram("binary_demo")
121problem.binary_var("x")
122problem.binary_var("y")
123problem.maximize(
124 linear={"x": 1, "y": 1},
125 quadratic={("x", "y"): -2},
128algorithm_globals.random_seed = 5 # optimizer initialization is separate from sampler seed
129qaoa = QAOA(
130 sampler=StatevectorSampler(seed=5),
131 optimizer=COBYLA(maxiter=100),
132 reps=1,
134solver = MinimumEigenOptimizer(qaoa)
135result = solver.solve(problem)
137print(result.x, result.fval, result.status)
138```
140Qiskit Optimization 0.7 ships its own `minimum_eigensolvers`, optimizers, and utilities; use those types with `MinimumEigenOptimizer` instead of mixing `qiskit_algorithms.QAOA` results. Use optimizer objects such as `COBYLA(...)`, not old string-valued optimizer arguments.
142Before claiming a quantum result:
144- compare with a classical solver for small instances,
145- verify variable-to-bitstring ordering,
146- report feasibility and objective value,
147- separate optimizer stochasticity from quantum sampling,
148- quantify total circuit evaluations and shot cost.

QAOA and Qiskit Optimization

Model a binary problem with QuadraticProgram:

from qiskit.primitives import StatevectorSampler
from qiskit_optimization.minimum_eigensolvers import QAOA
from qiskit_optimization.optimizers import COBYLA
from qiskit_optimization.utils import algorithm_globals
from qiskit_optimization import QuadraticProgram
from qiskit_optimization.algorithms import MinimumEigenOptimizer

problem = QuadraticProgram("binary_demo")
problem.binary_var("x")
problem.binary_var("y")
problem.maximize(
    linear={"x": 1, "y": 1},
    quadratic={("x", "y"): -2},
)

algorithm_globals.random_seed = 5  # optimizer initialization is separate from sampler seed
qaoa = QAOA(
    sampler=StatevectorSampler(seed=5),
    optimizer=COBYLA(maxiter=100),
    reps=1,
)
solver = MinimumEigenOptimizer(qaoa)
result = solver.solve(problem)

print(result.x, result.fval, result.status)

Qiskit Optimization 0.7 ships its own minimum_eigensolvers, optimizers, and utilities; use those types with MinimumEigenOptimizer instead of mixing qiskit_algorithms.QAOA results. Use optimizer objects such as COBYLA(...), not old string-valued optimizer arguments.

Before claiming a quantum result:

  • compare with a classical solver for small instances,
  • verify variable-to-bitstring ordering,
  • report feasibility and objective value,
  • separate optimizer stochasticity from quantum sampling,
  • quantify total circuit evaluations and shot cost.
Raw lines 108 to 149
150## Grover and Phase Estimation
152Qiskit Algorithms 0.4 constructors accept V2 Sampler implementations:
154```python
155from qiskit.primitives import StatevectorSampler
156from qiskit_algorithms import Grover, PhaseEstimation
158sampler = StatevectorSampler(seed=5)
159grover = Grover(sampler=sampler)
160phase_estimation = PhaseEstimation(
161 num_evaluation_qubits=4,
162 sampler=sampler,
164```
166The old `quantum_instance=` argument is not current.
168Use `QFTGate` in custom phase-estimation circuits:
170```python
171from qiskit import QuantumCircuit
172from qiskit.circuit.library import QFTGate
174inverse_qft = QFTGate(4).inverse()
175circuit = QuantumCircuit(4)
176circuit.append(inverse_qft, range(4))
177```
179The `QFT` blueprint class is deprecated and scheduled for removal in Qiskit 3.0.

Grover and Phase Estimation

Qiskit Algorithms 0.4 constructors accept V2 Sampler implementations:

from qiskit.primitives import StatevectorSampler
from qiskit_algorithms import Grover, PhaseEstimation

sampler = StatevectorSampler(seed=5)
grover = Grover(sampler=sampler)
phase_estimation = PhaseEstimation(
    num_evaluation_qubits=4,
    sampler=sampler,
)

The old quantum_instance= argument is not current.

Use QFTGate in custom phase-estimation circuits:

from qiskit import QuantumCircuit
from qiskit.circuit.library import QFTGate

inverse_qft = QFTGate(4).inverse()
circuit = QuantumCircuit(4)
circuit.append(inverse_qft, range(4))

The QFT blueprint class is deprecated and scheduled for removal in Qiskit 3.0.

Raw lines 150 to 180
181## Qiskit Nature
183Qiskit Nature converts domain problems into second-quantized operators and qubit operators.
185```python
186from qiskit_nature.units import DistanceUnit
187from qiskit_nature.second_q.drivers import PySCFDriver
188from qiskit_nature.second_q.mappers import JordanWignerMapper
190driver = PySCFDriver(
191 atom="H 0 0 0; H 0 0 0.735",
192 unit=DistanceUnit.ANGSTROM,
193 basis="sto3g",
194 charge=0,
195 spin=0,
197problem = driver.run()
199fermionic_hamiltonian = problem.hamiltonian.second_q_op()
200mapper = JordanWignerMapper()
201qubit_hamiltonian = mapper.map(fermionic_hamiltonian)
203print(problem.num_spatial_orbitals)
204print(problem.num_particles)
205print(qubit_hamiltonian.num_qubits)
206```
208`qiskit-nature[pyscf]` installs the PySCF dependency for this driver. The separate `qiskit-nature-pyscf` plugin provides reverse integration and is not required by this snippet. The PySCF calculation is classical preprocessing. Record:
210- geometry and units,
211- basis set,
212- charge and spin,
213- active-space or freeze-core choices,
214- mapper and symmetry reductions,
215- nuclear repulsion energy,
216- package versions.
218Preserve the physical particle-number/spin sector when solving the mapped operator; unrestricted minimization over the full qubit Hilbert space can select the wrong sector. Do not add the nuclear repulsion term twice. Prefer Qiskit Nature's result interpreters for complete energy reporting.
220`QubitConverter` is obsolete; use mapper classes directly.

Qiskit Nature

Qiskit Nature converts domain problems into second-quantized operators and qubit operators.

from qiskit_nature.units import DistanceUnit
from qiskit_nature.second_q.drivers import PySCFDriver
from qiskit_nature.second_q.mappers import JordanWignerMapper

driver = PySCFDriver(
    atom="H 0 0 0; H 0 0 0.735",
    unit=DistanceUnit.ANGSTROM,
    basis="sto3g",
    charge=0,
    spin=0,
)
problem = driver.run()

fermionic_hamiltonian = problem.hamiltonian.second_q_op()
mapper = JordanWignerMapper()
qubit_hamiltonian = mapper.map(fermionic_hamiltonian)

print(problem.num_spatial_orbitals)
print(problem.num_particles)
print(qubit_hamiltonian.num_qubits)

qiskit-nature[pyscf] installs the PySCF dependency for this driver. The separate qiskit-nature-pyscf plugin provides reverse integration and is not required by this snippet. The PySCF calculation is classical preprocessing. Record:

  • geometry and units,
  • basis set,
  • charge and spin,
  • active-space or freeze-core choices,
  • mapper and symmetry reductions,
  • nuclear repulsion energy,
  • package versions.

Preserve the physical particle-number/spin sector when solving the mapped operator; unrestricted minimization over the full qubit Hilbert space can select the wrong sector. Do not add the nuclear repulsion term twice. Prefer Qiskit Nature's result interpreters for complete energy reporting.

QubitConverter is obsolete; use mapper classes directly.

Raw lines 181 to 221
222## Qiskit Machine Learning 0.9
224Qiskit Machine Learning includes quantum kernels, quantum neural networks, trainable models, and PyTorch integration.
226This documentation-checked illustrative kernel example uses APIs moved into the Machine Learning package:
228```python
229import numpy as np
230from qiskit.circuit.library import zz_feature_map
231from qiskit.primitives import StatevectorSampler
232from qiskit_machine_learning.kernels import FidelityQuantumKernel
233from qiskit_machine_learning.state_fidelities import ComputeUncompute
235feature_map = zz_feature_map(
236 feature_dimension=2,
237 reps=1,
238 entanglement="full",
240sampler = StatevectorSampler(seed=5)
241fidelity = ComputeUncompute(sampler=sampler)
242kernel = FidelityQuantumKernel(
243 fidelity=fidelity,
244 feature_map=feature_map,
247x = np.array([[0.1, 0.2], [0.3, 0.4]])
248kernel_matrix = kernel.evaluate(x)
249```
251Since Qiskit Machine Learning 0.8, relevant gradients, optimizers, state fidelities, and utilities moved from `qiskit_algorithms` into `qiskit_machine_learning`. Check its migration guide before adapting old imports.
253For evaluation:
255- use a held-out test set,
256- compare against matched classical kernels/models,
257- avoid generating labels randomly in demonstration code presented as evidence,
258- account for kernel-matrix \(O(n^2)\) evaluations,
259- separate simulation results from hardware results.

Qiskit Machine Learning 0.9

Qiskit Machine Learning includes quantum kernels, quantum neural networks, trainable models, and PyTorch integration.

This documentation-checked illustrative kernel example uses APIs moved into the Machine Learning package:

import numpy as np
from qiskit.circuit.library import zz_feature_map
from qiskit.primitives import StatevectorSampler
from qiskit_machine_learning.kernels import FidelityQuantumKernel
from qiskit_machine_learning.state_fidelities import ComputeUncompute

feature_map = zz_feature_map(
    feature_dimension=2,
    reps=1,
    entanglement="full",
)
sampler = StatevectorSampler(seed=5)
fidelity = ComputeUncompute(sampler=sampler)
kernel = FidelityQuantumKernel(
    fidelity=fidelity,
    feature_map=feature_map,
)

x = np.array([[0.1, 0.2], [0.3, 0.4]])
kernel_matrix = kernel.evaluate(x)

Since Qiskit Machine Learning 0.8, relevant gradients, optimizers, state fidelities, and utilities moved from qiskit_algorithms into qiskit_machine_learning. Check its migration guide before adapting old imports.

For evaluation:

  • use a held-out test set,
  • compare against matched classical kernels/models,
  • avoid generating labels randomly in demonstration code presented as evidence,
  • account for kernel-matrix \(O(n^2)\) evaluations,
  • separate simulation results from hardware results.
Raw lines 222 to 260
261## Qiskit Addons
263Addons are modular algorithm-building components aligned with stages of the Qiskit workflow.
265| Addon | Typical stage | Use |
266|---|---|---|
267| Circuit cutting | Optimize / execute / reconstruct | Split large circuits or observables and reconstruct estimates |
268| Operator backpropagation (OBP) | Optimize | Move selected circuit operations into observables |
269| Multi-product formulas (MPF) | Map / optimize | Approximate time evolution using formula combinations |
270| AQC-Tensor | Map / optimize | Approximate target circuits with tensor-network-assisted compilation |
271| Sample-based quantum diagonalization (SQD) | Analyze | Combine QPU samples with classical subspace diagonalization |
273Example installation:
275```bash
276uv pip install "qiskit-addon-cutting==0.10.0"
277uv pip install "qiskit-addon-sqd==0.13.1"
278uv pip install "qiskit-addon-obp==0.3.0"
279uv pip install "qiskit-addon-mpf==0.3.0"
280uv pip install "qiskit-addon-aqc-tensor==0.3.1"
281```
283Each addon has independent release notes and assumptions. Read its tutorial and validate against a classically tractable instance.

Qiskit Addons

Addons are modular algorithm-building components aligned with stages of the Qiskit workflow.

AddonTypical stageUse
Circuit cuttingOptimize / execute / reconstructSplit large circuits or observables and reconstruct estimates
Operator backpropagation (OBP)OptimizeMove selected circuit operations into observables
Multi-product formulas (MPF)Map / optimizeApproximate time evolution using formula combinations
AQC-TensorMap / optimizeApproximate target circuits with tensor-network-assisted compilation
Sample-based quantum diagonalization (SQD)AnalyzeCombine QPU samples with classical subspace diagonalization

Example installation:

uv pip install "qiskit-addon-cutting==0.10.0"
uv pip install "qiskit-addon-sqd==0.13.1"
uv pip install "qiskit-addon-obp==0.3.0"
uv pip install "qiskit-addon-mpf==0.3.0"
uv pip install "qiskit-addon-aqc-tensor==0.3.1"

Each addon has independent release notes and assumptions. Read its tutorial and validate against a classically tractable instance.

Raw lines 261 to 284
285## Direct Quantum-Information Tools
287Many tasks do not need a high-level algorithm package:
289```python
290from qiskit.quantum_info import DensityMatrix, Operator, Statevector
292state = Statevector.from_instruction(circuit)
293operator = Operator(circuit)
294density_matrix = DensityMatrix(state)
295```
297Use `qiskit.quantum_info` for:
299- ideal state/operator analysis,
300- fidelity and distance metrics,
301- partial traces and entropies,
302- Pauli and Clifford algebra,
303- channel representations,
304- small-system validation.
306Dense state and operator memory grows exponentially; check dimensions before constructing them.

Direct Quantum-Information Tools

Many tasks do not need a high-level algorithm package:

from qiskit.quantum_info import DensityMatrix, Operator, Statevector

state = Statevector.from_instruction(circuit)
operator = Operator(circuit)
density_matrix = DensityMatrix(state)

Use qiskit.quantum_info for:

  • ideal state/operator analysis,
  • fidelity and distance metrics,
  • partial traces and entropies,
  • Pauli and Clifford algebra,
  • channel representations,
  • small-system validation.

Dense state and operator memory grows exponentially; check dimensions before constructing them.

Raw lines 285 to 307
308## Algorithm Review Checklist
3101. Is the cited speedup asymptotic, heuristic, or empirically demonstrated?
3112. Does state preparation or readout dominate the claimed advantage?
3123. Is the instance classically verifiable at the tested size?
3134. Are package and primitive versions compatible?
3145. Does the implementation use V2 primitives?
3156. Is the parameterized circuit compiled once for the selected target?
3167. Are observable layouts and bit order handled correctly?
3178. Are optimizer evaluations, precision, shots, mitigation, and total QPU usage reported?
3189. Is every result labeled as ideal simulation, noisy simulation, or hardware?
31910. Are classical baselines and uncertainty included?

Algorithm Review Checklist

  1. Is the cited speedup asymptotic, heuristic, or empirically demonstrated?
  2. Does state preparation or readout dominate the claimed advantage?
  3. Is the instance classically verifiable at the tested size?
  4. Are package and primitive versions compatible?
  5. Does the implementation use V2 primitives?
  6. Is the parameterized circuit compiled once for the selected target?
  7. Are observable layouts and bit order handled correctly?
  8. Are optimizer evaluations, precision, shots, mitigation, and total QPU usage reported?
  9. Is every result labeled as ideal simulation, noisy simulation, or hardware?
  10. Are classical baselines and uncertainty included?
Raw lines 308 to 319