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
Walk the backtracking tree itself
Take the tree a classical backtracking algorithm would have explored — never built, never known in advance — and walk it from the root. Phase estimation on the walk operator says whether a solution is down there at all; running that test on subtree after subtree turns the answer into the solution.
Open the full recordFills the slot: Walk a graph to the vertex you want
What the algorithm needs is what a backtracking algorithm already has: a predicate over partial assignments and a heuristic "which returns the next index to branch on from a given partial assignment". It does not need the tree: "we do not necessarily know the structure of in advance", only the distance of a vertex from the root. That is the break with the earlier walk-search literature and the paper states it as one — "in prior work it is usually assumed that the input graph is known in advance, and moreover that the initial state of the quantum walk is the stationary distribution of the corresponding random walk". An upper bound on the number of vertices is used but need not be known: guesses are doubled from , and a returned vertex is checked before the algorithm terminates, because "if our guess for is too low, the correctness proof of Algorithm 2 no longer holds". Local domain size is assumed throughout, and for the finding half so is bounded degree.
A rule naming the neighbours of any vertex, a rule saying whether a vertex is marked, somewhere to start — one named vertex, or a distribution over them — and the size bounds the schedule is computed from: the number of vertices, the depth, the maximum degree, or the size of the subsets a vertex stands for. Which of those a method needs is a property of the walk, not of the slot.
Search graph with a marked set → A marked item, with its query billreflect at even depths, then at odd
The walk lives on the space spanned by the vertices themselves — "unlike many discrete-time quantum walk algorithms, it does not use a separate 'coin' space" — and starts at . Vertices are split by parity of depth: is the set at even distance from the root, including the root, and the set at odd distance. At each vertex sits a diffusion operator acting on the span of and its children. If is marked, is the identity — the walk stops there, which is what the eigenvalue-one eigenvector detects. Otherwise with , being the degree of in the undirected graph. The root is the exception and carries an extra weight: . One step is , where and . assumption: the root is taken to be unmarked — "assume for simplicity in what follows that the root is promised not to be marked" — which is a convenience of the proof rather than a requirement of the method: a marked root is returned before the descent begins. assumption: every "can be implemented with only local knowledge, i.e. based only on whether is marked and the neighbourhood structure of " — this is the property that lets the walk run on a tree nobody has laid out, and it is what the predicate and the branching heuristic supply. The paper offers a second reading of the same operator: "a quantum walk on the graph given by the edges of the tree, where we identify each vertex with the edge from its parent in the tree, and add an additional 'input' edge into the root" — though it never connects that added edge to the root's extra weight, which appears here as a definition and later only inside the proof, in and . Detection alone is Belovs's result specialised to a tree; finding is Montanaro's own extension of it, and the two theorems differ by exactly the two factors it costs: because "there are at most repetitions to reach a leaf and subtrees are checked at each repetition", and a further because the descent makes uses of the detector in all, so each must be run at failure probability — "an additional time factor of per use". times is , which is Theorem 2.
assumption
A marked vertex, with the evidence it is marked already in hand from the work stored on it — or the report that the graph holds none, at a stated failure probability.
- Estimate the eigenphase of a unitary
Given a circuit whose controlled powers you can apply, and a routine preparing a state with non-negligible overlap on one of its eigenvectors, return that eigenvector's phase as a number with an error bar. The phase is read out of an ancilla, never out of the system register — the system is only ever the thing the controlled powers act on.
The detector asks phase estimation one question — is the eigenvalue exactly — and everything it costs is in the precision that question is asked at. Algorithm 2 applies "phase estimation to the operator with precision " and accepts when the eigenvalue is , repeating times and answering "marked vertex exists" when at least of the runs accept. So the state prepared for it is the root rather than an eigenvector, and what the estimate reads is how close is to an eigenvector of eigenvalue one: when a marked vertex exists, "is quite close to (a normalised version of) an eigenvector of with eigenvalue 1" and phase estimation "returns the eigenvalue 1 with probability at least 1/2"; when none exists the same estimate "returns the eigenvalue 1 with probability at most 1/4". The threshold sits between those two numbers, which is what makes counting acceptances an answer. assumption: the precision is what fixes the query count, since phase estimation to precision costs controlled applications of the operator — which is where comes from and why a tighter bound on is worth having. The whole subroutine is used times, and the paper attributes the result it is a special case of to Belovs. assumption: must be a real upper bound on the vertex count, or "the correctness proof of Algorithm 2 no longer holds" and the detector can report a marked vertex where there is none — which is why the caller checks the vertex it is finally handed.
assumption
given a predicate P over partial assignments, returning true, false or
indeterminate (Alg. 1)
a heuristic h returning the next index to branch on (Alg. 1)
n, the depth bound; a guess T for the number of vertices
# the tree is never built and its structure is not known in advance. All that
# is needed of a vertex is its neighbours and its distance from the root
detect(subtree, T, delta): (Alg. 2)
repeat K = ceil(gamma log(1/delta)) times:
run phase estimation on R_B R_A with precision beta/sqrt(T n)
accept if the eigenvalue is 1
return 'marked vertex exists' if at least 3K/8 accepted, else 'none'
for T = 1, 2, 4, 8, ... doubling until an answer survives its check:
if detect(whole tree, T, delta) says none: return 'not found'
# returning here on the FIRST negative, at T = 1, is deliberate and is the one
# place the two directions are not symmetric. A marked vertex is detected with
# probability at least 1/2 whether or not the guess for T is large enough, so a
# negative answer is trustworthy at any T; only a positive one is not
x = root
while x is not marked:
y = the first child of x whose subtree detect() says holds one
if there is no such child: break
x = y
if x is marked: return x
# the break is not defensive tidiness. A detection above can be a false
# positive when T is guessed too low, and then no child confirms anything;
# leaving the descent is what lets the doubling loop resume
# T is left unchanged when the detector is applied to a subtree. The tree can
# be very unbalanced, so a subtree may still hold most of the vertices
# the doubling is why no bound on T has to be known in advance. A guess that is
# too low can make the detector claim a solution where there is none, which is
# exactly what checking the returned vertex catches
# there are O(n) steps down to a leaf and O(1) subtrees tested at each. That
# is one of the two factors between detecting and finding; the other is a
# log n, because O(n^2) detector calls in all must each run at failure
# probability O(1/n^2)
# do not use this listing for the unique-solution case. That bound comes from
# an eigenvector argument on the walk, not from this binary searchDetection and finding are priced separately and the gap between them is the cost of turning one into the other. Theorem 1 evaluates and times each to say whether a solution exists; Theorem 2 evaluates them times each to "output such that is true, or 'not found' if no such exists". A promise that the solution is unique buys most of that back — — through an eigenvector argument rather than through the binary search. Finding all solutions costs . The speedup claim is scoped, in the paper's own sentence: "we usually think of as being exponential in ; in this regime this complexity is a near-quadratic speedup over the classical algorithm." The bound is instance-dependent, and the paper draws the consequence: "for instances on which the classical algorithm runs quickly, the quantum algorithm also runs quickly." Space is with auxiliary operations per use of and .
None found yet.
None found yet.
Qrisp's QuantumBacktrackingTree, applied to Sudoku
- Quantum Backtracking in Qrisp Applied to Sudoku Problems
Raphael Seidel, René Zander, Matic Petrič, Niklas Steinmann, David Q. Liu, Nikolay Tcholtchev, Manfred Hauswirth · 2024
About
Montanaro's paper leaves the circuit-level construction unspecified, and this paper says so directly: "the author refrains from providing any specific details regarding its implementation" and "there is little to no literature on how such an implementation ... could look like." The authors, based at Fraunhofer FOKUS and building the open-source Qrisp framework, close that gap by deriving a gate-level diffuser for an arbitrary backtracking instance and then applying it to solving 4x4 Sudoku puzzles, reduced to a graph-colouring constraint satisfaction problem.
Methods
The step operator follows the paper's two-part construction of (paper Eq. 4-8; the code's module docstring derives the same construction independently, in its own notation). An accepted node's diffuser is rewritten as for a state-preparation unitary , so that in a computational-basis node encoding the middle term becomes a controlled Z-gate on , flanked by and its inverse -- the paper's . A rejected node must instead act as so the walk never descends past it, which needs a second controlled Z-gate, this one on the parent's reject flag lifted onto the child subspace -- the paper's , giving overall. A node is encoded as a one-hot height register (distance from a leaf, the opposite end from the paper's distance-from-root convention) together with the reversed root-to-node path; the caller supplies a maximum depth, a branch-variable type, and accept/reject predicates returning quantum booleans, in place of the paper's predicate . The two diffusers are composed as , and quantum phase estimation on that operator reports the same two thresholds as the paper's detector: above 3/8 acceptance the tree is reported to hold a solution, below 1/4 it is reported empty, and in between the precision is insufficient. Finding a solution differs from the paper's descent in one respect: rather than testing each child subtree for a marked vertex in turn, the code measures the whole tree once, sorts every branch whose phase-estimation outcome is consistent with eigenvalue 1 by height, and recurses into each candidate in that order -- the code's own comment calls this a heuristic that "proved to be the case in every situation we tested," not a proven substitute for the paper's descent. The paper's user-supplied branching heuristic is not implemented: branch order is fixed by the node encoding.
Data
The benchmark inputs are 4x4 Sudoku boards, reduced to a constraint graph by connecting each empty cell to the other cells in its row, column and 2x2 subgrid, and separating the resulting comparisons into quantum-quantum and classical-quantum cases; the benchmarked instances leave up to 9 of the 16 cells empty.
Code
`qrisp.quantum_backtracking.QuantumBacktrackingTree`, in `src/qrisp/algorithms/quantum_backtracking/backtracking_tree.py` of github.com/eclipse-qrisp/Qrisp (Eclipse Public License 2.0) -- the repository the paper names as "the source code." Attributes `h` and `branch_qa`; methods `qstep_diffuser`, `quantum_step` and `estimate_phase` on the class, plus the module-level `find_solution` function. The Sudoku accept/reject oracles and the graph-reduction helpers, including `sudoku_to_graph` and `extract_comparisons`, ship in the same repository's `tests/algorithms_tests/test_sudoku.py` and `documentation/source/general/tutorial/Sudoku.ipynb` -- that notebook is the paper's own cited source, not a separate repository. A later repository under the GitHub handle renezander90 (matching co-author René Zander), created in November 2025 -- more than a year after this paper's final arXiv revision -- reproduces the same oracle functions under the title "Examples and Benchmarking for Sudoku paper"; it postdates the paper's own reported experiments and is not their source.
Results
"For a single controlled diffuser of a binary backtracking tree with depth , our implementation requires only CX gates" (abstract). Experiments ran on the cloud-based IBM `simulator_mps` matrix-product-state simulator, using 10000 shots per phase-estimation circuit at precision ; the paper reports detecting and finding solutions for 4x4 Sudoku instances with up to 9 empty cells, with the 9-empty-cell circuit needing 91 qubits and reaching circuit depth 3968 (Section 5, Figure 1) -- stated by the authors to be, to their knowledge, the first compilable implementation of Montanaro's algorithm at this generality.
- Quantum Backtracking in Qrisp Applied to Sudoku Problems
Quantum walk speedup of backtracking · Qiskit
From the repository — run, not written up from a paper · unsupported
About
Backtracking is the general classical technique for exploiting problem structure in constraint satisfaction: explore a tree of partial assignments and prune the branches a predicate rules out. The question is whether an arbitrary backtracking algorithm — any predicate and any branching heuristic — can be sped up quantumly, rather than replaced by brute-force search over the whole assignment space.
Methods
None found yet.
Data
None found yet.
Code
Qiskit
Results
Literature record · problem statement and speedup class checked against the Quantum Algorithm Zoo entry · primary reference checked against its arXiv abs page
- Quantum walk speedup of backtracking
Backtracking is the general classical technique for exploiting problem structure in constraint satisfaction: explore a tree of partial assignments and prune the branches a predicate rules out. The question is whether an arbitrary backtracking algorithm — any predicate and any branching heuristic — can be sped up quantumly, rather than replaced by brute-force search over the whole assignment space.
References
- Quantum walk speedup of backtracking algorithms
Ashley Montanaro · 2015
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