Draft · v0.2 · Unreviewed
← Index/Project · Nadarasa ReductionDraft · v0.2 · Selene Emulator

Nadarasa · v0.4.1 · Selene experiment

G16 — Ethylene QPDE on Selene

Quantum Phase Difference Estimation on the two-qubit π/π* active space of ethylene, compiled with Guppy and executed on the Selene Quest emulator. The protocol follows the chemistry section of the SoftBank / Quantinuum “Quantum Computing Frontiers” white paper (July 2026): estimate the phase difference between two eigenstates so the large, uninteresting global phase cancels and fewer ancilla bits buy chemical accuracy.

Verdict
20/20 PASS
Worst Δ
0.0217
Shots / cell
4096
Gap recovered
0.810 Ha

What the evolution-time trick buys

Restricted to the single-excitation subspace {|01⟩, |10⟩}, the active-space Hamiltonian is diag_avg·I + off·X, so the exact propagator is an XX+YY rotation by φ = off·t. Choosing the evolution time so that φ lands on a short binary fraction of π — here φ = kπ/16 — makes the measured interference land on exactly representable angles instead of forcing extra ancilla resolution. The closed form is

p(q1 = 1) = (1 − sin(2φ) · sin(β)) / 2

Guppy angles are halfturns, so φ = kπ/16 is written angle(k/16) — never angle(math.pi/16), which would be the S gate.

Sweep · measured vs predicted p(q1 = 1)

kt (a.u.)β = 0β = π/4β = π/2β = 3π/4β = π
10.490.4788 / 0.50000.3564 / 0.36470.3079 / 0.30870.3604 / 0.36470.4927 / 0.5000
20.980.4976 / 0.50000.2495 / 0.25000.1375 / 0.14640.2383 / 0.25000.5078 / 0.5000
41.960.5061 / 0.50000.1509 / 0.14640.0000 / 0.00000.1423 / 0.14640.5066 / 0.5000
83.930.4783 / 0.50000.4946 / 0.50000.5190 / 0.50000.5110 / 0.50000.4995 / 0.5000

Each cell shows measured / predicted. A cell passes when |measured − predicted| ≤ 0.0442, the 4σ binomial threshold 4·√(0.5/shots) at 4096 shots.

Recovering the eigenvalue gap

k2φ nominal2φ estimatedgap (Ha)abs. error
10.39270.39440.80350.0035
20.78540.81120.82630.0263
41.57081.57080.80000.0000

Mean estimate 0.8099 Ha against a reference gap of 0.8000 Ha — an error of 0.0099 Ha.

k = 8 is held out of the fit: at k=8 the phase 2*phi reaches pi, where the interference signal is stationary and the arcsine branch is degenerate — the QPDE mod-1 wrap. It is kept in the sweep as an aliasing control — every β column collapses to 0.5, which is exactly what the wrap predicts.

Is the residual shot noise or fit bias?

The headline fit above is ~4% off the reference gap. That number has two very different possible causes, and only one of them is fixable by buying shots. Re-running the β = π/2 column across four shot budgets and a wider k set separates them.

ShotsGap (Ha)Rel. errorSpread over k
2560.84996.24%0.1225
10240.78441.95%0.0298
40960.80210.27%0.0149
163840.80390.49%0.0266
  • Feeding the inverter exact probabilities returns 0.8000 Ha — a bias of exactly 0.0000 Ha. The principal-branch inversion is unbiased over k ∈ 1, 2, 3, 4, so the entire residual is statistical.
  • Accordingly the error falls to 0.27% at 4096 shots once k = 3 is added to the fit — the original 4% came as much from averaging only three k-points as from shot count.
  • k = 6 is a second aliasing control, distinct from k = 8: the branch condition is 2φ ≤ π/2, so any k > 4 inverts onto the wrong arm of the arcsine and returns ≈0.27 Ha. Measured, reported, never fitted.

Driver quantum/qpde/fitquality.py, noiseless Quest, 4 budgets × 5 k-cells, all cells PASS the 4σ threshold.

Caveats

  • The active-space constants are order-of-magnitude values quoted from the SoftBank/Quantinuum white paper, not a converged electronic-structure calculation.
  • Quest is a noiseless state-vector emulator; deltas here are pure shot noise, not hardware error.
  • The subspace propagator is compiled exactly as an XX+YY rotation rather than Trotterised.

Reproduce

pip install --target .pydeps -r quantum/requirements.txt
PYTHONPATH=.pydeps python -m quantum.qpde.sweep
PYTHONPATH=.pydeps python -m quantum.qpde.validate
PYTHONPATH=.pydeps python -m quantum.qpde.fitquality

Pins: guppylang 0.21.16 · selene-sim 0.2.18 · Quest (ideal). The sweep caches each cell under quantum/qpde/_cache_qpde/ and is resumable; results ship as static JSON, nothing quantum runs at request time.