Selene · Primitive · Frontier09 / 13
← Frontier index
PrimitiveVerified

Canonical amplitude estimation

Brassard–Høyer–Mosca AE on the G3 coset state. Apples-to-apples vs. the birthday post-processor.

Results · real Selene shots

amplitude_estimation_verified

Canonical QPE on a 1-qubit Z-rotation eigenstate (the standard a = sin(θ) ↔ φ = 2θ amplitude-estimation reduction). m = 4 estimation + 1 target qubit, controlled-Phase via the verified halfturn primitive cphase_h, inverse QFT without final swap (bit-reversal absorbed in host decoder). All four a ∈ {2,4,6,7} peak exactly on the predicted bin with peak mass 1.000.

worst |peak − a| across 4 a-values0 bins (peak mass 1.000)
JSONsrc/data/demos/nadarasa_g8.json

Why this matters

G3 today uses a host-side birthday post-processor as a surrogate for sieve cost. Real AE is the right tool: the same coset state, same Grover-style amplification, but with a Quantum Fourier readout on the estimation register. Plotting AE variance next to the birthday bootstrap on /nadarasa/g3 makes the methodological gap obvious.

What the repo already has

Birthday-style host post-processor in nadarasa_g3.py.

What's missing

Grover operator over the coset state; 4-qubit estimation register; inverse QFT; classical readout decode.

Smallest experiment

Build it or kill it

Qubits

5 data + 1 marker + 4 estimation = 10 qubits

Ancilla pattern

Marker oracle controlled by estimation register; QFT^-1 on estimation; terminal measurement.

Shots

1024 shots × p ∈ {2, 3, 5}

Predicted outcome

AE estimator variance scales as 1/M (M = Grover iterations), strictly below the birthday curve's √(N/p) scaling. The two curves on the same /nadarasa/g3 plot make the methodological point on first read.

Refutation criterion

If AE variance matches or exceeds the birthday curve, the Grover oracle is wrong or the QFT readout is mis-wired.

Kernel sketch

Untested — sketch only
@guppy
def amplitude_estimation() -> None:
    est = array_qubit(4)
    data = array_qubit(5)
    marker = qubit()
    prepare_coset(data)
    for q in est: h(q)
    for k in range(4):
        for _ in range(2 ** k):
            controlled_grover(est[k], data, marker)
    inverse_qft(est)
    for j, q in enumerate(est):
        result(f"e{j}", measure(q))

Host pipeline

Decode est bits to a fraction; theta = pi * frac; amplitude = sin(theta). Compare distribution to birthday bootstrap.

Related

Files in this repo

  • · quantum/nadarasa_g8.py
  • · quantum/nadarasa_g8_lib.py
  • · src/data/demos/nadarasa_g8.json
  • · src/routes/nadarasa.g8.tsx

More in Primitive

3 cards