Per-Window Cost
at Scale
The original G3 page tested the √p improvement at N = 32 only and found the observed ratios sit closer to the naive Birthday curve than to the draft's 1/√(p/2) heuristic. v0.3.2 takes the same kernel to N ∈ {16, 32, 64, 128} × p ∈ {2, 3, 5, 7} and asks the cleaner question: which closed-form scaling — measured per cell — keeps the ratio measured / predicted flat as N grows?
neither_curve_is_flat_quantitative_claim_only. Worst flatness vs √(N/p) = 1.980 and vs √N = 1.980 — neither curve is flat to within the 20% margin. Measured first-collision queries stay roughly constant (~2.2–3.1) across the full grid because the modal projection collapses the post-selected window to a 2–3 element support per slope (see "observed support" column below). The √p improvement is not visible here, and the naive birthday curve is wrong in the same direction.Mean queries vs N, per p (with √N and √(N/2) reference curves)
Per-cell table
| N | p | mean queries | obs support | √(N/p) | √N | meas / √(N/p) | meas / √N |
|---|---|---|---|---|---|---|---|
| 16 | 2 | 2.32 | 2.25 | 2.83 | 4.00 | 0.821 | 0.581 |
| 16 | 3 | 2.41 | 3.00 | 2.31 | 4.00 | 1.045 | 0.603 |
| 16 | 5 | 2.32 | 2.67 | 1.79 | 4.00 | 1.299 | 0.581 |
| 16 | 7 | 2.30 | 2.50 | 1.51 | 4.00 | 1.519 | 0.574 |
| 32 | 2 | 2.41 | 4.25 | 4.00 | 5.66 | 0.602 | 0.426 |
| 32 | 3 | 2.45 | 4.25 | 3.27 | 5.66 | 0.750 | 0.433 |
| 32 | 5 | 2.19 | 2.50 | 2.53 | 5.66 | 0.864 | 0.387 |
| 32 | 7 | 2.21 | 3.00 | 2.14 | 5.66 | 1.034 | 0.391 |
| 64 | 2 | 2.67 | 7.25 | 5.66 | 8.00 | 0.473 | 0.334 |
| 64 | 3 | 2.62 | 7.75 | 4.62 | 8.00 | 0.566 | 0.327 |
| 64 | 5 | 2.23 | 2.75 | 3.58 | 8.00 | 0.623 | 0.279 |
| 64 | 7 | 2.15 | 3.75 | 3.02 | 8.00 | 0.710 | 0.269 |
| 128 | 2 | 3.08 | 12.25 | 8.00 | 11.31 | 0.385 | 0.272 |
| 128 | 3 | 2.56 | 6.75 | 6.53 | 11.31 | 0.391 | 0.226 |
| 128 | 5 | 2.46 | 3.50 | 5.06 | 11.31 | 0.485 | 0.217 |
| 128 | 7 | 2.18 | 3.75 | 4.28 | 11.31 | 0.510 | 0.193 |
What this means
The kernel's post-QFT support per SRP slope is small (a handful of high-mass y values), so once we further restrict to y mod p == 0 the windowed stream lives on 2–3 distinct outcomes regardless of N. The first-collision count therefore floors at ~2 picks and cannot exhibit either √-curve. This is a finding about the surrogate, not a refutation of the full sieve: it tells us the per-rung Birthday-on-y metric is the wrong knob, and the next G3 work item is a kernel whose modal window has support that actually grows with N (e.g. a coherent two-coset combiner like the v0.3.1 G2 build, post- selected on residue 0).
The GAP G3 ledger entry stays empirically_under_pressure_naive_birthday pending author review of this negative result; v0.3.2 records the quantitative failure mode rather than auto-flipping the verdict.
Kernel snippet (legacy cphase_on ladder + Walsh-style readout)
from quantum.nadarasa_g3_lib import guppy, qubit, h, measure, result, cphase_on
@guppy
def program() -> None:
lbl = qubit()
d0 = qubit()
d1 = qubit()
d2 = qubit()
d3 = qubit()
d4 = qubit()
h(lbl)
h(d0)
h(d1)
h(d2)
h(d3)
h(d4)
cphase_on(lbl, d0, 0.39269908169872414)
cphase_on(lbl, d1, 0.7853981633974483)
cphase_on(lbl, d2, 1.5707963267948966)
cphase_on(lbl, d3, -3.141592653589793)
cphase_on(lbl, d4, 0.0)
h(lbl)
result("lbl", measure(lbl))
h(d0)
result("y0", measure(d0))
h(d1)
result("y1", measure(d1))
h(d2)
result("y2", measure(d2))
h(d3)
result("y3", measure(d3))
h(d4)
result("y4", measure(d4))