fn splitmix64(s: &mut u64) -> u64 {
*s = s.wrapping_add(0x9E37_79B9_7F4A_7C15);
let mut z = *s;
z = (z ^ (z >> 30)).wrapping_mul(0xBF58_476D_1CE4_E5B9);
z = (z ^ (z >> 27)).wrapping_mul(0x94D0_49BB_1331_11EB);
z ^ (z >> 31)
}
#[inline]
fn u01(s: &mut u64) -> f64 {
(splitmix64(s) >> 11) as f64 / (1u64 << 53) as f64
}
#[inline]
fn sign_bit(x: u32, y: u32) -> f64 {
if (x & y).count_ones() & 1 == 0 { 1.0 } else { -1.0 }
}
#[derive(Clone, Debug)]
pub struct SparseChannel {
pub patterns: Vec<u32>,
pub weights: Vec<f64>,
pub n: u32,
}
impl SparseChannel {
pub fn fidelity(&self, x: u32) -> f64 {
self.patterns
.iter()
.zip(&self.weights)
.map(|(&y, &w)| w * sign_bit(x, y))
.sum()
}
fn sample(&self, st: &mut u64) -> u32 {
let u = u01(st);
let mut c = 0.0;
for (&y, &w) in self.patterns.iter().zip(&self.weights) {
c += w;
if u < c {
return y;
}
}
*self.patterns.last().unwrap_or(&0)
}
}
pub fn demo_channel(n: u32, seed: u64) -> SparseChannel {
let n = n.clamp(1, 16);
let mask = ((1u64 << n) - 1) as u32;
let mut st = seed.wrapping_mul(0x2545_F491).wrapping_add(1);
let mut patterns = vec![0u32]; let mut weights = vec![0.0f64];
let k = 3 + (splitmix64(&mut st) % 3) as usize; for _ in 0..k {
let bits = 1 + (splitmix64(&mut st) % 3);
let mut y = 0u32;
for _ in 0..bits {
let pos = (splitmix64(&mut st) % n as u64) as u32;
y |= 1 << pos;
}
y &= mask;
patterns.push(y);
weights.push(0.02 + 0.10 * u01(&mut st));
}
let err_mass: f64 = weights.iter().skip(1).sum();
weights[0] = (1.0 - err_mass).max(0.4);
let z: f64 = weights.iter().sum();
for w in &mut weights {
*w /= z;
}
SparseChannel { patterns, weights, n }
}
pub fn bell_max_error(ch: &SparseChannel, m: u64, seed: u64) -> f64 {
if m == 0 {
return 1.0;
}
let mut st = seed.wrapping_mul(0x9E37_79B9).wrapping_add(7);
let mut counts = vec![0u64; ch.patterns.len()];
let idx: std::collections::HashMap<u32, usize> =
ch.patterns.iter().enumerate().map(|(i, &y)| (y, i)).collect();
for _ in 0..m {
let y = ch.sample(&mut st);
if let Some(&i) = idx.get(&y) {
counts[i] += 1;
}
}
let dim = 1u32 << ch.n;
let mut worst = 0.0f64;
for x in 0..dim {
let est: f64 = ch
.patterns
.iter()
.zip(&counts)
.map(|(&y, &c)| (c as f64 / m as f64) * sign_bit(x, y))
.sum();
let e = (est - ch.fidelity(x)).abs();
if e > worst {
worst = e;
}
}
worst
}
pub fn conventional_max_error(ch: &SparseChannel, m: u64, seed: u64) -> f64 {
let dim = 1u64 << ch.n;
let per = m / dim;
if per == 0 {
return 1.0;
}
let mut worst = 0.0f64;
for x in 0..dim as u32 {
let lam = ch.fidelity(x);
let p_plus = 0.5 * (1.0 + lam);
let mut st = seed
.wrapping_mul(0x100_0001)
.wrapping_add(x as u64 + 1);
let mut hits = 0u64;
for _ in 0..per {
if u01(&mut st) < p_plus {
hits += 1;
}
}
let est = 2.0 * (hits as f64 / per as f64) - 1.0;
let e = (est - lam).abs();
if e > worst {
worst = e;
}
}
worst
}
#[derive(Clone, Copy, Debug)]
pub struct SepPoint {
pub copies: u64,
pub bell_err: f64,
pub conventional_err: f64,
}
pub fn separation_curve(n: u32, seed: u64, ms: &[u64]) -> Vec<SepPoint> {
let ch = demo_channel(n, seed);
ms.iter()
.map(|&m| SepPoint {
copies: m,
bell_err: bell_max_error(&ch, m, seed ^ (m.wrapping_mul(0x51))),
conventional_err: conventional_max_error(&ch, m, seed ^ (m.wrapping_mul(0x71))),
})
.collect()
}
pub fn copies_to_epsilon(n: u32, seed: u64, eps: f64, ceil: u64) -> (u64, u64) {
let ch = demo_channel(n, seed);
let mut bell = 0u64;
let mut conv = 0u64;
let mut m = 16u64;
while m <= ceil {
if bell == 0 && bell_max_error(&ch, m, seed ^ (m.wrapping_mul(0x51))) <= eps {
bell = m;
}
if conv == 0 && conventional_max_error(&ch, m, seed ^ (m.wrapping_mul(0x71))) <= eps {
conv = m;
}
if bell != 0 && conv != 0 {
break;
}
m = (m as f64 * 1.5).ceil() as u64;
}
(bell, conv)
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn identity_channel_has_unit_fidelities() {
let ch = SparseChannel { patterns: vec![0], weights: vec![1.0], n: 5 };
for x in 0..(1u32 << 5) {
assert!((ch.fidelity(x) - 1.0).abs() < 1e-12);
}
}
#[test]
fn fidelities_are_a_walsh_spectrum() {
let ch = SparseChannel { patterns: vec![0, 0b101], weights: vec![0.7, 0.3], n: 3 };
assert!((ch.fidelity(0b000) - 1.0).abs() < 1e-12); assert!((ch.fidelity(0b100) - 0.4).abs() < 1e-12); assert!((ch.fidelity(0b010) - 1.0).abs() < 1e-12); }
#[test]
fn bell_error_shrinks_with_copies() {
let ch = demo_channel(6, 42);
let coarse = bell_max_error(&ch, 200, 1);
let fine = bell_max_error(&ch, 20_000, 1);
assert!(fine < coarse, "more Bell copies ⇒ smaller error ({fine} !< {coarse})");
assert!(fine < 0.05, "20k Bell copies resolve all fidelities: {fine}");
}
#[test]
fn the_exponential_separation() {
let m = 4096u64;
let bell4 = bell_max_error(&demo_channel(4, 7), m, 3);
let bell8 = bell_max_error(&demo_channel(8, 7), m, 3);
let conv4 = conventional_max_error(&demo_channel(4, 7), m, 3);
let conv8 = conventional_max_error(&demo_channel(8, 7), m, 3);
assert!(bell8 < 3.0 * bell4 + 0.02, "Bell ~n-independent: {bell4} → {bell8}");
assert!(bell8 < 0.15, "Bell still resolves 8-qubit fidelities at {m} copies: {bell8}");
assert!(conv8 > conv4, "conventional worsens with n: {conv4} → {conv8}");
assert!(conv8 > 0.3, "8-qubit conventional is starved at {m} copies: {conv8}");
assert!(conv8 > 5.0 * bell8, "Bell beats conventional at 8 qubits: {conv8} vs {bell8}");
}
#[test]
fn copies_ratio_is_exponential() {
let (bell, conv) = copies_to_epsilon(6, 11, 0.08, 5_000_000);
assert!(bell > 0, "Bell reaches ε");
assert!(conv > 0, "conventional reaches ε within the ceiling");
assert!(conv > 8 * bell, "conventional needs exponentially more: {conv} vs {bell}");
}
#[test]
fn deterministic() {
let a = separation_curve(6, 99, &[128, 1024, 8192]);
let b = separation_curve(6, 99, &[128, 1024, 8192]);
for (p, q) in a.iter().zip(&b) {
assert_eq!(p.bell_err.to_bits(), q.bell_err.to_bits());
assert_eq!(p.conventional_err.to_bits(), q.conventional_err.to_bits());
}
}
}