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
Fixed-iteration amplitude rotation
Start from equal amplitude on every candidate, and alternate two operations — flip the sign of the accepted candidate, then reflect every amplitude about their average. Each round moves a fixed amount of amplitude onto the accepted candidate, so the number of rounds is computed from the domain size before the first query rather than discovered while running.
Open the full recordFills the slot: Find the item a check accepts
Grover's paper assumes there is exactly one accepted candidate, and not merely a known number of them — "let there be a unique state, say , that satisfies the condition , whereas for all other states , " — and that the condition is evaluable in unit time. Several accepted candidates is named as an extension and is not carried out here: the paper says the algorithm "can be easily modified" for that case and then cites two other papers for both routes, a degeneracy sweep from Boyer, Brassard, Høyer and Tapp and a random perturbation from Mulmuley, Vazirani and Vazirani. The domain is a register of bits, , and no order on it is assumed — "there does not exist any sorting on the database that would aid its selection". Nothing in this paper says what happens when the iteration count is set wrong; it says only that "the precise number of repetitions is important" and points at Boyer, Brassard, Høyer and Tapp for it.
A check evaluable in superposition on any candidate, the size of the domain it ranges over, and the promise that fixes the schedule — Grover assumes exactly one accepted candidate; a method may instead require the check to answer about partial commitments rather than whole candidates.
Marking oracle over a domain → A marked item, with its query billflip the accepted sign, invert about the average
One round is two unitaries on the -amplitude vector. The first is the oracle as a phase: "in case , rotate the phase by radians; in case , leave the system unaltered". The second is the diffusion transform, given as a matrix, for and , which the paper factors two ways. Algebraically with for all ; since and sends any vector to the vector of its own average, and is unitary, and its action is that "the amplitude in each state increases (decreases) so that after this operation it is as much below (above) as it was above (below) before", being the average amplitude. As a circuit , where for , for and otherwise, and with the bitwise dot product of the two -bit strings. The progress bound is Theorem 3: with amplitude on the accepted state, on each of the other , and , one round gives and leaves . assumption: the phase rotation must leave no trace of the state it sensed — "so as to ensure that paths leading to the same final state were indistinguishable and could interfere" — and "does not involve a classical measurement"; a step that recorded which state was flipped would destroy the interference the increment depends on. Iterating the increment gives the loop length: "there exists a number less than , such that in repetitions of the loop in step (ii), will exceed ", and is where the sampling probability would be exactly , so exceeding it puts the measurement above a half. assumption: exactly one state satisfies ; the bound above is stated for "the one state that satisfies " against others and says nothing about a domain with two.
assumption
One accepted candidate, with the number of queries spent and the probability the answer is right — or the report, at a stated confidence, that the domain holds none.
None found yet.
given a domain of N = 2^n states S_1 ... S_N, addressed as n-bit strings
a condition C evaluable on any state S in unit time (Sec. 2)
the promise that exactly one state S_nu has C(S_nu) = 1 (Sec. 2)
# no sorting on the domain is assumed -- there is nothing to look the answer
# up in, which is the whole reason the count of queries is the cost
initialize to equal amplitude 1/sqrt(N) in each of the N states (Sec. 3, step i)
# this distribution costs O(log N) steps, by Walsh-Hadamard on the n bits
repeat O(sqrt(N)) times: (Sec. 3, step ii)
if C(S) = 1: rotate the phase of S by pi radians; else leave S alone
apply the diffusion transform D, D_ij = 2/N for i != j,
D_ii = -1 + 2/N
# D is the inversion about the average: after it, each amplitude sits as
# far below the mean as it sat above, and as far above as it sat below
sample the resulting state (Sec. 3, step iii)
return the sampled state -- it is S_nu with probability at least 1/2
# the number of repetitions is fixed before the first query, from N alone.
# This paper proves only that SOME M < sqrt(2N) suffices; it says the precise
# count 'is important' and cites Boyer, Brassard, Hoyer and Tapp for it, so no
# exact count is written here
# nor is there anything here about running the loop too long: this paper does
# not discuss it
# the phase rotation must leave no trace of which state was sensed, or the
# paths that reach one final state stop being indistinguishable and stop
# interfering. It is not a classical measurement
# do not read this as covering several accepted candidates. The paper says the
# algorithm can be modified for that and then cites two other papers for both
# ways of doing it, rather than doing eitherThe paper states the loop as repetitions and derives a specific, non-tight bound on it in its own proofs: from the amplitude increment per round, "there exists a number less than , such that in repetitions of the loop in step (ii), will exceed ", and is exactly the threshold at which "the probability of the system being in the desired state ... is ". Because goes past that threshold rather than landing on it, what the paper proves is success "with a probability greater than " — and, of the sampling step itself, "a probability of at least ". Both phrasings are the paper's, in two places, and neither is a certainty. The initial equal superposition costs steps on top. Against it the paper puts a classical floor of examinations to succeed with probability , and a quantum floor of it attributes to Bennett, Bernstein, Brassard and Vazirani, concluding that the algorithm "is within a small constant factor of the fastest possible quantum mechanical algorithm" — sharpened, in a different paper it cites rather than in this one, to "within a few percent".
None found yet.
None found yet.
qiskit-algorithms' `Grover` class, called with a fixed `iterations` integer
- A fast quantum mechanical algorithm for database search
Lov K. Grover · 1996
- Tight bounds on quantum searching
Michel Boyer, Gilles Brassard, Peter Hoeyer, Alain Tapp · 1996
About
`qiskit_algorithms.amplitude_amplifiers.grover.Grover`, in the `qiskit-community/qiskit-algorithms` Python package — installed separately from Qiskit itself via `pip install qiskit-algorithms`, and currently at 0.4.0 on PyPI. The class docstring's own References list this same 1996 paper as [1] — "L. K. Grover (1996), A fast quantum mechanical algorithm for database search" — and the constructor's own References section closes with a second citation, "Boyer et al., Tight bounds on quantum searching", later in that same `__init__` docstring — after several more Args entries and a Raises block beyond the `iterations` paragraph that recommends `Grover.optimal_num_iterations` for the exact power. The `iterations` constructor argument forks exactly along the line this method's own conditions draw: passed a plain `int`, only that one power of the Grover operator is tried; passed `None`, a `list`, an iterator, or a `growth_rate`, the class instead tries a sequence of powers and checks an `is_good_state` callback after each circuit — the several-accepted-candidates and unknown-count extension this method hands to a different citation. Only the fixed single-`int` branch belongs to this method; the adaptive branches are not documented here.
Methods
With `iterations` a plain `int`, the constructor stores it as a one-element list — `elif isinstance(iterations, int): self._iterations = [iterations]` — so inside `amplify`, `max_iterations = len(self._iterations)` is 1 and the run loop executes exactly once regardless of whether the problem supplies an `is_good_state` check: exactly one power of the Grover operator is tried, full stop, which is the fixed-count behaviour this method's own `conditions` field describes. The single circuit is built by `construct_circuit`, composing `problem.state_preparation` — by default in `AmplificationProblem`, "a layer of Hadamard gates" on every qubit, the paper's own equal-amplitude start — with `problem.grover_operator.power(power)`. The oracle enters through `AmplificationProblem.oracle` as the phase flip , described as flipping "the phase of the state if is a hit"; if the problem is not given a `grover_operator` directly, one is built from that oracle and the state preparation by Qiskit's own `grover_operator` function, or the `GroverOperator` class "if you're using a version of Qiskit older than 2.1.0", per the class docstring's own words. When the number of accepted candidates is known, the exact power to fix comes from the static method `Grover.optimal_num_iterations(num_solutions, num_qubits)`: `amplitude = sqrt(num_solutions / 2**num_qubits)`, then `round(arccos(amplitude) / (2 * arcsin(amplitude)))`. Applied to one accepted candidate among states — `optimal_num_iterations(1, 3)` — that formula returns 2.
Data
No dataset. The input is the caller's own oracle circuit, passed as `AmplificationProblem.oracle`, together with — when the count is fixed rather than searched for — the number of accepted candidates and the qubit count passed to `optimal_num_iterations`.
Code
`qiskit_algorithms/amplitude_amplifiers/grover.py` and `qiskit_algorithms/amplitude_amplifiers/amplification_problem.py` in https://github.com/qiskit-community/qiskit-algorithms, read at `main`, commit `23187def78`, dated 2026-05-21. Apache-2.0 licensed. The class is `Grover(AmplitudeAmplifier)`; its input is an `AmplificationProblem`, whose constructor takes `oracle`, `state_preparation`, `grover_operator`, `post_processing`, `objective_qubits` and `is_good_state`.
Results
`GroverResult` reports `iterations` (the powers tried), `top_measurement`, `oracle_evaluation` and `max_probability` from whatever sampler and oracle the caller supplies, so the repository carries no benchmark numbers of its own to quote here — what is checkable is the arithmetic above, that `optimal_num_iterations` turns the paper's "some " into one concrete integer per pair rather than a bound the caller still has to search over.
- A fast quantum mechanical algorithm for database search
PennyLane's `GroverOperator` diffusion template, driven for a fixed `num_iterations`
About
`pennylane.templates.subroutines.grover.GroverOperator`, in Xanadu's PennyLane (PyPI `pennylane`, currently 0.45.1). The class builds only the diffusion half of a round: its own docstring's worked example constructs the phase-flip oracle separately, as a plain Python function, and composes the two by hand inside a fixed loop, so this artefact matches the diffusion half of this method's two-unitary round and leaves the accepted-candidate oracle to the caller. No paper is cited in the module.
Methods
`compute_decomposition` builds exactly the pattern the class docstring describes — "the operator is implemented with a layer of Hadamards, a layer of , followed by a multi-controlled gate, then another layer of and Hadamards" — as `Hadamard` on every wire but the last, `PauliZ` on the last wire, a `MultiControlledX` with every `control_values` entry 0 (open controls) targeting the last wire, `PauliZ` again, `Hadamard` on every wire but the last again, and a closing `GlobalPhase(numpy.pi)`. The class docstring attributes the pair of `PauliZ` gates on the last wire to the circuit identity "", by which "the last gate converts the multi-controlled gate into a multi-controlled gate" — the textbook picture the docstring draws is a multi-controlled , and what `compute_decomposition` actually emits is the open-controlled `MultiControlledX` flanked by those two `PauliZ` gates instead. `compute_matrix` gives the same operator in closed form, `2 / dim - np.eye(dim)` for `dim = 2**n_wires` — algebraically with the uniform superposition, since has every entry — the same matrix as Grover's own with for every , not merely an equivalent one. The class builds no oracle of its own: its worked example constructs one from a Hadamard-Toffoli-Hadamard sandwich on the target wire and drives a fixed number of rounds directly — "We can then implement the entire Grover Search Algorithm for `num_iterations` iterations by alternating calls to the oracle and the diffusion operator" — with `num_iterations` fixed by the caller before the circuit runs, the paper's own schedule.
Data
No dataset. The worked example's own input is a 3-wire circuit with the accepted candidate marked by a hand-written oracle, not read from any file.
Code
`pennylane/templates/subroutines/grover.py` in https://github.com/PennyLaneAI/pennylane, read at `main`, commit `a7b66fc43f`, dated 2026-08-14. Apache-2.0 licensed. The class is `GroverOperator(Operation)`, constructed as `GroverOperator(wires, work_wires=())`; `work_wires` only assists the `MultiControlledX` decomposition, and the constructor raises `ValueError("GroverOperator must have at least two wires provided.")` below two wires.
Results
The docstring's own worked example states the outputs of running it, each marked `# doctest: +SKIP` so they are the published claim rather than a value this record re-executed: `GroverSearch(num_iterations=1)` returns probabilities `[0.0312, 0.0312, 0.0312, 0.0312, 0.0312, 0.0312, 0.0312, 0.7812]`, and `GroverSearch(num_iterations=2)` returns `[0.0078, 0.0078, 0.0078, 0.0078, 0.0078, 0.0078, 0.0078, 0.9453]` — the accepted candidate carrying probability 0.7812 after one round and 0.9453 after two. The same docstring states the fixed schedule separately from the example — "Optimally, the oracle-operator pairing should be repeated times" — which for evaluates to 3, one round more than either value the worked example actually runs.
Cirq's `examples/grover.py`, a fixed one-round search over 2-bit oracles
About
`examples/grover.py` in Google Quantum AI's Cirq (PyPI `cirq`, currently 1.7.0), a runnable script rather than a library class. Its own module docstring states the domain it covers and why: "At the moment, only 2-bit sequences (for which one pass through Grover operator is enough) are considered" — the whole example sits inside the one case where a single fixed round already suffices, . The docstring's own "=== REFERENCE ===" line names one external paper, "Coles, Eidenbenz et al. Quantum Algorithm Implementations for Beginners" (arXiv:1804.03719) — a 34-author survey covering twenty different algorithms rather than a paper about Grover's method specifically, so it is not recorded here as this artefact's own citation.
Methods
`make_oracle` builds the phase-flip oracle as a marked-string Toffoli: `X` gates flip every input qubit whose target bit is 0, a `TOFFOLI` targets an ancilla `output_qubit` controlled on both input qubits, and the same `X` gates undo the flip, so the Toffoli fires exactly on the two-bit string `x_bits`. `make_grover_circuit` prepares `output_qubit` in (`X` then `H`) before that oracle runs, turning the Toffoli's bit flip into a relative phase flip on the accepted input string by phase kickback, and starts the two input qubits in an equal superposition with `H.on_each`. After the oracle, the diffusion half is written gate by gate rather than called as a library operator: `H.on_each`, `X.on_each`, `H` on the second input qubit, `CNOT` from the first input qubit to the second, `H` again on the second, `X.on_each`, `H.on_each` — the middle three gates are the two-qubit circuit identity for a controlled- ( on the target qubit), and conjugating that by the surrounding `X.on_each` layers moves its phase from onto , giving ; sandwiched by the two Hadamard layers this composes to rather than , the negative of the paper's own factorisation for — a global phase with no effect on any measurement the circuit produces, and one the file leaves uncorrected: unlike PennyLane's equivalent construction, `examples/grover.py` appends no compensating global-phase gate. The circuit runs through oracle-then-diffusion exactly once, because the module restricts itself to the case where needs no second round.
Data
No dataset. `main()` draws the two-bit accepted string `x_bits` at random with `random.randint` on each run and passes it into `make_oracle`.
Code
`examples/grover.py` in https://github.com/quantumlib/Cirq, read at `main`, commit `f14948c48b`, dated 2026-02-03. Apache-2.0 licensed. `set_io_qubits`, `make_oracle(input_qubits, output_qubit, x_bits)`, `make_grover_circuit(input_qubits, output_qubit, oracle)` and `main()` are module-level functions rather than a class; `main()` runs the built circuit on `cirq.Simulator()`.
Results
The module docstring carries its own recorded sample run rather than a reported benchmark: `Secret bit sequence: [1, 0]`, ten repetitions all landing on the same bitstring — `Sampled results: Counter({'10': 10})` — and `Found a match: True`. The same docstring's general claim, that the algorithm finds the accepted string "with the probability p >= 2/3", is stated for Grover's algorithm in general and is not a number this specific 2-qubit, 1-round circuit is shown meeting or falling short of anywhere in the file.
Grover unstructured search · Qiskit
From the repository — run, not written up from a paper · native
About
The canonical search primitive, paired with the linear classical baseline it is meant to improve.
Methods
None found yet.
Data
None found yet.
Code
Qiskit
Results
Toy oracle structure checked · asymptotic claim is literature-backed
- Grover unstructured search
The canonical search primitive, paired with the linear classical baseline it is meant to improve.
References
- A fast quantum mechanical algorithm for database search
Lov K. Grover · 1996
Where the routes meet
11 problems nothing else needs — the places a reader arrives. Open a line to see what is recorded inside it, or click its name to go there.
13 lines have something recorded inside that you have not opened.
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
Solve a nonlinear ODE dy/dt = F(y)
- Embed a nonlinear system into a linear one — opens into 6 · a way across — click it to open it here
- Solve a linear ODE du/dt = A(t)u + b(t) — opens into 9 · a way across — click it to open it here
- Choose a time discretization or propagator approximation → Quantum linear solve — open
- Choose a time discretization or propagator approximation — opens into 6 · a way across — click it to open it here
- Quantum linear solve — opens into 5 · a way across — click it to open it here
- Simulate Hamiltonian evolution → Estimate an observable — open
- Simulate Hamiltonian evolution — opens into 3 · a way across — click it to open it here
- Estimate an observable — opens into 4 · a way across — click it to open it here
Estimate an excited-state energy
- Variational quantum deflation — opens into 3 · a way across — click it to open it here
- Subspace-search variational eigensolver — opens into 3 · a way across — click it to open it here
- Quantum subspace expansion
- Quantum equation of motion
- Folded-spectrum variational eigensolver — opens into 3 · a way across — click it to open it here
- Penalty-constrained variational eigensolver — opens into 3 · a way across — click it to open it here
- Multistate contracted variational eigensolver — opens into 3 · a way across — click it to open it here
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