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
Sparse-access oracle construction
Given row and column index oracles , and an entry oracle , prepare uniform superpositions over the sparsity pattern, rotate an ancilla by arcsin of each entry, and swap registers to leave in the flagged block. This is the standard construction behind the sparse-Hamiltonian line, formalized as a block-encoding by Gilyén, Su, Low and Wiebe.
Open the full recordFills the slot: Block-encode a matrix
Needs to be -row-sparse and -column-sparse with after rescaling, and needs the sparsity-pattern oracles and to be efficiently implementable. That is an assumption about structure, and it is separate from the question of whether it holds for a given application.
An access model for — sparse-access oracles, a Pauli or LCU decomposition, a purification, or an explicit arithmetic description — plus a target precision .
Matrix you can query → Block-encodingsuperpose the indices, rotate by the entry
The encoding is a Gram-matrix sandwich . With preparing , the two halves are and , so that spreads a row index over its nonzero positions and does the same down a column. Their overlap is a pure indicator: if and otherwise. assumption: that identity says only that an entry is nonzero, so it rests entirely on and returning the true index of each row's and column's -th nonzero, padded out past the sparsity bound. The value itself arrives separately: queries on the surviving pair and rotates one qubit to , then calls again to uncompute the query register. approximation: that rotation is implemented "with precision " — an exact rotation through the arcsine of a queried value would take unboundedly many gates.
approximationassumption
A unitary on qubits, its subnormalization , and its ancilla/flag count . Because , Gilyén, Su, Low and Wiebe's Definition 43 forces .
None found yet.
given A, s_r-row-sparse and s_c-column-sparse, with |a_ij| <= 1 after rescaling,
the row and column index oracles O_r and O_c,
and the entry oracle O_A
# O_r and O_c must be efficiently implementable. That is an assumption about
# structure, separate from whether it holds for a given application
prepare uniform superpositions over the sparsity pattern
rotate an ancilla by arcsin of each entry
swap registers
# A is left in the flagged block: that is the block-encoding
# Gilyen, Su, Low and Wiebe Lemma 48 gives a (sqrt(s_r*s_c), w+3, epsilon)-
# block-encoding of A, from a single use of O_r, a single use of O_c, two uses
# of O_A, plus O(w + log^2.5(s_r*s_c/epsilon)) one- and two-qubit gates
# -- the record does not say which of the stages above each use falls in
# Lemma 48 assumes |a_ij| <= 1 and states alpha = sqrt(s_r*s_c) flat. The
# alpha = sqrt(s_r*s_c)*||A||_max form usually quoted is the standard
# rescaling, not what the lemma says, so it is not written here
# and that count is in queries, not gates. Zhang and Yuan open the oracle: for
# general matrices, even including sparse ones, they prove that sparse-access
# input models and block-encoding both require nearly linear circuit
# complexities relative to the matrix dimension. A routine that is logarithmic
# in queries to an oracle whose own circuit is linear in N is a linear-cost
# routineGilyén, Su, Low and Wiebe (arXiv:1806.01838) Lemma 48 gives a -block-encoding of , using a single use of , a single use of , two uses of , plus one- and two-qubit gates. Lemma 48 assumes and states flat; the form usually quoted is the standard rescaling, not what the lemma says.
None found yet.
The Lemma 48 count is in queries, not gates. Zhang and Yuan open the oracle: "For general matrices (even including sparse ones), we prove that sparse-access input models and block-encoding both require nearly linear circuit complexities relative to the matrix dimension." A routine that is logarithmic in queries to an oracle whose own circuit is linear in is a linear-cost routine.
Qualtran's `SparseMatrix` block-encoding bloq
- Expressing and Analyzing Quantum Algorithms with Qualtran
Matthew P. Harrigan, Tanuj Khattar, Charles Yuan, Anurudh Peduri, Noureldin Yosri, Fionn D. Malone, Ryan Babbush, Nicholas C. Rubin · 2024
About
Qualtran's paper defines a block encoding the same way this method's sibling entries quote it: "the (s + a)-qubit unitary B[A] is a (α, a, ϵ)-block encoding of A if" . Of the three primitive routes it lists — "unitaries, LCU SELECT/PREPARE oracles, and sparse access matrices" — this is the third: "Third, Qualtran's SparseMatrix bloq constructs a block encoding for a sparse matrix A with at most m non-zero entries in each row or column, given oracles" , "to compute the index or of the j-th nonzero entry in the i-th row or column respectively of A, and" "to compute the matrix entry " — the same three-oracle interface this method's own hop names. The paper's own citation for that oracle set is not Gilyén, Su, Low and Wiebe (cited elsewhere in the same paper for the singular value transformation) but Dalzell, Clader, Salton, Berta, Lin, Bader, Stamatopoulos, Schuetz, Brandão, Katzgraber and Zeng, "End-to-end resource analysis for quantum interior-point methods and portfolio optimization", PRX Quantum 4 (2023).
Methods
The bloq lives in a file whose own docstrings cite a third source again: `RowColumnOracle`, `EntryOracle` and `SparseMatrix` each list "References: [Lecture Notes on Quantum Algorithms for Scientific Computation](https://arxiv.org/abs/2201.08309). Lin Lin (2022). Ch. 6.5", not the Qualtran paper's own citation. `SparseMatrix.__attrs_post_init__` raises "Unequal row and column sparsities are not supported" whenever `row_oracle.num_nonzero != col_oracle.num_nonzero`, so the class only implements the equal-sparsity case of this method's oracle set, not the fully general case its own hop's theory states. `build_composite_bloq` composes, in order, a `diffusion` step (`PrepareUniformSuperposition(n=row_oracle.num_nonzero)` wrapped in `AutoPartition`, not a bare Hadamard layer), `col_oracle`, `entry_oracle`, a `Swap`, `row_oracle.adjoint()`, then `diffusion.adjoint()` — the class's own ASCII circuit diagram draws exactly that sequence. `alpha` returns `row_oracle.num_nonzero` directly — the flat sparsity count, not a square root — and `ancilla_bitsize` is `system_bitsize + 1`, matching the docstring's stated -block encoding.
Data
No matrix is downloaded or measured; sparsity pattern and entries come from the caller's choice of oracle. Two `RowColumnOracle`s ship built in: `TopLeftRowColumnOracle`, whose implementation comment reads "the l-th non-zero entry is at position l, so do nothing", and `SymmetricBandedRowColumnOracle`, parameterised by a `bandsize`. Two `EntryOracle`s ship built in: `UniformEntryOracle`, a single `Ry(2*arccos(entry))`, and `ExplicitEntryOracle`, which loads `arccos` of a supplied NumPy array from `QROM` and applies it as controlled `Ry` rotations bit by bit. The test file's `test_vlasov_explicit` builds an () Vlasov-equation Hamiltonian from its own `gen_vlasov_hamiltonian(n, alpha, m)` helper and block-encodes it with `SymmetricBandedRowColumnOracle(n, bandsize=1)` plus `ExplicitEntryOracle`.
Code
`qualtran/bloqs/block_encoding/sparse_matrix.py` in https://github.com/quantumlib/Qualtran — Python, Apache License 2.0, header "Copyright 2024 Google LLC"; 500 lines as read on 2026-08-27 (most recent commit to the file aa47606, 2026-03-09), latest tag v0.7.0. The block-encoding class is `SparseMatrix(row_oracle, col_oracle, entry_oracle, eps)`, an `attrs.frozen` subclass of `BlockEncoding` from `qualtran.bloqs.block_encoding.block_encoding_base`; its oracle arguments are typed `RowColumnOracle` and `EntryOracle`, both `abc.ABC` subclasses of `Bloq` defined in the same file. A sibling file in the same directory, `sparse_matrix_hermitian.py`, defines a Hermitian-restricted variant not covered here.
Results
The file's own `sparse_matrix_test.py` is the only source of numbers. `test_sparse_matrix_params` asserts `bloq.alpha == 4`, `bloq.epsilon == 0` and `bloq.ancilla_bitsize == 2 + 1` for a 2-qubit example (`TopLeftRowColumnOracle(system_bitsize=2)`, all entries nonzero), and `bloq.alpha == 2**n` symbolically for general `system_bitsize=n`. `test_call_graph` counts `sigma[Hadamard()] == 4` for the concrete example and `6 * n` symbolically. `test_sparse_matrix_tensors` reconstructs the matrix as `bloq.tensor_contract() * alpha` and checks it against `np.full((4, 4), 0.3)`; `test_vlasov_explicit` does the same for the Vlasov Hamiltonian at `atol=0.02`. `tensor_contract` is Qualtran's own classical tensor-network contraction, built on quimb (`import quimb.tensor as qtn` in `qualtran/simulation/tensor/_quimb.py`) — none of these checks run on a quantum simulator or hardware backend.
- Expressing and Analyzing Quantum Algorithms with Qualtran
QCLAB scripts for explicit sparse block-encoding circuits
- Explicit Quantum Circuits for Block Encodings of Certain Sparse Matrices
Daan Camps, Lin Lin, Roel Van Beeumen, Chao Yang · 2022
About
The abstract states the goal plainly: "we give a few examples on how efficient quantum circuits can be explicitly constructed for some well structured sparse matrices, and discuss a few strategies used in these constructions. We also provide implementations of these quantum circuits in MATLAB." Its base result, Theorem 4.1, is presented as "a variant of [Gilyén et al., 2019, Lemma 48 (in the full version)]": given a unitary with and a unitary with , then "block encodes A/s" for an s-sparse A — using only a column oracle and an entry oracle, no separate row oracle. The paper's own concluding remarks name that omission as a limitation, not an oversight: "it may be difficult to find an efficient if the sparsity pattern of A is somewhat arbitrary. In some cases, a more general block encoding scheme that includes an additional unitary that encodes the row sparsity separately from the column sparsity may be needed" — the row oracle this method's own hop uses throughout is, in this paper, an extension the released scripts do not implement.
Methods
Three matrix families are released as QCLAB `.m` functions returning `[circuit, OA, OC, D]`, each built in the order — the right-to-left reading of Theorem 4.1's : a real symmetric matrix (`realsym2_simple.m`), a banded circulant/tridiagonal matrix with periodic or non-periodic boundary conditions (`tridiag.m` and three variants), and the adjacency matrix of a weighted extended binary tree on nodes (`extbintree.m`). `realsym2_simple.m` is the direct Theorem-4.1 construction: `theta1 = 2*acos(alpha1)`, `theta2 = 2*acos(alpha2)`, applied as two `CRotationY` gates for and a single `CNOT(0,1)` for — matching the paper's own worked example, credited there as "using the following two lines QCLAB code". A separate, non-oracle script for the same matrix, `realsym2.m`, instead factors the block encoding as the seven-unitary product of equation (4.1); the paper notes this circuit "requires 2 ancilla qubits in addition to the n = 1 system qubit required to match the dimension of A", making the resulting unitary "of dimension , which is twice the dimension of the block encoding given by" equation (3.4) — the earlier, explicitly impractical square-root construction from section 3 of the paper (rejected there because it requires computing the square root of ), not a comparison against the / oracle construction of Theorem 4.1 that `realsym2_simple.m` implements. `tridiag.m` builds from three angles `theta0/1/2 = 2*acos(alpha - 1 / beta / gamma)` as multi-controlled `MCRotationY` gates and from the file's own `leftshift`/`rightshift` helpers; `extbintree.m` builds a four-angle and an composed from `mul2`/`div2`/`leftshift`/`rightshift`. None of the three families constructs a separate row oracle.
Data
No dataset: each script's input is a handful of scalars fixing the matrix's own entries — `alpha1, alpha2` for the case; `alpha, beta, gamma` (diagonal, sub- and super-diagonal) for the tridiagonal case, checked in-code by `assert(0 <= alpha); assert(alpha <= 2); assert(abs(beta) <= 1); assert(abs(gamma) <= 1)`; and `n, alpha, beta, gamma` for the extended binary tree. Every `test_*.m` script builds the dense matrix `A` directly in MATLAB from those same scalars for comparison.
Code
https://github.com/QuantumComputingLab/explicit-block-encodings — MATLAB, 21 files under `explicit-block-encodings/`, no license file (the GitHub API reports `license: null`). The repository's most recent commit is dated 2022-12-14 (`pushed_at: 2022-12-14T23:49:12Z`), unchanged since. The README states "This repository contains a collection of MATLAB scripts to generate explicit quantum circuits for block encodings of certain sparse matrices in QCLAB" and depends on the separate `QuantumComputingLab/qclab` toolbox. Function signatures read directly off the files: `[circuit,OA,OC,D] = tridiag(n,alpha,beta,gamma)`, `[circuit,A,OA,OC,D] = realsym2_simple(alpha1,alpha2)`, `[circuit,OA,OC,D] = extbintree(n,alpha,beta,gamma)`.
Results
No hardware or simulator is named: every `test_*.m` script instead builds the circuit's dense unitary classically via QCLAB's `circuit.matrix` property and checks it against the target matrix. `test_tridiag.m` sets `n=3, a=0.3, b=0.5, c=0.7`, forms `M = 4*U(1:2^n,1:2^n)`, and asserts `norm(A - M) < 1e-14` and `norm(U'*U - eye(size(U))) < 1e-14`; `test_realsym2_simple.m` runs the same pattern with `M = 2*U(1:2,1:2)`; `test_extbintree.m` with `M = 8*U(1:2^n,1:2^n)`. The scaling factors 2, 4 and 8 are each script's own sparsity count rounded up to a power of 2, matching Theorem 4.1's A/s.
- Explicit Quantum Circuits for Block Encodings of Certain Sparse Matrices
None found yet.
References
- Quantum singular value transformation and beyond: exponential improvements for quantum matrix arithmetics
András Gilyén, Yuan Su, Guang Hao Low, Nathan Wiebe · 2018
- Circuit complexity of quantum access models for encoding classical data
Xiao-Ming Zhang, Xiao Yuan · 2023
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