Cross an electric field with a magnetic one and charges march sideways. Does that drift speed depend on the charge or the mass — do heavy and light, plus and minus, drift apart?
Units: m/s — E×B drift speed v_d = |E×B|/B² = E/B at E = 10 kV/m, B = 10 mT: Thomson's velocity-selector speed
▶ Run this simulationRead how it works
E×B drift: no-oracle → validated — Thomson's velocity-selector speed from the Lorentz force alone: with NOTHING coded but a = (q/m)(E + v×B) (RK4; no v_d = E/B, no cycloid, no guiding-centre theory), strobing trajectories at a fixed gyrophase returns v̂_d = 999999.5 ± 1.2 m/s vs E/B = 10⁶ m/s (rel 5.5e-7 under 0.01% chronometry + 0.1% position noise; noiseless floor 2.1e-12); the drift contains NO charge and NO mass — free fits v_d ∝ m^(3.8e-13) q^(0.0) over ×10 in mass and ×4 in charge, q → −q reverses the gyration sense yet leaves the drift vector unchanged to 2.1e-11 — and NO initial condition (spread 1.8e-13 over launches 0–3·E/B); v_d ∝ E^1.0000000000 B^−1.0000000000; the cycloid crown v_max = 2v̂_d and loop height h = 2mE/(qB²) emerge; a beam launched at the lab's own v̂_d runs straight to 2.1e-12 (the Wien filter); Drude's mobility rival — speed-calibrated on the lab's own drift — marches 90.000° off, reverses with charge sign, and fits m^−1 (z = 1.5e6); a relativistic pusher at v_d = 0.25c STILL drifts at exactly E/B (dev 2.6e-12) while its gyroperiod dilates 1.1016·T_c — the inverse of the cyclotron breakdown; the module's Boris pusher has fixed-point drift = E/B to 6.9e-15 at dt = 1/240, its on-screen ⟨v⟩ carrying only the disclosed partial-loop wobble (~1.7% at 60 s, decaying as 2v_d/(ωT)); HONEST-MODULE CERTIFICATE: the derisk EXECUTES ExBDriftModule.ts itself (8 sha256-pinned slices, mechanical strip, 7200 engine ticks at fl(1/120) = 2·fl(1/240) bit-exact, accumulator === 0 every tick) and pins the 60 s executed state strict-=== — the q=−1 particle's sumVx/vx/x are BIT-IDENTICAL to its q=+1 twin's with sumVy/vy exactly negated (charge conjugation is an exact mirror on the module's own floats: gyration flips, drift doesn't); the probed fixed point of the executed map is v*_x = E/B to 6.9e-15 (zero integrator bias on the displayed quantity) and each displayed ⟨v⟩ − v* equals the closed-form partial-loop geometric sum to 1.5e-12 (the visible 0.983…1.016 wobble IS the truncated-cycloid average, zero fitted parameters); in the drift frame the executed Boris map is a pure rotation, so gyro-speed is conserved to 1.7e-14 over 14400 substeps; screen↔oracle invariant v_d·B/E gap 2.1e-12; 28/28 gates 0.1 s, both tampers ⇒ exit 1
The generator codes ONE thing: Newton's second law under the full Lorentz force, a = (q/m)(E + v×B) with E = E·ŷ, B = B·ẑ, stepped by RK4 at dt = (m/qB)/400 (m/(qB) and E/B used solely as step/launch SCALES — dimensional analysis of the EOM coefficients, never the drift law). No v_d = E/B, no cycloid closed form, no guiding-centre theory appears in the recovery path: each trajectory is STROBED at a fixed gyrophase by clocking upward zero-crossings of vy (linear interpolation inside a step — the interpolation residual is identical at every same-phase crossing, so it cancels exactly in the slope), and the drift velocity is the least-squares slope of strobed position vs strobed time, x and y components separately. 12 seeds each draw their own launch velocity (|v0| ∈ [0.2, 3]·E/B, any direction) plus independent Gaussian jitter: 0.01% chronometry on every clocked crossing (scale = first MEASURED interval) and 0.1% position noise (scale = MEASURED cycloid height). 28 gates in scripts/exb-derisk.mjs (~0.1 s), including a module-honesty certificate (K–O) that EXECUTES the shipped ExBDriftModule.ts source — eight sha256-pinned slices mechanically stripped and driven at the engine's own fl(1/120) schedule, with the executed state and HUD strings pinned strict-===; tamper ⇒ exit 1. ?world=exb.
1.17
7.4000e-6
3.6400e-7
The E×B guiding-centre drift v_E = (E×B)/B² of plasma physics (Chen, Introduction to Plasma Physics, Eq. 2-12), operationally Thomson's 1897 crossed-field velocity selector v = E/B (Phil. Mag. 44, 293) — recovered to 5.5e-7 with charge- and mass-independence to free-fit exponents < 4e-13. Non-circular: q, m, E, B are inputs, but ONLY as coefficients of the coded force a = (q/m)(E + v×B) — that the motion decomposes into gyration + steady march at all, that the march is perpendicular to E (not along it), that its speed is E/B with no q, m, or initial condition in it, that the crown is 2v_d and the loops scale as m, are all read off integrated trajectories by same-gyrophase strobing; the drift law never appears in the generator or estimator (same pattern as magnetism: force law in, motion law out). The decisive discriminator is the DIRECTION plus particle-independence: any mobility-type conduction (Drude, calibrated to the measured speed) marches along E and scales as q/m, failing at z = 1.5e6.
The module (?world=exb, src/modules/ExBDriftModule.ts) is honest at its core: four charges (m = 1, 2, 3 at +q, plus q = −1) are pushed by a Boris integrator derived from the coded F = q(E + v×B), and the on-screen ⟨v⟩ per particle is genuinely time-averaged from the trajectory, plotted against a separate dashed 'theory E/B' line. The derisk's module-emulation gate proves the displayed quantity carries NO integrator bias: the Boris update's fixed point in velocity space — the drift it converges around — equals E/B to 6.9e-15 at the module's dt = 1/240 (a celebrated Boris property: the E×B drift is exact at ANY step size, unlike the cyclotron module's (ωdt/2)²/3 period bias). The one systematic is the running average itself: it starts at t = 0 from rest and includes partial cycloid loops, so the on-screen ⟨v⟩ oscillates around E/B with the closed-form Dirichlet truncation term (verified to 1.5e-12), envelope ≈ 2v_d/(ωT) — ±1.7% for the heaviest lane at 60 s, ±0.6% for the lightest, decaying as 1/T. This is visible in the HUD's 3rd decimal and in its own 'max |Δv_d|' readout, which honestly shrinks as the average converges. The module's x-wrap translates position only, leaving velocity (and hence ⟨v⟩) unbiased — already documented in the module source. No module edit was needed this run. HONEST-MODULE (refiner, 2026-07-24): the emulation gate was upgraded to an executed certificate — gates K–O run the shipped module source itself (8 sha256-pinned slices, mechanical strip with asserted replacement counts, new Function) at the engine's fl(1/120) schedule, which is bit-transparent (fl(1/120) === 2·fl(1/240), accumulator === 0 after every tick), and pin the 60 s executed state and both HUD strings strict-===. Everything the emulation claimed is now proven on the executed floats: fixed-point drift = E/B to 6.9e-15, the displayed wobble = the closed-form truncation to 1.5e-12, plus two claims only execution could make — charge conjugation is an exact bit-mirror (q=−1 has sumVx/vx/x === its q=+1 twin's, sumVy/vy exactly negated), and the gyro-speed |v−v*| is conserved to 1.7e-14 over 14400 substeps because in the drift frame the executed map is a pure rotation. Zero module edits (3rd zero-edit certificate after brachistochrone and magnetism).
Rung climbed: no-oracle → validated. One pre-landing measurement fix (not a tolerance widening): the charge-flip gate first ran the −q trajectory with 16 strobed crossings vs the baseline's 64, putting its slope floor at 7.3e-10 against a 1e-10 guess; matching the crossing count brought the measured difference to 2.1e-11 and the tolerance was set at 1e-9, the same ~50× floor-class ratio as the noiseless gate. Tolerances justified from 7 independent 12-seed prototype batches (|mean rel| 4.4e-8–2.0e-6, SE 1.1–1.5e-6, worst seed ≤ 1.02e-5 → main gates 5e-6/3e-5/5e-6). Hand tamper (known → 1.05e6 m/s) ⇒ 3 gates FAIL, exit 1, recovered value unchanged at 999999.5; restored by hand; in-script scoring self-test (gate J, known×1.02) green. Design-time win: strobing at a fixed gyrophase makes the position-interpolation residual identical at every sample, so it cancels exactly in the LS slope — the noiseless floor (2.1e-12) is the same class as magnetism's turn-clock despite measuring a displacement rather than a time. Refiner run 2026-07-24 (certificate): tamper 1 (known → 1.02e6 m/s) ⇒ 3 gates FAIL, exit 1, recovered unchanged at 999999.5; tamper 2 (pinned sumVx last ulp) ⇒ gate L FAIL, exit 1; both restored by hand. Certificate tolerances from measured executed floors (fp 6.9e-15 → 1e-12, trunc 1.5e-12 → 1e-9, gyro-speed 1.7e-14 → 1e-11, invariant 2.1e-12 → 1e-9), never padded. Runtime 0.1 s.
npm run derisk -- exb (scripts/exb-derisk.mjs)scripts/oracles/exb.reference.jsonJ. J. Thomson, Phil. Mag. 44, 293 (1897); W. Wien, Ann. Phys. 301, 440 (1898). F. F. Chen, Introduction to Plasma Physics and Controlled Fusion, 2nd ed. (1984), Eq. (2-12). Relativistic: J. D. Jackson, Classical Electrodynamics, 3rd ed. (1999), §12.3. Rival: P. Drude, Ann. Phys. 306, 566 (1900).