Quantum Counting¶
English · 简体中文
Category C3 · Module
oracq.algorithms.common.estimation· Stage V2
Overview¶
Estimates the number \(t\) of marked elements in a search space of size \(N=2^n\). Quantum counting is not a separate circuit but a direct application of amplitude estimation (same Brassard framework, arXiv:quant-ph/0005055): on a uniform superposition the good-state probability is exactly \(a=t/N\); run standard amplitude estimation and multiply \(N\) back:
This repository registers it as a gallery entry (quantum_counting in applications/gallery.py) that reuses the amplitude_estimation entry point.
Interface and input model¶
There is no separate entry function; the recipe is:
operation = amplitude_estimation(uniform_state(n), marked, precision=p)
uniform_state(n): uniform state preparation (SP), making \(a=t/N\).marked: the set of integer indices of the marked basis states, \(t=|M|\).precision: the number of phase-register bits, range 1..63.
The returned object’s registers and attributes are the same as in amplitude estimation (target/work/phase, decoder is "sin(pi*phase/2**precision)**2"): after reading out phase, decode via amplitude_from_phase and multiply by \(2^n\) to get \(\hat t\). The gallery instance takes \(n=2\), marked=(3,), precision=4 (\(t=1\), \(a=1/4\)).
Implementation notes¶
Circuit generation is identical to QAE; the difference is entirely in the classical-side decoding (multiplying by \(N\)). \(\hat t\) need not be an integer, and rounding it into a legal range is the host’s decision; the estimation precision is set by the QAE grid density (precision), and the point estimate is exact when \(t/N\) lands exactly on the grid.
Validation approach¶
Category C3 (acceptance criterion in docs/development/validation-plan.md §2). Quantum counting is registered in docs/development/validation-coverage.md under the estimation.py row (the algorithm column includes “quantum counting”), with no separate witness entry:
Structure:
tests/core/test_algorithm_expansion.py:AlgorithmExpansionTests.Numerical: the circuit witness is QAE’s
AlgorithmExpansionTests.test_amplitude_estimation_half_probability(see amplitude estimation); the gallery instance is demonstrated by thequantum_countingentry ofapplications/gallery.py(“multiply the amplitude estimate by 4 to estimate the number of marked items”).Binding: the module row registers “—“.
Known gaps and planned stages¶
Same as QAE: the confidence-interval claim is unwitnessed (only the point estimate is verified), and the error propagation of multiplying the point estimate by \(N\) is likewise not cross-checked; the estimation.py module is at stage V2.
Numerical validation¶
Experiment design: \(n=3\) (\(N=8\)), marked \(=\{1,5,7\}\) (\(t=3\), \(a=3/8\)), precision \(=4\) (grid \(M=16\)). Following the recipe above, amplitude_estimation(uniform_state(3), marked, precision=4) is generated, and the full distribution of the phase register is read out on the four backend paths (reference, rir-pysparq, adapter-pysparq, originir-ext), compared against an independent Dirichlet-kernel reference (a QPE grid convolution over the eigenphases \(\pm\theta/\pi\), \(\theta=\arcsin\sqrt{3/8}\)), and the count is decoded as \(\hat t=N\sin^2(\pi y/M)\).
Case |
Scale |
Paths |
Metric |
Value |
|---|---|---|---|---|
quantum-counting-n3-t3 |
N=8, t=3, M=16 |
4 paths |
phase-distribution TVD |
5.7e-15 |
same |
same |
same |
peak estimate \(\hat t\) (error) |
2.4693 (0.531, ≤ 1 grid step) |
same |
same |
same |
central grid mass (QAE lower bound \(8/\pi^2\)) |
0.8529 (≥ 0.8106) |
The true value \(\theta M/\pi\approx3.357\) lies between grid points 3 and 4; the bimodal distribution (\(y=3,13\), each about 0.325) matches the theoretical positions; the point-estimate precision is set by the grid density, consistent with the stated convention that “\(\hat t\) need not be an integer”.
Reproduction command:
PYTHONPATH=src /home/agony/projects/qcfd-dev/quantum-cfd-software/.venv/bin/python tests/verification/verify_search_walks.py
Artifacts: out/verification/search_walks.json (case quantum-counting-n3-t3).