#quantum-computing #quantum-simulation #quantum-circuits #quantum-network

qnect

⚛ Quantum computing in Rust: from Bell pairs to distributed quantum networks

5 unstable releases

Uses new Rust 2024

0.3.0 Sep 2, 2025
0.2.0 Aug 19, 2025
0.1.2 Aug 18, 2025
0.1.1 Aug 18, 2025
0.1.0 Jul 31, 2025

#192 in Math

Download history 95/week @ 2025-08-31 14/week @ 2025-09-07 2/week @ 2025-09-14 7/week @ 2025-09-28 3/week @ 2025-10-05

274 downloads per month

MIT/Apache

370KB
7K SLoC

Qnect 🔗

Crates.io Docs.rs License

Quantum computing in Rust: from Bell pairs to distributed quantum networks.

No config files. No magic. Just quantum.

Build quantum circuits, simulate massive systems, and create quantum networks - all with one powerful framework:

  • 🧮 Quantum circuits (2 to 5000+ qubits)
  • 🌐 Distributed quantum networks (multi-hop entanglement, teleportation)
  • 🔒 Research-grade protocols (anonymous transmission, blind quantum computing)
  • ⚙️ Hardware-ready integration (NetQASM, MockQnpu, QASM import/export)
use qnect::{create, builder::BackendType};
use qnect::network::{QuantumNetwork, NetworkBuilder, Topology};

// Start simple...
let mut q = create().with_qubits(2).build()?;
q.h(0).await?;
q.cnot(0, 1).await?;

// ...or scale to 5000 qubits?
let mut q = create()
    .with_backend(BackendType::Stabilizer)
    .with_qubits(5000)
    .build()?;

// ...or build quantum networks!
let mut network = QuantumNetwork::new_distributed();
network.add_node("Alice", 4);
network.add_node("Bob", 4);

// ...or use quantum hubs for routing!
let mut network = NetworkBuilder::new()
    .with_topology(Topology::Star { hub_name: "Hub".into(), hub_capacity: 100 })
    .add_hub("Hub", 100)
    .add_endpoint("Alice", 10)
    .add_endpoint("Bob", 10)
    .build()?;

// Distribute entanglement through the hub
let (q1, q2) = network
    .create_epr_pair_through_hub("Alice", "Bob", "Hub")
    .await?;

Features

  • 🚀 Fast - 100,000 gates/second in pure Rust
  • 📈 Scalable - Same API from 2 to 5000+ qubits
  • 🌐 Networked - Multi-hop entanglement, hub-based routing, NetQASM generation
  • 🔬 Research-grade - Anonymous protocols, blind computation, verified physics
  • 🎯 Zero config - No setup files, just cargo run
  • 📊 Realistic noise - Depolarizing and measurement errors for accurate simulation

Installation

[dependencies]
qnect = "0.3.0"
tokio = { version = "1", features = ["full"] }

Quick Start

Your First Bell Pair (The Quantum Hello World!)

use qnect::create;

#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
    let mut q = create().with_qubits(2).build()?;
    q.h(0).await?;        // Superposition
    q.cnot(0, 1).await?;  // Entanglement
    let (m0, m1) = (q.measure(0).await?, q.measure(1).await?);
    println!("Bell pair: |{}{}", m0, m1);  // Always 00 or 11
    Ok(())
}

Try It Now

# See quantum mechanics in action
cargo run --example 03_simple_bell_pair
cargo run --example 00_quantum_verification  # Verify Bell inequalities!

Key Examples

Quantum Teleportation

use qnect::create;
use std::f64::consts::PI;

let mut q = create().with_qubits(3).build()?;

// Alice's qubit to teleport
q.ry(0, PI/3.0).await?;

// Shared Bell pair
q.h(1).await?;
q.cnot(1, 2).await?;

// Teleportation protocol
q.cnot(0, 1).await?;
q.h(0).await?;
let (m0, m1) = (q.measure(0).await?, q.measure(1).await?);

// Bob's corrections
if m1 == 1 { q.x(2).await?; }
if m0 == 1 { q.z(2).await?; }
// State transferred to qubit 2!

Scale to 5000 Qubits

use qnect::{create, builder::BackendType};

// Switch backends, same API
let mut q = create()
    .with_backend(BackendType::Stabilizer)
    .with_qubits(5000)
    .build()?;

// Create massive GHZ state
q.h(0).await?;
for i in 1..5000 {
    q.cnot(0, i).await?;
}
// |00000...⟩ + |11111...⟩ with only 12MB RAM!

Quantum Networks with Hub Routing

use qnect::network::{NetworkBuilder, Topology, LinkType};

// Build a quantum data center in 3 lines
let mut network = NetworkBuilder::new()
    .with_topology(Topology::Star {
        hub_name: "DataCenter".into(),
        hub_capacity: 100
    })
    .add_hub("DataCenter", 100)
    .add_endpoint("Server1", 10)
    .add_endpoint("Server2", 10)
    .build()?;

// Servers can share entanglement through the hub
let (q1, q2) = network
    .create_epr_pair_through_hub("Server1", "Server2", "DataCenter")
    .await?;

Quantum Repeaters for Long-Distance Networks

use qnect::network::QuantumNetwork;
use qnect::network::LinkType;
use qnect::builder::BackendType;

// Build transcontinental quantum network with repeaters
let mut network = QuantumNetwork::new_distributed();

// Add cities as endpoints
network.add_distributed_node("London", 10, BackendType::Stabilizer)?;
network.add_distributed_node("Paris", 10, BackendType::Stabilizer)?;
network.add_distributed_node("Berlin", 10, BackendType::Stabilizer)?;

// Connect with quantum repeaters for long distances
network.add_quantum_link("London", "Paris",
    LinkType::Fiber { length_km: 350.0, loss_db_per_km: 0.2 },
    0.85, 100.0)?;
network.add_quantum_link("Paris", "Berlin",
    LinkType::Fiber { length_km: 850.0, loss_db_per_km: 0.2 },
    0.85, 100.0)?;

// Establish end-to-end entanglement through repeater
let (q1, q2) = network
    .establish_end_to_end_entanglement("London", "Berlin")
    .await?;
// Entanglement swapping at Paris enables London ↔ Berlin connection!

Realistic Noise Modeling

use qnect::{create, builder::{BackendType, NoiseModel}};

// Add realistic quantum errors
let mut q = create()
    .with_backend(BackendType::StateVector)
    .with_qubits(5)
    .with_noise(NoiseModel {
        depolarizing_rate: 0.01, // 1% gate error
        measurement_error: 0.001  // 0.1% measurement error
    })
    .build()?;

🌍 Real-World Simulation Example: Quantum-Secured Chat

Build a quantum chat application with QKD (Quantum Key Distribution):

// Terminal 1: Start quantum service
let service = QuantumService::new().await?;
service.run(6666).await?;

// Terminal 2: Run Paris repeater
let repeater = QuantumChatNode::new("Paris", NodeType::Repeater,
    (48.8566, 2.3522)).await?;
repeater.listen(7001).await?;

// Terminal 3: Alice in London
let mut alice = QuantumChatNode::new("Alice", NodeType::Endpoint,
    (51.5074, -0.1278)).await?;
alice.connect_to("Paris", "127.0.0.1:7001").await?;
let key = alice.run_bb84_alice("Bob", 128).await?;  // QKD protocol!
alice.run_chat("Bob", key).await?;  // Quantum-secured chat

// Terminal 4: Bob in Berlin
let mut bob = QuantumChatNode::new("Bob", NodeType::Endpoint,
    (52.5200, 13.4050)).await?;
bob.connect_to("Paris", "127.0.0.1:7001").await?;
let key = bob.run_bb84_bob("Alice").await?;
bob.run_chat("Alice", key).await?;

This creates a quantum network where:

  • 🔐 Keys are distributed using BB84 quantum protocol
  • 🌉 Paris acts as quantum repeater between London and Berlin
  • 💬 Chat is encrypted with quantum-generated keys
  • 🛡️ Eavesdropping is detected by quantum mechanics

Anonymous Quantum Communication

Based on Christandl & Wehner 2004 - impossible classically!

use qnect::network::{QuantumNetwork, LinkType};

// Create network with all participants
let participants = vec!["Alice", "Bob", "Charlie", "David", "Eve"];
let mut network = QuantumNetwork::new_distributed();

// Add all nodes (works with either mode)
for p in &participants {
    network.add_node(p, 8);
}

// Create full mesh connectivity
network.add_multiparty_link(
    participants.to_vec(),
    LinkType::Fiber { length_km: 0.1, loss_db_per_km: 0.1 },
    0.99, 10000.0
)?;

// Anonymous bit transmission
let parity = network
    .anonymous_transmission("Alice", participants.to_vec(), 1)
    .await?;
// Everyone knows bit 1 was sent, but not that Alice sent it!

// Anonymous entanglement
let (q1, q2) = network
    .anonymous_entanglement("Alice", "Bob", participants.to_vec())
    .await?;
// Alice and Bob share entanglement, untraceable by others

Blind Quantum Computing (UBQC)

// Client delegates computation without revealing data
let pattern = BlindComputationPattern {
    computation_graph: vec![(0, 1), (1, 2)],
    measurement_angles: vec![0.5, 1.0, 1.5],  // Encrypted
    flow: vec![0, 1, 2],
};

let results = network
    .blind_computation_ubqc("Client", "Server", pattern)
    .await?;
// Server performed computation but learned nothing!

Network Topologies

Build complex quantum networks with one line:

// Star - Quantum Data Centers
NetworkBuilder::new().with_topology(Topology::Star { hub_name: "DC".into(), hub_capacity: 100 })

// Ring - Metropolitan Networks
NetworkBuilder::new().with_topology(Topology::Ring)

// Mesh - Research Testbeds
NetworkBuilder::new().with_topology(Topology::Mesh { link_fidelity: 0.99 })

// Hierarchical - Internet Scale
NetworkBuilder::new().with_topology(Topology::Hierarchical {
    central_hub: "Core".into(),
    regional_hubs: vec!["NA".into(), "EU".into(), "APAC".into()],
})

Architecture

// Unified backend trait - same for local and distributed
#[async_trait]
pub trait QuantumBackend: Send + Sync {
    async fn apply_single_gate(&mut self, qubit: usize, gate: Gate1) -> Result<()>;
    async fn apply_two_gate(&mut self, q1: usize, q2: usize, gate: Gate2) -> Result<()>;
    async fn measure(&mut self, qubit: usize) -> Result<u8>;
}

Available Backends:

  • StateVector - Exact simulation (≤30 qubits)
  • Stabilizer - Clifford circuits (5000+ qubits, O(n²) memory)
  • MockQnpu - Hardware API testing
  • Noisy - Wraps any backend with realistic errors
  • Future: IBMQ, IonQ, QuTech

All Examples

# 👋 Start Here
cargo run --example 03_simple_bell_pair     # Your first quantum program
cargo run --example 00_quantum_verification  # See Bell inequality violation

# 🎓 Learn Quantum
cargo run --example 04_quantum_teleportation
cargo run --example 17_grovers_search       # Grover's algorithm
cargo run --example 18_stabilizer_demo      # 5000 qubits!
cargo run --example 15_noise_models         # Realistic quantum noise

# 🌐 Quantum Networks
cargo run --example quantum_hub_demo        # Hub-based routing
cargo run --example network_builder_demo    # Build topologies
cargo run --example quantum_topologies      # All 5 topology types
cargo run --example quantum_qkd_chat        # Secure chat with QKD
cargo run --example 22_quantum_anonymous_transmission  # Anonymous protocols

# 🏭 Production Ready
cargo run --example 21_hardware_ready       # NetQASM generation demo
cargo run --example 16_qasm_import          # OpenQASM 2.0/3.0 support

Performance

Backend Max Qubits Memory Speed Use Case
StateVector ~30 O(2ⁿ) Exact Research, small circuits
Stabilizer 5000+ O(n²) 135k gates/sec Error correction, large circuits
Noisy Same as wrapped Same as wrapped ~5% overhead Error modeling, noisy simulation
MockQnpu Hardware Minimal Network-limited Hardware testing

Why Qnect?

For Beginners:

  • Start with 5 lines of code
  • All the gates you need
  • Clear error messages
  • Visual circuit diagrams
  • No configuration needed

For Researchers:

  • Anonymous quantum protocols
  • Blind computation (UBQC)
  • Distributed GHZ states
  • Hub-based routing
  • NetQASM generation
  • Realistic noise models

For Production:

  • Type-safe Rust
  • Async/await design
  • Resource tracking
  • Hardware-ready output

Roadmap

Released (v0.3.0)

  • Quantum simulators (state vector, stabilizer)
  • Realistic noise models
  • Quantum networks with routing
  • Hub-based quantum routing (New!)
  • NetworkBuilder API (New!)
  • 5 topology templates (New!)
  • Anonymous protocols
  • NetQASM SDK generation
  • OpenQASM import and export

🚧 In Progress

  • Tensor network backend
  • Real hardware adapters
  • Python bindings

🔮 Planned

  • GPU acceleration
  • Quantum error correction
  • Advanced routing protocols

Contributing

We welcome contributions! Key areas:

  • 🧮 New backends (tensor networks, GPU)
  • 🔧 Algorithms (Shor, VQE, QAOA)
  • 🌐 Network protocols
  • 📖 Documentation

License

MIT OR Apache-2.0


In quantum computing, the hardest part shouldn't be the framework.

Dependencies

~3.5–8MB
~139K SLoC