About this map
Sections
What this is
Quantum algorithms are not written from scratch. They are assembled from a small number of reusable steps, and almost every published method is a different route through the same handful of them.
This is a map of those routes. Circles are the things an algorithm can be holding. Lines are the steps that carry you from one to the next. A method is a path across.
Nothing here is generated. Every line was read out of a paper and checked against it.
How to read it
- Something you can hold — a state, a matrix, a circuit, an answer.
- The same, in the middle of a step you have opened.
- A step. Someone has published a way through it.
- A step whose way through has not been pinned to one method.
- A step nothing published fills yet.
- A step you have opened. What is drawn inside it is how it was done.
- There is a record in the repository for this one.
How to move around
- Two fingers move the map. Pinch to zoom, or hold ctrl and scroll.
- Click a step to open it in place — everything else stays where it is.
- Click a name to read the full record without leaving the map.
- Arrow keys move, plus and minus zoom, zero puts it back.
What a line is claiming
A solid line means a paper puts those two steps together and we have the citation. A long-dashed line means the route is recorded but no single method has been named for that step. A short-dashed line means nothing published fills it — the step is real, the way through is not written yet.
A count after a step's name — ×T/h, ×O(κ) — means the route walks that step that many times rather than once. It is the source's own symbol, and the card says what it stands for and what one turn costs. A step with no count is a step no source we read said is repeated, which is not the same as one taken once.
A line drawn nested under another, on the soft shaded band behind it, is a narrower version of the line above it: the same construction, re-analysed or re-tuned, filling the same step. It is why two lines can draw the identical interior and still be two entries. Lines outside the band are alternatives to their neighbours, not versions of them.
The map does not hide the gaps. An empty step is drawn as an empty step.
What is not here yet
The map covers the algorithm literature. The repository covers circuits and primitives. They overlap less than you would expect, and where a method has no record we say so on its page rather than leaving the space blank.
Where something named here does have a record, its name links straight to it.
Method
Coherent amplitude-estimation readout
Encode the expectation value into an amplitude and estimate that amplitude coherently — phase estimation on the Grover operator , or one of the QPE-free variants — instead of averaging independent shots.
Open the full recordFills the slot: Estimate an observable
Requires coherent, controlled access to the state-preparation unitary and its inverse, and a bound on the observable's eigenvalues or on its tail distribution. A state that has been prepared and measured cannot be reused, so this is a fault-tolerant-regime method while direct sampling is the near-term one. The sign matters: Brassard, Høyer, Mosca and Tapp define with a global minus, which fixes the eigenphase convention the amplitude is read off from.
A preparation routine with , or repeated copies of ; a description of ; a target additive error and a confidence . Coherent, controlled access to and is required by some methods here and by none of the sampling-based ones.
State you can prepare → Number with an error barphase-estimate the Grover iterate
The whole method rests on the Grover iterate leaving a two-dimensional space invariant. On it has eigenvectors and eigenvalues , where . assumption: that decomposition needs — both the flagged and unflagged branches of must be present, or the subspace collapses to one dimension. Since , the eigenphase carries : the algorithm Fourier-transforms an -dimensional ancilla, applies so branch picks up , inverse-transforms and measures . approximation: a register of size resolves only to a multiple of , so the reported is a discretised reading of the amplitude rather than the amplitude.
approximationassumption
A scalar estimate with a stated additive-error guarantee, plus the shot or query budget and the maximum circuit depth actually consumed.
- Prepare an input state runs M iterations, M = O(1/ε), each running the preparation forwards and backwards once
Map to a state whose amplitudes are proportional to a specified vector , to within . The cost is set by which description of you hold, not by the algorithm that consumes it.
The loop stays coherent: nothing is measured between turns. The preparation may still be reapplied every turn — what the loop never pays is a readout and a restart from classical data. The price is depth, and a success probability that multiplies down the chain. The same slot as the row above, repeated the same way, and it is the closure that separates them: Brassard, Høyer, Mosca and Tapp's Theorem 12 uses exactly M iterations of the Grover operator, and one iteration runs A once forwards and once backwards. Nothing is measured until the end, so the ε^-2 of independent sampling becomes ε^-1. The bill does not vanish, it moves: those M applications are sequential, so the count is also a depth, and a device with a capped coherent depth cannot spend it — which is exactly what the contested note below is about.
Amplitude estimation invokes the state-preparation unitary exactly once on its own, to build the algorithm's input state, initializing two registers to . After that, is reached only through the Grover iterate , applied as for , so and its inverse each execute once per application of the iterate, never in isolation and never with a measurement in between. assumption: is well-defined only because is assumed to use no measurements and therefore possesses an inverse — the ingredient must hand back a coherent, uncomputing circuit, not a re-run-and-discard black box. What comes back is not a sampled bit but an estimate of , the probability that measuring would have produced a good element.
assumption
given coherent, controlled access to the state-preparation unitary A and to
its inverse, and a bound on the observable's eigenvalues or on its
tail distribution
encode the expectation value into an amplitude
form the Grover operator Q = - A S_0 A^-1 S_chi
# the global minus is Brassard, Hoyer, Mosca and Tapp's definition, and
# it is what fixes the eigenphase convention the amplitude is read off
# from
run M = O(1/e) iterations, coherently -- phase estimation on Q, or one of
the QPE-free variants
# each iteration runs the preparation forwards and backwards once
return the amplitude, hence the expectation value
# a state that has been prepared and measured cannot be reused, so this is
# the fault-tolerant-regime readout and direct sampling is the near-term oneBrassard, Høyer, Mosca and Tapp's Theorem 12 outputs with at probability at least , using exactly iterations, where one iteration runs once forwards and once backwards and evaluates once. Knill, Ortiz and Somma give explicit algorithms that approach precision with uses, given a bound on the eigenvalues of the operators or on their tail distribution.
None found yet.
Reaching additive error takes of order sequential applications of , and that is a depth as much as a count, so a device with a capped coherent depth cannot spend it. Giurgica-Tiron, Kerenidis, Labib, Prakash and Zeng give two algorithms — Power law AE and QoPrime AE — carrying a parameter with oracle calls and sequential calls, so throughout and recovers classical sampling. A quoted "quadratic speedup" that does not state the depth it assumes has not stated its cost.
The qiskit-algorithms amplitude estimators
- Quantum Amplitude Amplification and Estimation
Gilles Brassard, Peter Hoyer, Michele Mosca, Alain Tapp · 2000
About
`qiskit_algorithms.amplitude_estimators`, the amplitude-estimation module of `qiskit-algorithms` — a Python package in the `qiskit-community` GitHub organisation, installed with `pip install qiskit-algorithms` and distributed on PyPI separately from Qiskit itself. It ships four estimators behind one `AmplitudeEstimator` base class, and they divide one against three. `AmplitudeEstimation` is the phase-estimation route: `ae.py`'s module docstring is "The Quantum Phase Estimation-based Amplitude Estimation algorithm", and the class docstring says it "implements the original Quantum Amplitude Estimation (QAE) algorithm, introduced by [1]. This canonical version uses quantum phase estimation along with a set of additional evaluation qubits", where [1] is Brassard, Høyer, Mosca and Tapp. The other three replace that evaluation register with repeated applications of the Grover operator, and each draws its own contrast with that same paper — but not all three draw it on phase estimation. `IterativeAmplitudeEstimation` does: it "differs from the original QAE algorithm proposed by Brassard [2] in that it does not rely on Quantum Phase Estimation, but is only based on Grover's algorithm". `MaximumLikelihoodAmplitudeEstimation` does too, calling itself "the quantum amplitude estimation (QAE) algorithm without phase estimation" and adding that "In comparison to the original QAE algorithm [2], this implementation relies solely on different powers of the Grover operator and does not require additional evaluation qubits". `FasterAmplitudeEstimation` does not: what `fae.py` says it does without, relative to that same paper, is qubits — "Due to the iterative version of the QPE, this algorithm does not require any additional qubits, as the originally proposed QAE [3] and thus the resulting circuits are less complex" — and "the iterative version of the QPE" is `fae.py`'s own name for its own mechanism. The README carries a warning that belongs beside any recommendation of the package: "**Qiskit Algorithms is no longer officially supported by IBM**. Like any other Apache 2 licensed code, you are free to use it or/and extend it, but please be aware that it is under your own risk."
Methods
Where comes from is the part to check against this record's `conditions`. If the caller supplies no Grover operator, `EstimationProblem.grover_operator` builds one: it assembles a phase oracle over the `objective_qubits` — an `H` on the last of them, a multi-controlled `X` with the others as controls and that one as target, and an `H` again, collapsing to `H`, `X`, `H` when there is a single objective qubit — and passes it with the state preparation to Qiskit's own `grover_operator` function, or to the `GroverOperator` class below Qiskit 2.1.0. That function's docstring writes the operator with no global sign, , using where this record writes , where it writes , and — the substitution it is easy to stop one symbol short of — a zero reflection of the opposite sign. Qiskit's is "usually defined as" , while Brassard, Høyer, Mosca and Tapp's "changes the sign of the amplitude if and only if the state is the zero state ", which is its negative. With that third substitution written down, the two formulas name the same unitary, and the circuit that is built satisfies both. The code carries the sign the same way the notation does: the default zero reflection is `X` gates around a multi-controlled `Z`, chosen because it "can simply be implemented with a multi-controlled Z sandwiched by X gates on the target qubit and the introduced global phase does not matter for Grover's algorithm", and what that builds is , the negative of Qiskit's ; the last statement before the return, `circuit.global_phase = numpy.pi` under the one-line comment `# minus sign`, cancels that negative rather than introducing one, putting the built circuit onto the docstring's own formula. The `GroverOperator` class does the same at its own end. So a reader holding this record beside Qiskit's source has one operator written down twice, not a discrepancy to resolve, and the eigenphase convention `conditions` cares about survives the change of notation. `AmplitudeEstimation` then constructs the estimation circuit by composing the state preparation onto the qubits above the evaluation qubits and composing `qiskit.circuit.library.PhaseEstimation(m, grover_operator)` over the whole register — the source's own comment on that line is that the library circuit "does not include the A operator" — and, when called with `measurement=True`, measuring the evaluation qubits into an -bit classical register. `num_eval_qubits` is that , and the class stores `M = 2**num_eval_qubits`, so its `M` is a grid size rather than a qubit count: each measured integer becomes `np.round(np.power(np.sin(y * np.pi / 2**self._m), 2), decimals=7)`, the docstring's grid , which is this record's written with . The class also ships a way past that grid — "Using a maximum likelihood post processing, this grid constraint can be circumvented. This improved estimator is implemented as well" — and `estimate` runs both on every call, returning the most probable on-grid sample as `estimation` and the off-grid likelihood maximiser as `mle`, together with a confidence interval, whose `compute_confidence_interval` defaults to `alpha=0.05` and `kind="likelihood_ratio"` and also accepts `"fisher"` and `"observed_fisher"`, and a query count recorded as `result.num_oracle_queries = result.shots * (self._M - 1)`. One restriction is stated in the class docstring rather than left to the caller: "This class does not support the `.EstimationProblem.is_good_state` property, as for phase estimation-based QAE, the oracle that identifies the good states must be encoded in the Grover operator". `estimate` warns when one is set, and the warning states the fallback together with the condition it holds under: "For this algorithm, a custom oracle has to be encoded directly in the grover_operator. If no custom oracle is set, this algorithm identifies good states as those, where all objective qubits are in state 1." A caller who did supply a Grover operator — the case the paragraph above starts from — keeps whatever good states that oracle marks. The three siblings replace the evaluation register with repetition, and each says so where a caller meets it. `IterativeAmplitudeEstimation(epsilon_target, alpha, confint_method="beta", min_ratio=2)` "does not rely on Quantum Phase Estimation, but is only based on Grover's algorithm"; its class docstring states the guarantee with the confidence level written as , its constructor docstring restates it as an estimate "that with at least probability 1 - alpha has an error of epsilon" and prices it as "The number of A operator calls scales linearly in 1/epsilon (up to a logarithmic factor)", and each round's interval comes from the Clopper-Pearson (`"beta"`, the default) or the Chernoff (`"chernoff"`) construction. `MaximumLikelihoodAmplitudeEstimation(evaluation_schedule)` "relies solely on different powers of the Grover operator and does not require additional evaluation qubits", and the schedule is those powers: a list of them, or an integer for which the exponential schedule `[id, Q^2^0, ..., Q^2^(evaluation_schedule-1)]` is used. `FasterAmplitudeEstimation(delta, maxiter, rescale=True)` documents `maxiter` as "The number of iterations, the maximal power of Q is `2 ** (maxiter - 1)`".
Data
The repository's own test file, `test/test_amplitude_estimators.py`, and only that: this module has no tutorial notebook of its own, the eleven in `docs/tutorials` running from `01_algorithms_introduction` to `13_trotterQRTE` with no amplitude-estimation entry among them. Two state preparations are defined in that test file and shared by all four estimators. `BernoulliStateIn(probability)` is a one-qubit circuit applying `RY(2 arcsin(sqrt(p)))` to prepare , used at , , , and , and paired in several tests with a hand-written `BernoulliGrover(probability)` that declares `global_phase=np.pi` in its own constructor and overrides `power` so that a power of the operator costs one rotation. `SineIntegral(num_qubits)` is documented as a circuit that will "Construct the A operator to approximate the integral with a specified number of qubits" — Hadamards on an -qubit state register, then one `RY` and controlled `RY`s onto a single objective qubit — and is used at , and . The shot count is set on the sampler and takes the values 1, 100, 10,000, 100,000 and 1,000,000 across the tests, at seed 42 in the Bernoulli and sine-integral test classes and seed 2 in the Faster-AE one.
Code
`qiskit_algorithms/amplitude_estimators/` in https://github.com/qiskit-community/qiskit-algorithms — Python, Apache License 2.0, with headers reading "(C) Copyright IBM 2018, 2026" on `ae.py` and "(C) Copyright IBM 2020, 2023" on the package `__init__.py`. Eight files: `ae.py` for the canonical QPE-based estimator, `iae.py`, `mlae.py` and `fae.py` for the three siblings that carry no evaluation register, `estimation_problem.py` for the `EstimationProblem` input object and the default Grover-operator construction, `amplitude_estimator.py` for the base class and result object, `ae_utils.py` for the likelihood machinery `compute_mle` calls, and `__init__.py`, whose docstring is "The Amplitude Estimators package." and whose `__all__` names the four estimators, their result objects, the base class and `EstimationProblem`. Every estimator takes a Qiskit `BaseSamplerV2` primitive and an optional `transpiler`; `AmplitudeEstimation.estimate` warns and falls back to `StatevectorSampler` when no sampler was given. On PyPI the distribution is `qiskit-algorithms` ("Qiskit Algorithms: A library of quantum computing algorithms"), Apache-2.0, requiring Python >= 3.9, with seven releases of which 0.4.0 was uploaded 2025-08-29. Everything above was read from `main`; this entry does not claim a release version.
Results
Everything in `test/test_amplitude_estimators.py` runs on `qiskit.primitives.StatevectorSampler`; that file imports no other backend or simulator, so nothing recorded here is a hardware run. On the Bernoulli target the assertions pin the grid: `AmplitudeEstimation(2)` at with 100,000 shots is asserted to return `estimation` 0.5 and `mle` 0.2, and `AmplitudeEstimation(3)` at with 1,000,000 shots to return `estimation` 0.5 and `mle` 0.49 — the on-grid answer 0.5 in both cases, the maximum-likelihood post-processing recovering the input, both to `places=3`. On the sine integral, where is the argument to `SineIntegral(n)`, `AmplitudeEstimation(2)` at with 1,000,000 shots is asserted to return `estimation` 0.5 and `mle` 0.2702, while the three siblings are asserted to return 0.2725 for `MaximumLikelihoodAmplitudeEstimation(4)` at , 0.2721 for `IterativeAmplitudeEstimation(0.1, 0.1)` at , and 0.2721 for `FasterAmplitudeEstimation(0.01, 6)` at from a sampler given one shot, since "Number of shots for Sampler is not used in FasterAmplitudeEstimation". The confidence intervals are pinned as numbers too, at , 100 shots and : around `AmplitudeEstimation(3)`'s `mle` they are (0.2494734, 0.3003771) by likelihood ratio, (0.2486176, 0.2999286) by Fisher and (0.2484562, 0.3000900) by observed Fisher, and the test also asserts the estimate lies inside each — but the assertion guarding the endpoints is `np.testing.assert_array_almost_equal(..., decimal=1)`, so the seven digits are a note of what came out rather than what is checked. Three tests check the construction instead of the estimate: `test_qae_circuit`, `test_iqae_circuits` and `test_mlae_circuits` build the circuits by hand and assert `Operator` equality against what the classes produce. The canonical circuit is checked at and evaluation qubits, and the other two at and — but that is not the same quantity in both. In `test_iqae_circuits` it goes to `construct_circuit(problem, k, ...)`, whose own argument documentation reads "k: The power of the Q operator". In `test_mlae_circuits` it goes to the constructor as `evaluation_schedule`, which `mlae.py` expands to `[0] + [2**j for j in range(evaluation_schedule)]`, so there is a schedule of six circuits at powers 0, 1, 2, 4, 8 and 16, and the largest power of built is 16 rather than 5. The test's own manual build says the same, looping `for power in range(k)` over `circuit.ry(2 * 2**power * angle, ...)`.
- Quantum Amplitude Amplification and Estimation
Quantum amplitude estimation · Qiskit
From the repository — run, not written up from a paper · native
About
A finance- and Monte-Carlo-facing primitive that makes the oracle and error model visible.
Methods
None found yet.
Data
None found yet.
Code
Qiskit
Results
Bernoulli toy estimator checked · oracle assumptions explicit
- Quantum amplitude estimation
A finance- and Monte-Carlo-facing primitive that makes the oracle and error model visible.
References
- Quantum Amplitude Amplification and Estimation
Gilles Brassard, Peter Hoyer, Michele Mosca, Alain Tapp · 2000
- Optimal Quantum Measurements of Expectation Values of Observables
Emanuel Knill, Gerardo Ortiz, Rolando D. Somma · 2006
- Low depth algorithms for quantum amplitude estimation
Tudor Giurgica-Tiron, Iordanis Kerenidis, Farrokh Labib, Anupam Prakash, William Zeng · 2020
Where the routes meet
Every circle is drawn once. This step has no smaller object recorded inside it, so the strands between its two circles are the recorded ways of taking it — one strand per method.
4 recorded ways of doing Estimate an observable. Nothing smaller is recorded inside it, so there is no object in the middle to draw.
Everything on this figure that opens is open.
Of the routes that have been taken apart, 15 are built entirely from named slots, 15 hand off part of the work and finish the rest themselves, and 20 are one undivided act. None of the three is a defect; they are different things to reuse.
Every line on this figure, in words
The lines on this figure
- Every line on this figure is one a recorded source takes.
Open the cardRead the full write-up
Where you are
Path
- Solve a nonlinear ODE dy/dt = F(y)
- Estimate an observable
Ways through: 4
Routes that skip it
No recorded route avoids this step.
Narrower kinds
Every step you can open
1 of these have an object recorded in the middle; the rest open into the methods that fill them.
- Solve a nonlinear ODE dy/dt = F(y)
- Replace a spatial domain with a finite grid
- Discretize a PDE into one linear system
- Embed a nonlinear system into a linear one
- Solve a linear ODE du/dt = A(t)u + b(t)
- Recast a non-Hermitian generator as Hamiltonian evolution
- Choose a time discretization or propagator approximation
- Quantum linear solve
- Matrix function
- QSP phase factors
- Polynomial approximation
- Block-encode a matrix
- Prepare an input state
- Amplify a success branch
- Simulate Hamiltonian evolution
- Estimate an observable
- Compile a circuit to a specific device
- Satisfy the hardware connectivity constraint
- Approximate a continuous rotation in a discrete gate set
- Recover a noiseless expectation value by post-processing
- Build logical qubits at a target logical error rate
- Estimate a Hamiltonian's ground-state energy
- Choose a parameterised trial state
- Minimise the objective over the parameters
- Estimate an excited-state energy
- Measure what the machine can actually do
- Recover the period of a periodic function
- Estimate the eigenphase of a unitary
- Find the item a check accepts
- Walk a graph to the vertex you want
- Search a cost Hamiltonian for the assignment it minimises
What is on this map, counted
What is here, counted
147 nodes — 31 slots and 116 methods.
76 of the 147 link to a record in the Atlas, between them naming 89 records. The rest name papers and nothing else: this graph describes work the catalogue has not got yet, and the nodes with no record are the list of what a corpus pass has to go and read.
0 slots have no method recorded, and 32 methods have not been taken apart. Both are shown as what they are rather than left blank.
Every claim here rests on a source. This graph cites 140 papers; they and the 172 the Atlas cites alone are registered in one place, with what each reports and everywhere it is cited from. Papers