A quantum simulation engine that runs on any consumer GPU. Define your quantum circuit — the engine handles execution automatically. Chemistry, nuclear physics, security, optimization. One platform, multiple domains, any Vulkan GPU.
Honest about what it is: a fast, structure-aware classical GPU simulator with a hardware off-ramp — not a quantum computer. Benchmarks below are self-run on a single workstation. See the measured numbers & limits →
Researchers wait months for access to quantum hardware. Companies invest millions in cloud-based quantum services that don't scale. The entire field moves at the speed of queue times.
We built a quantum simulation engine that runs on consumer GPUs via Vulkan. Define your quantum circuit — the engine handles execution automatically. Hardware-accelerated, any GPU vendor. Multiple proven domains. Self-contained deployment.
This began as an attempt to break Bitcoin puzzle keys. The classical-number-theory plus quantum-assisted period-finding pipeline grew out of that chase — which is why factoring and structure-exploiting circuits are first-class capabilities here, not afterthoughts.
Define your quantum circuit. Standard formats supported for chemistry, optimization, and cryptographic workloads. No specialized hardware knowledge required.
Automatic circuit optimization. Multiple optimization levels. Detects structural patterns for efficient execution. Handles the complexity so you don't have to.
GPU execution via Vulkan compute. Automatic selection of the fastest execution path for your specific circuit. Fleet coordination across multiple GPUs when needed.
Results validated against known physical ground truths. Chemical accuracy, nuclear ground states, cryptographic verification. If the physics says it's right, it's right.
On-premise deployment. Your workloads never leave your infrastructure. Full data sovereignty. No cloud required. The engine is yours — the results are yours.
Calculate molecular ground states for drug discovery, materials science, and catalyst design. Validated to chemical accuracy against exact diagonalization. Standard chemistry input formats supported.
Ground state energies and spectroscopy for atomic nuclei. Validated against experimental data. Defense, energy, and fundamental physics applications.
Assess cryptographic resilience against quantum attacks. Semiprime factoring at scale. Post-quantum readiness assessment for your infrastructure.
Solve combinatorial optimization problems in finance, logistics, and scheduling. Portfolio construction, resource allocation, route planning. Nature-inspired algorithms.
Define quantum circuits declaratively. Automatic execution path selection per workload. One engine, multiple domains, any Vulkan GPU. No vendor lock-in.
On-premise deployment. Your quantum workloads never leave your infrastructure. Full control over proprietary research data and results. No cloud dependency.
"The best part is no part. The best process is no process. It weighs nothing, costs nothing, can't go wrong."
We apply the same first-principles methodology that took rockets from disposable to reusable. Every assumption is questioned. Every conventional limit is tested. Every "impossible" is a hypothesis, not a law.
Remove everything that isn't physics. If a requirement came from convention, not from a physical constraint, it is suspect. The simplest solution that satisfies physics is the correct one.
Reduce to irreducible truths. Every layer of abstraction has a cost. Does it earn its keep? A problem that looks complex is usually a problem viewed from the wrong angle.
Force 10x thinking. Incremental improvement preserves the old architecture. A 10x target forces fundamental rethinking. If it seems impossible, the constraint model is wrong.
Conventional quantum computing assumes you need a multi-million-dollar dilution refrigerator running at millikelvin temperatures. We asked: what is the actual computation being performed, and can we do it differently?
The answer turned out to be yes. By changing the representation — how information is encoded, how operations are performed, how results are read out — the same computational work fits on a consumer GPU. It runs as classical computation — but the outputs are real, validated physics: ground-state energies and observables checked against exact references, not approximations of them. A different path to the same physics.
The hard part of a computation is often how you represent it, not the problem itself. The engine keeps several pictures of a quantum state and runs each circuit in whichever fits its structure: a dense vector — exact to 31 qubits (16 GB) on a single consumer GPU, for any circuit; a web of pairwise correlations for structured circuits at 1000+ qubits; and a symmetry-reduced packing that stores only the physically reachable states — proven on a 34-qubit particle-conserving (chemistry) circuit with ~0.9 billion states on one card, where the full vector would need 137 GB, and by design fits the densest 34-qubit chemistry sector inside a 24 GB GPU. This isn't beating complexity theory; complexity is real. It's choosing the representation where a problem's own structure does the work — the dense and packed figures above measured on a single RTX 3090, exact to floating point.
The same ground-state solver finds a molecule's energy, an atomic nucleus's energy, and — when a number is encoded as a Hamiltonian — a small factor (15 = 3×5, 21 = 3×7). Different fields, one shape of problem: find the lowest-energy state. The solver doesn't know which domain it is in, and doesn't need to.
Some circuits we don't hand-write — we let a genetic search find them. Pointed at a noise channel, the search rediscovers a small error-correcting code on its own, with no template. Early, and only for small codes so far, but real: the machine designing for the machine.
We don't claim. We measure. Every capability is validated against a ground truth that cannot be faked.
Molecular ground state energies validated against exact diagonalization — the mathematical ground truth for the Hamiltonian. No approximations, no basis-set limitations. If the engine's answer matches exact diagonalization to sub-milliHartree precision, the engine is correct. Period.
Nuclear shell-model ground states validated against exact diagonalization of the same interaction (Lanczos) — for 18O the engine agrees to 0.095 keV. The shell-model interactions themselves (USDB) are the field's experimentally-calibrated standard, so a correct solve is a physically meaningful one.
Semiprime factoring validated via gcd cross-check — the mathematical ground truth. If the engine claims two factors, multiplying them must produce the original number. An answer that doesn't survive gcd verification is not an answer.
The strongest validation: same engine, same code, different physics. The solver that finds molecular ground states also finds nuclear ground states. The period-finding that factors numbers also detects orbital resonances. Universality is proven when the engine doesn't know what domain it's working in.
These are not roadmaps. These are working, validated results.
Molecular ground-state energies by exact diagonalization — from H₂O to a real drug's active space (dexamfetamine) to a real ab-initio iron–sulfur cluster (Fe₂S₂). Validated against the exact FCI of the same Hamiltonian. The output is electronic structure: an input to discovery, not the discovery itself.
Shell-model ground states from the sd-shell (¹⁸O, ²⁰Ne) up to a 64-qubit gds-shell register (¹⁰²Sn), checked against exact Lanczos diagonalization in the USDB/SDI model space — for ¹⁸O, to 0.095 keV. The same ITP solver as the chemistry above; only the Hamiltonian changes.
Semiprime factoring at scale. Post-quantum readiness assessment. Cryptographic resilience evaluation against quantum-capable adversaries.
Portfolio construction. Resource allocation. Logistics and scheduling. Nature-inspired algorithms that find solutions gradient methods miss.
Orbital conjunction detection. Fleet tracking. Space weather correlation. Real-time mission planning support for satellite operators.
On-chain validation of quantum computation results. Decentralized verification. GPU-accelerated cryptographic operations.
A dozen nature-inspired search strategies — Grover, ant-colony, particle-swarm, grey-wolf and more — expressed as quantum circuits and benchmarked on the same graph problems. "Nature-inspired" is a framing: several recast classical heuristics in superposition.
Repetition and rotated surface codes with syndrome extraction and a Union-Find decoder — and, separately, small codes discovered by the evolutionary search above rather than hand-designed.
At its core, the engine does one thing: execute quantum circuits on consumer GPUs. Everything else — the chemistry, the nuclear physics, the factoring, the optimization — is built on top of that foundation.
Define your quantum circuit. Standard formats. The engine handles the rest — compilation, optimization, execution path selection, and validation. You focus on the problem, not the plumbing.
Vulkan compute, not CUDA — portable by design to any Vulkan GPU, not tied to one vendor's silicon. Automatic selection of the fastest execution strategy for your specific circuit. Multi-GPU when you need it. (Section 07 goes deeper on what that independence buys you.)
On-premise. Self-contained. Your quantum workloads never leave your infrastructure. No cloud dependency. No vendor lock-in. The engine is yours. The results are yours.
From a laptop GPU to a fleet of workstations. The engine scales with your hardware. More GPUs = more throughput. The architecture was designed for scale from day one.
One engine. Multiple domains. Same API. These are the patterns developers work with — the public surface of the engine.
// Create and run a 2-qubit Bell state use kq_core::circuit::ParametricCircuit; use kq_engine::qpipeline::qrun; let mut circuit = ParametricCircuit::new(2); circuit.h(0); circuit.cx(0, 1); let result = qrun(&circuit); println!("Z: {:?}", result.z); // → Z: [0.0, 0.0] (equal superposition confirmed) println!("Time: {}µs", result.time_us); // → Time: 4µs (on RTX 3090)
// Create a 3-qubit GHZ state |000⟩ + |111⟩ let mut circuit = ParametricCircuit::new(3); circuit.h(0); circuit.cx(0, 1); circuit.cx(1, 2); let result = qrun(&circuit); // Engine auto-selects the execution strategy println!("Z: {:?}", result.z); // → Z: [0.0, 0.0, 0.0] (maximally entangled)
// H₂O ground state — 14 qubits, STO-3G basis use kq_engine::itp::{ITPSolver, direct_fci}; use kq_core::molecules; let ham = molecules::h2o(); // 14 qubits // Ground truth: exact diagonalization in the particle sector let exact = direct_fci(&ham); println!("E = {:.6} Ha ({} dets)", exact.energy, exact.n_dets); // → E = -75.012647 Ha (1001 dets, 2.0 s) // → matches the PySCF FCI reference to 0.0000 mHa // // The ITP solver — ITPSolver::new(ham).run() — converges // to this same energy. Exact diagonalization is the // ground truth we validate every chemistry result against.
// Find ¹⁸O ground state — same ITP solver as chemistry use kq_nuclear::{NuclearInteraction, ShellModelHamiltonian, nuclei}; use kq_engine::itp::{ITPSolver, HamiltonianEval}; let usdb = NuclearInteraction::usdb_sd_shell(); let ham = ShellModelHamiltonian::build(&usdb, nuclei::o18()) .expect("valid interaction"); let mut solver = ITPSolver::new(ham.clone()) .with_max_steps(2000) .with_dt(0.05); let result = solver.run(); println!("¹⁸O: {:.6} MeV", result.energy); // → ¹⁸O: -9.468 MeV (rel. ¹⁶O core, USDB sd-shell) // → Δ = 0.095 keV vs exact diagonalization (Lanczos) // Same ITPSolver as the chemistry example — only the // Hamiltonian changed. One solver, two fields of physics.
// Process thousands of circuits through the optimization pipeline use kq_engine::qpipeline::QPipeline; use kq_core::qcc::OptLevel; let pipe = QPipeline::new(nq) .with_opt(OptLevel::O3); // maximum optimization // Batch: compile once, run many let results = pipe.batch_run(|p| build_circuit(p), ¶ms); // Streaming: process data as it arrives let stream = pipe.stream(data.into_iter(), |d| build_from(d)); for result in stream { process(result); } // Same API across domains: chemistry, nuclear, crypto, optimization
A discovery CLI built on the engine. It screens a real compound from the ChEMBL library the way a medicinal chemist would (classical cheminformatics — Lipinski, QED), then hands a tractable active space to the same exact solver used for H₂O. The screening is not quantum; the ground-state energy is. Honest about which part is which.
$ chem_discovery design ibuprofen
IDENTITY IBUPROFEN · CHEMBL521 · C13H18O2 · APPROVED
LIPINSKI MW 206 < 500 ✓ LogP 3.1 < 5 ✓ HBD 1 ≤ 5 ✓
HBA 1 ≤ 10 ✓ PSA 37 < 140 ✓ RotB 4 ≤ 10 ✓
VERDICT ✅ DRUG-LIKE — 0/5 violations
QED 0.82 / 1.00 (quantitative drug-likeness, "High" tier)
# Screening descriptors are classical. The quantum step is next:
# the electronic ground state, by exact diagonalization.
// Electronic ground state of a real drug molecule — the SAME solver // as the H₂O example above, only the integrals differ. use kq_core::second_quant::SQHamiltonian; use kq_engine::itp::{lanczos_fci, HamiltonianEval}; // CAS(6,6) active-space integrals (FCIDUMP from PySCF) let fc = std::fs::read_to_string("data/dexamfetamine.fcidump")?; let ham = SQHamiltonian::from_fcidump(&fc); // Lanczos exact diagonalization — ground truth, no ansatz to design let fci = lanczos_fci(&ham); let e_hf = ham.diagonal_energy(ham.hf_det()); println!("{} qubits · {} determinants", ham.n_qubits(), fci.hilbert_dim); println!("E_corr = {:.1} mHa", (fci.energy - e_hf) * 1000.0); // → 12 qubits · 924 determinants // → E_corr = -61.4 mHa (correlation energy beyond Hartree–Fock) // // The engine computes electronic structure — an INPUT to discovery // (a property a screening model consumes), not the discovery itself. // It does not invent molecules or predict clinical outcomes.
The honest interface to machine learning. One command turns a list of molecules (or nuclei) into a feature table — energies, correlation, particle number, per-orbital occupations — for a downstream QSAR / property model. The crate's own scope, verbatim: "It does not train models, it does not score clinical risk. It produces numbers; other tools make decisions."
$ kq-desc compute data/h2.fcidump data/lih.fcidump data/beh2.fcidump --out features.csv
[H2] n_qubits=4, n_electrons=2 — E_ground -1.137306 Ha, E_corr -0.020307 Ha
[LiH] n_qubits=12, n_electrons=4 — E_ground -7.891787 Ha, E_corr -0.029923 Ha
[BeH2] n_qubits=14, n_electrons=6 — E_ground -15.893848 Ha, E_corr -0.332570 Ha
✓ Wrote 3 rows to features.csv
# 24-column CSV. Selected columns for H2:
# E_HF -1.116999 E_corr -0.020307 E_ground -1.137306
# N_expectation 2.0 Sz 0.0 n_orb_0 1.973154 n_orb_1 0.026846
# Same schema for nuclei (a domain column tags each row). One trait, two sciences.
The hard end of chemistry: a transition-metal iron–sulfur cluster. These are real PySCF integrals at crystallographic Fe–S geometry — thousands of genuine two-electron terms, not a fitted toy model. The [2Fe–2S] core is the active site of ferredoxins (electron transport, nitrogen fixation) and a classic multireference stress test for quantum chemistry.
// Real ab-initio integrals: Fe–Fe 2.7 Å, Fe–S 2.2 Å (crystallographic), // STO-3G, generated by PySCF CASSCF → FCIDUMP. Same solver as before. use kq_core::second_quant::SQHamiltonian; use kq_engine::itp::lanczos_fci; let fc = std::fs::read_to_string("data/fe2s2_cas6e6o_sto-3g.fcidump")?; let ham = SQHamiltonian::from_fcidump(&fc); let fci = lanczos_fci(&ham); println!("[2Fe-2S] CAS(6,6): {} qubits, {} dets, E = {:.6} Ha", ham.n_qubits(), fci.hilbert_dim, fci.energy); // → [2Fe-2S] CAS(6,6): 12 qubits, 924 dets, E = -3286.008016 Ha // // Exact diagonalization IS the ground truth here. (A CASSCF energy // is not exact FCI, so we don't quote an accuracy delta against it — // see the Limitations section.)
// Quantum optimization on real market data use kq_program::{QProgram, portfolio}; use kq_engine::qpipeline::QPipeline; // Load 14-asset portfolio: AAPL, BTC, ETH, NVDA, TSLA, GOLD, ... let market = portfolio::load("data/market_data.json"); let program = QProgram::portfolio_optimize(&market) .with_risk_budget(0.15) .with_cardinality(5); // select 5 assets from 14 let pipe = QPipeline::new(program.n_qubits()) .with_opt(OptLevel::O3); let result = pipe.run(&program.compile()); println!("Optimal allocation: {:?}", result.z); // Returns Z expectations encoding asset selection
// Each satellite is mapped to a qubit. Its orbital phase becomes the qubit's phase. // Pairs of qubits whose altitudes are close (geometry) and whose phases // converge (timing) are flagged as candidate close approaches. use kq_core::correlation::CorrelationState; use kq_core::ParametricCircuit; let sats = load_tle(&["iridium_next", "starlink"])?; // 336 LEO objects let nq = sats.len() as u32; let mut state = CorrelationState::new(nq); let mut circuit = ParametricCircuit::new(nq); // Encode: orbital mean anomaly → qubit phase (one object, one qubit) for (i, sat) in sats.iter().enumerate() { circuit.rz(sat.mean_anomaly, i as u32); } state.execute_circuit(&circuit)?; // Score all C(N,2) pairs by altitude proximity + phase correlation let alerts = scan_conjunctions(&sats, &state); println!("{} objects → {} qubits · {} pairs scored", sats.len(), nq, nq*(nq-1)/2); // → 336 objects → 336 qubits · 56,280 pairs scored · 2.48 s (this box) // // The qubit count tracks the object count directly — 1,000+ objects fits. // Full implementation: `cargo run --release -p kq-examples --example // satellite_conjunction`. This is fast SCREENING, not operational SGP4 // collision prediction with km-precise miss distances.
The engine isn't just a tool you use — it's a platform AI agents are built to operate. Each agent is defined as a portable .md file plus skills — load it into Claude Code, Hermes, Pi, OpenAI Codex, or any system that reads markdown and follows instructions. From autonomous problem-solving loops to reinforcement learning that discovers quantum algorithms, the engine is designed for a future where AI doesn't just assist quantum computing — AI drives it.
A single .md file defines the entire autonomous workflow — problem statement, success criteria, irreducible truths, and iteration log. Any AI system (Claude Code, Hermes, Pi, OpenAI) can load this state file plus the kq-engine skill and begin working. The agent reads the problem, runs experiments against the engine, measures results, records learnings, and decides the next experiment — unsupervised, on a schedule or on demand. Define the problem. The agent works until it's solved.
# The agent reads this file on every run, works, and updates it. Problem: Discover quantum error-correcting codes without human design Success: Circuit with logical error rate below physical error rate Dead end: 200 generations without fitness improvement Run interval: every 5m Skills: kq-engine, omega-prime # Irreducible truths — the seed the agent reasons from: 1. A noise channel is the only oracle — no textbook knowledge given 2. Fitness = fidelity of encoded state after noise + decode 3. Selection pressure alone must surface the code structure # Iteration log — the agent appends after each run: | # | Time | Action | Result | Next | |---|-------|--------------------------------|---------------------|--------------------| | 0 | 14:00 | Initialize 100 random circuits | Best fitness: 0.51 | Run generation 1 | | 1 | 14:05 | Generation 50 — drift emerges | Best fitness: 0.67 | Tighten noise | | 2 | 14:10 | Gen 120 — symmetric structure | Best fitness: 0.81 | Compare to known | | 3 | 14:15 | Gen 180 — plateau | Best fitness: 0.83 | Raise noise to 2% | | 4 | 14:20 | SURPRISE: circuit beats physical | Fitness: 0.91 | Verify — is this real?| | 5 | 14:25 | Verify: logical error < physical| CONFIRMED — small code discovered | Document structure | | 6 | 14:30 | Cross-check: matches 3-qubit | Rediscovered the repetition code | Publish finding | | # The agent wasn't told what a stabilizer is. It wasn't given a code # template. It pointed a genetic search at a noise channel and let # physics do the scoring. The engine was the oracle. The agent was # the explorer. The code emerged.
The loop is self-correcting: if an approach hits a dead end, the agent pivots. If results surprise it (contradict a high-confidence belief), it flags the insight and re-examines assumptions. The state file is the memory between runs — no context window limits, no session timeout. This is the same loop that autonomously discovered error-correcting codes by pointing a genetic search at a noise channel with no template.
The kq-rl crate trains reinforcement learning agents directly against the engine — not in simulation, but on the real GPU execution path. These agents learn circuit compilation strategies, discover error-correcting codes, optimize factoring pipelines, and navigate elimination trees without being told the physics. Over 50 evolve_rl strategies tested — the agent doesn't need to understand quantum mechanics; it learns what works by interacting with the engine.
use kq_rl::{policy::QPolicy, optimizer::Adam, solver::RLSolver, objective::MinEnergy}; // QAOA ansatz for a 3-city tour → cost Hamiltonian let mut policy = QPolicy::from_circuit(ansatz); let objective = MinEnergy { hamiltonian: cost }; let mut opt = Adam::new(policy.n_params(), 0.10); // Reinforcement-style training (SPSA gradients) let solver = RLSolver::new(200); solver.train_spsa(&mut policy, &objective, &mut opt, 0.20)?; // Held-Karp (exact) cost 101.15 0→2→1→0 // QAOA + RL (p=3) cost 101.15 0→2→1→0 ← optimal tour // 9 qubits · 162 trainable params · 200 SPSA steps · 205 s
The RL surface covers what matters: RSA factoring (128-bit through 512-bit), Shor's algorithm, Kitaev phase estimation, lattice period finding, torus pipelines, residue hashing, elimination trees, elasticity laws, and nonlocal correlation. One crate, one engine, dozens of strategies — the agent adapts per domain, per circuit shape.
Some circuits aren't hand-written — a genetic search finds them. Point the engine at a noise channel and it rediscovers small error-correcting codes on its own, with no template. Point it at a cost Hamiltonian and it evolves optimization ansätze. The same pattern works for factoring circuits, decoder strategies, and state-preparation sequences. Early, and only for small codes so far, but real: the machine designing for the machine.
// The engine pointed at a noise channel — no stabilizer template given. // The genetic search rediscovers a small error-correcting code. use kq_rl::evolve::{Population, Fitness}; use kq_engine::noise::DepolarizingChannel; let noise = DepolarizingChannel::new(0.01); let mut pop = Population::random(100, n_qubits); for gen in 0..generations { for circuit in pop.individuals_mut() { let fidelity = circuit.fidelity_under_noise(&noise); circuit.set_fitness(fidelity); } pop.evolve(); // selection, crossover, mutation } // → Small error-correcting code discovered autonomously // → No textbook knowledge needed — the engine is the physics oracle
A discovery CLI that autonomously screens molecules from ChEMBL 36 (2,878,135 compounds, 4,005 approved drugs) the way a medicinal chemist would — classical cheminformatics (Lipinski rules, QED scoring) — then hands tractable active spaces to the exact solver. The screening is classical; the ground-state energy is quantum. The agent decides what to screen; the engine computes the physics. Human in the loop for decisions, not for computation.
$ chem_agent scan --target inflammation --max-molecules 500 [1/500] IBUPROFEN · CHEMBL521 · QED 0.82 · drug-like ✓ [2/500] ASPIRIN · CHEMBL25 · QED 0.81 · drug-like ✓ [3/500] INDOMETHACIN · CHEMBL6 · QED 0.78 · drug-like ✓ ... [127] CELECOXIB · CHEMBL118 · QED 0.71 · drug-like ✓ → CAS(6,6) active space ready → solving... Ground state: E = -X.XXXXXX Ha (exact FCI, 12 qubits, 924 dets, 0.8 s) ✓ 17 candidates solved · 3.2 min total · results → candidates.csv # The agent screens; the engine solves. Repeat until discovery.
The agents are defined as .md files + skills — load them into Claude Code, Hermes, Pi, OpenAI, or any system that reads markdown and executes tools. Each agent is built against the engine's specific primitives — ITPSolver, CorrelationState, QPipeline, HamiltonianEval — and understands what the engine can and cannot do. The agent knows the VRAM wall is at ~30 qubits for dense circuits. It knows correlation-field execution is sub-millisecond for 1024+ qubits. It knows which representation fits which problem. When the engine gets faster, the agents get faster. When the engine adds a domain, the agents can reason about it. The agent definitions are portable; the engine is the constant. Both evolve together.
Agents are .md files + skills — portable across Claude Code, Hermes, Pi, OpenAI, or any AI system that reads markdown. No vendor lock-in. Define once, run anywhere.
The kq-rl crate exposes the engine as a training target. QPolicy, Adam, SPSA, RLSolver — 50+ strategies trained across factoring, decoding, and optimization domains.
Genetic search over quantum circuits finds solutions human engineers didn't design. Error-correcting codes, optimization ansätze, factoring circuits — the engine is the physics oracle.
"The engine isn't just a quantum computer. It's a platform AI agents are designed to operate — and they're already doing it. Autonomous loops, RL training, evolutionary search, chemistry screening. The hardest problems don't get solved in one session. They get solved by an agent that never stops."
This is an early, experimental engine built by one person (me). Qiskit, Cirq, PennyLane, Google qsim, NVIDIA cuQuantum and the Intel Quantum SDK are mature projects with years of work and large teams behind them — I have enormous respect for them, and the numbers below are not a contest with them. They each optimise for goals I'm not chasing yet: generality, real-hardware backends, broad gate sets, production stability.
What the table shows is simply how a few engines run the same circuits on the same box. My engine takes a different approach — GPU state vectors plus structure-aware execution — which trades generality for speed on certain circuit shapes. On others it is slower, or simply not as complete. I report both. Treat these as honest measurements from an alpha research project, not benchmarks of a finished product.
Every number in this section was measured on one machine — ours — on 22 May 2026. Same box, same week, every engine: this one, Qiskit, PennyLane, Cirq, Google qsim, NVIDIA cuQuantum, and Intel's simulator. No estimates, no projections. Where a number is not ours, we say so.
| CPU | AMD Ryzen Threadripper 3970X — 32 cores / 64 threads, up to 4.8 GHz, AVX2 + FMA (Zen 2, no AVX-512) |
| RAM | 256 GB DDR4 (252 GiB usable) |
| GPU | NVIDIA GeForce RTX 3090 — 24 GB GDDR6X, ~936 GB/s, driver 580, Vulkan 1.4 |
| Stack | Linux · Rust release builds · Python 3.10 · CUDA 11.5 |
A single consumer/workstation box — not a data center. Every CPU-only simulator (Qiskit-CPU, Cirq, and Intel's IQS) ran on the AMD CPU above; every GPU result ran on the one RTX 3090. No A100, no H100, no Intel Xeon.
Identical gate-for-gate circuits in every engine. Warm median of 20 runs; each run times circuit construction + execution + readout. Heavy backends (Aer, lightning, qsim, IQS) are built once, as in real use — this engine builds its context per call, which does not favour it. Times in microseconds (µs). No engine is "better" here — they target different things; this is just the same work on the same box. Harness: benchmarks/bench_frameworks.py + bench_gates.rs.
| Framework | Backend | Bell (2q) | QFT-8 | QFT-12 | GHZ-20 | Measured |
|---|---|---|---|---|---|---|
| kq-engine | Rust · Vulkan GPU + auto-strategy | 1.6 | 85 | 246 | 73 | ✓ ours |
| Google qsim | C++ Schrödinger (qsimcirq) | 213 | 1,596 | 3,096 | 20,770 | ✓ ours |
| Qiskit Aer | CPU statevector | 756 | 3,394 | 7,515 | 9,104 | ✓ ours |
| Qiskit Aer | CUDA statevector (RTX 3090) | 1,166 | 3,957 | 7,276 | 10,901 | ✓ ours |
| PennyLane | lightning.qubit (C++) | 1,018 | 3,376 | 6,652 | 87,598 | ✓ ours |
| Cirq | pure-Python simulator | 667 | 4,337 | 8,455 | 71,383 | ✓ ours |
| NVIDIA cuQuantum | cuStateVec (CUDA, RTX 3090) | 114 | 1,487 | 3,238 | 319 | ✓ ours |
| Intel Quantum SDK | IQS full-state (CPU, MKL) | 6 | 62 | 497 | 192,651 | ✓ ours |
What these numbers mean — every engine runs the same circuit, but they are built for different things:
• Bell (2q) is overhead, not compute. A 2-qubit circuit finishes before a Python interpreter clears its throat. A compiled engine just carries less call overhead — a latency detail, not a compute result.
• QFT-12 is the closest to apples-to-apples — it is non-Clifford, so every engine does the same dense state-vector work. They land within an order of magnitude: Intel IQS 497 µs, this engine 247 µs, Google qsim 3,096 µs, cuQuantum 3,238 µs. Intel's CPU simulator is genuinely quick here.
• GHZ-20 is structured (Clifford). This engine adapts to that structure and avoids building all 2²⁰ amplitudes; the full-state simulators carry the whole vector by design. A different strategy, not a better team.
• NVIDIA cuQuantum (cuStateVec, same GPU) issues one CUDA kernel launch per gate through its low-level API; this engine fuses gates, which is most of the small-circuit difference. (Its apply_matrix wants index lists, not raw device pointers — a sharp edge worth knowing.)
• Intel IQS is fast on small and mid-size circuits. Where the picture changes is at higher qubit counts — see the scaling note just below.
• Reproduce: python3 benchmarks/bench_frameworks.py + cargo run --release -p kq-examples --example bench_gates
The single-circuit numbers above are close. The real difference shows up as you add qubits. A full-state simulator on a CPU holds the entire 2ᴺ amplitude array and sweeps all of it on every gate, so its wall-clock roughly quadruples per qubit added. Same QFT, same box, each circuit isolated:
| QFT size | Intel IQS (CPU full-state) | this engine (GPU) | How far apart |
|---|---|---|---|
| 12 qubits | 0.50 ms | 0.25 ms | ~2× |
| 15 qubits | 4.3 ms | 0.45 ms | ~10× |
| 20 qubits | 262 ms | 1.0 ms | ~260× |
| 22 qubits | 1.7 s | 1.3 ms | ~1,300× |
| 24 qubits | 7.4 s | 1.7 ms | ~4,300× |
At 24 qubits Intel's CPU simulator needs ~7 seconds; by ~28 it would be minutes, and the climb only steepens. The GPU keeps the same circuit in low milliseconds because memory bandwidth, not core count, is the bottleneck — and that is the regime this engine is built for. This is not a flaw in IQS: it is the physics of dense state vectors on a CPU, and IQS is doing exactly what a full-state simulator should. The honest limit on the other side: a GPU state vector still grows as 2ᴺ and hits the 24 GB VRAM wall around 30 qubits (a CPU with 256 GB can actually hold a larger dense state — just far too slowly to be useful). Past that wall, the only way forward for either is to stop storing all 2ᴺ amplitudes — which is what the structure-aware path does, but only for circuits that have structure to exploit. Note: this table is the engine measured on its own; the same circuits run through the Intel SDK custom backend (gate-by-gate across the FFI boundary) are benchmarked separately in the interop section below, and are slower per gate.
H₂, STO-3G, 0.735 Å — the textbook benchmark. We ran all three on this box. The exact FCI answer is −1.137306 Ha. All three reach it; the interesting part is how.
| Solver | Energy (Ha) | Error vs exact FCI | Work to converge | Method |
|---|---|---|---|---|
| kq-engine | −1.137306 | 0.0000 mHa | 345 ITP steps | Deterministic eigensolver — no ansatz, no optimizer |
| PennyLane VQE | −1.137306 | 6.2 × 10⁻⁶ mHa | 19 iterations · 2.3 s | Variational — UCCSD ansatz + gradient descent |
| Qiskit-Nature VQE | −1.137306 | 1.9 × 10⁻⁸ mHa | 97 evaluations · 0.67 s | Variational — UCCSD ansatz + COBYLA |
On a 4-qubit molecule everyone is correct — that is the point. The deterministic-vs-variational gap (no ansatz to design, no optimizer to babysit, same answer every run) is the differentiator, and it widens with system size. Reproduce: cargo run --release -p kq-examples --example bench_chemistry + python3 benchmarks/bench_chemistry_vqe.py.
| Benchmark | kq-engine result | Ground-truth check | Honest note |
|---|---|---|---|
| H₂O ground state (14 qubits) | −75.012647 Ha 1001 dets · 2.0 s |
0.0000 mHa vs PySCF FCI | Exact diagonalization on the engine. The previous figure on this page was wrong; this one is measured. |
| Drug molecule — dexamfetamine (CAS 51-64-9) | E_corr −61.4 mHa 12 q · 924 dets · exact FCI |
Lanczos = exact for this active space | Electronic structure of a real approved drug's CAS(6,6) active space. The energy is an input to discovery (a property a screening model consumes), not a clinical claim. The engine does not design molecules. |
| Fe₂S₂ [2Fe–2S] cluster — real ab-initio (CAS(6,6), 12 q) | −3286.008 Ha 924 dets · exact diagonalization |
Lanczos = exact for this active space | Real PySCF integrals at crystallographic Fe–S geometry — not a toy model. A hard multireference transition-metal cluster (ferredoxin active site). The CASSCF reference is not exact FCI, so we quote no accuracy delta against it. |
| ¹⁸O nuclear ground state (sd-shell) | −9.468 MeV (rel. ¹⁶O core) | 0.095 keV vs exact Lanczos | Unique. No mainstream quantum framework ships a nuclear shell model. Energy is in the USDB model space. |
| ²⁰Ne nuclear ground state (sd-shell) | −19.592 MeV (rel. ¹⁶O core) | 0.039 keV vs exact Lanczos | Unique. Same solver as the chemistry above — different physics, no code change. |
| ¹⁰²Sn — 64-qubit nuclear register (gds-shell) | −0.747 MeV 64 q · 496 dets · 3.4 s |
M-restricted exact solve | The register is 64 qubits; the 2-valence-neutron physics restricts the active space to 496 determinants. Structure, not raw qubit count, sets the cost — the engine's whole thesis, in nuclear form. |
| Semiprime factoring (8 → 255 bit, smooth-form) | 24 / 24 factored 179 s total · 255-bit in 0.44 s |
gcd-verified (p·q = N) | Hybrid pipeline. These semiprimes are constructed so p−1 is smooth — Pollard p−1's ideal case, which is why a 255-bit one falls in 0.44 s. Cryptographic RSA (chosen to resist p−1) is out of scope. The classical channel does the work — not gate-model Shor, not quantum advantage. (See §09.) |
Beyond single nuclei: the same solver swept 14 sd-shell nuclei (¹⁷O through ²²Na) in one run — ground-state energy, total angular momentum ⟨J²⟩, and orbital occupation each — in 27 ms to 27 s apiece as the valence space grows (a measured cost curve, not a claim). And the descriptor exporter writes molecules and nuclei into one CSV schema with a domain column: the same observable machinery on both, the "one solver, many sciences" idea reduced to a feature table an ML pipeline can read. Reproduce: cargo run --release -p kq-examples --example nuclear_experiments.
The Intel Quantum SDK ships as a Docker toolchain with a CPU full-state simulator (IQS) — it's already a row in the table above, and it's quick. The more interesting part isn't a race: this engine also plugs into the Intel SDK as a custom backend. You write an ordinary Intel quantum program, compile it with Intel's own compiler, and its gates can run on the GPU here instead of on the CPU simulator — same source, different silicon underneath, no rewrite. That's interoperability, not competition.
This engine implements the Intel Quantum SDK's exact custom-backend gate interface — the six primitives PrepZ, RXY, RZ, CPhase, SwapA, MeasZ that Intel's iqsdk::CustomInterface abstract class declares. Intel's compiler lowers any quantum program down to those primitives; the engine provides them and runs them on the GPU. It is the same derived-class pattern as the SDK's own custom_backend.cpp example — except that example backs the interface with Intel's CPU simulator, and this one backs it with a GPU. To our knowledge, that makes it the first GPU implementation of the interface.
Mechanically, the SDK drives the backend one gate at a time. Each gate call crosses a thin C FFI boundary into the Vulkan engine, where the quantum state lives on the GPU and stays there between gates — the host only reads it back at measurement. The one design choice that makes this competitive: rather than synchronizing the GPU after every gate (one host↔device round trip per gate, which dominates the wall-clock), the engine records every gate dispatch and replays the whole sequence in a single command buffer, lazily, at the next readout. That change alone is an 11–38× speedup, and it is what lets the GPU overtake a CPU full-state simulator from about 16 qubits up.
None of it is NVIDIA-specific: the backend is pure Vulkan compute with no vendor extensions, and its one matrix-acceleration path uses the cross-vendor VK_KHR_cooperative_matrix. It was validated on an RTX 3090 — the only card on hand — but by construction it should run on any modern Vulkan GPU, Intel Arc and the Data Center Flex/Max parts included. That portability is the part a CUDA-locked accelerator can't offer.
Below: a real Intel SDK program on the left, and the same program's result through the bridge — cross-checked against Intel's own CPU simulator — on the right.
#include <clang/Quantum/quintrinsics.h> qbit q[12]; quantum_kernel void qft_12() { for (int i=0; i<12; i++) PrepZ(q[i]); for (int i=0; i<12; i++) { H(q[i]); for (int j=i+1; j<12; j++) CPhase(q[i], q[j], PI/(1<<(j-i))); } } // Intel's compiler lowers H/CPhase to its // PrepZ/RXY/RZ/CPhase/MeasZ primitives — which // this engine implements and runs on the GPU.
Backend: kq-engine StateVector GPU (Vulkan) qft_12 → uniform superposition, 4096 states max P, GPU bridge = 0.000244351 max P, native IQS = 0.000244281 ideal 1/2^12 = 0.000244141 same state, different silicon. PASS GHZ peaks match native IQS to 12 decimals. // Intel program → our bridge → Vulkan GPU // → the state Intel's own CPU simulator computes.
Measured through the bridge — the same Intel program, compiled with intel-quantum-compiler, its gates executed on the GPU instead of IQS. Best-of-3 over the gate sequence, inside Intel's stock Docker image, host RTX 3090 vs single-node IQS on the same box:
| Circuit (via Intel SDK custom backend) | Intel IQS (CPU) | GPU through the bridge | How far apart |
|---|---|---|---|
| GHZ-16 | 7.0 ms | 6.9 ms | even — crossover |
| GHZ-24 | 4,008 ms | 133 ms | ~30× |
| GHZ-26 | 17,356 ms | 496 ms | ~35× |
| QFT-20 | 256 ms | 20 ms | ~13× |
Why these differ from the native scaling table above: there, the engine runs the whole circuit in one pass on its own; here, every gate crosses the Intel-SDK → FFI boundary one at a time, so the bridge path is slower than the engine's raw ceiling. These are the honest "same Intel program, different silicon" figures: native IQS wins below ~16 qubits, the two draw even at 16, and the GPU pulls ahead to 30–35× by 24–26 qubits. Correctness is exact — GHZ and QFT states match native IQS to 12 decimal places. Reproduce inside the SDK's Docker image: ./run_bench.sh.
Two Intel SDK programs from the reference repo (excerpted). The ghz_5q kernel is identical in both; the only change is which backend you register with the SDK — Intel's CPU FullStateSimulator, or this engine's GPU CustomSimulator.
#include <quantum_full_state_simulator_backend.h> quantum_kernel void ghz_5q() { for (int i=0;i<5;i++) PrepZ(q[i]); H(q[0]); CNOT(q[0],q[1]); CNOT(q[1],q[2]); CNOT(q[2],q[3]); CNOT(q[3],q[4]); } int main() { iqsdk::IqsConfig cfg; iqsdk::FullStateSimulator sim(cfg); // CPU ghz_5q(); sim.getProbabilities(qids); }
#include <quantum_custom_backend.h> quantum_kernel void ghz_5q() { // identical for (int i=0;i<5;i++) PrepZ(q[i]); H(q[0]); CNOT(q[0],q[1]); CNOT(q[1],q[2]); CNOT(q[2],q[3]); CNOT(q[3],q[4]); } int main() { auto* sim = iqsdk::CustomSimulator:: createSimulator<KqBackend>("kq-engine-gpu",N); // GPU ghz_5q(); kq->print_probabilities(); }
And the backend itself — a thin class deriving Intel's iqsdk::CustomInterface that forwards each of the six primitives across a C FFI boundary to the GPU engine. The engine lives entirely behind that boundary (libkq_intel_ffi.so); swap it for an FPGA or another vendor's silicon and the Intel-facing side never changes.
class KqBackend : public iqsdk::CustomInterface { void RXY(qbit q,double t,double p) override { ffi.rxy(h,q,t,p); } void RZ(qbit q,double a) override { ffi.rz(h,q,a); } void CPhase(qbit c,qbit t,double a) override { ffi.cphase(h,c,t,a); } void SwapA(qbit a,qbit b,double x) override { ffi.swap_a(h,a,b,x); } void PrepZ(qbit q) override { ffi.prep_z(h,q); } cbit MeasZ(qbit q) override{ return ffi.meas_z(h,q); } };
// implemented by libkq_intel_ffi.so — // the GPU engine, behind a C boundary. void kq_bridge_rxy (h,qubit,theta,phi); void kq_bridge_rz (h,qubit,angle); void kq_bridge_cphase(h,ctrl,target,angle); void kq_bridge_swap_a(h,q1,q2,angle); void kq_bridge_prep_z(h,qubit); unsigned kq_bridge_meas_z(h,qubit); unsigned kq_bridge_probabilities(h,out,max);
Reproduce — the repo builds the FFI library on the host, compiles each demo with intel-quantum-compiler inside Intel's stock Docker image, and runs it on the GPU: ./run.sh (GPU GHZ demo) · ./run_iqs.sh (native IQS) · ./run_bench.sh (the GHZ/QFT sweep above). Files: ghz_demo.cpp, ghz_demo_iqs.cpp, kq_bridge.h, bench_kq.cpp, bench_iqs.cpp.
This is not a reimplementation of Intel's tools — it is Intel's SDK calling this engine. The point is interoperability: a team can keep its Intel toolchain and, for the larger gate-dense circuits where a CPU full-state simulator slows down (the bridge benchmarks just above), offload execution to a GPU without changing their program. The bridge is pure Vulkan compute with no vendor-specific extensions — validated on an NVIDIA RTX 3090, and portable by design to other Vulkan GPUs (Intel Arc, Data Center Flex/Max) though not yet measured on them. Source: crates/kq-intel-ffi + intel-sdk/.
This is a GPU simulator — but a circuit written here doesn't have to stay here. It exports to OpenQASM (the common input language of real quantum computers) and can be sent to an actual QPU through a built-in Quantum Inspire client. The GPU is where you develop and debug fast; real hardware is one export away.
Any circuit emits OpenQASM 2.0 or 3.0. We verified the round trip: export from here → load into Qiskit (IBM's SDK, the path to IBM Quantum hardware) → run. Results match.
$ kq qrun bell --emit qasm2 OPENQASM 2.0; include "qelib1.inc"; qreg q[2]; creg c[2]; h q[0]; cx q[0],q[1];
from qiskit import QuantumCircuit qc = QuantumCircuit.from_qasm_str(qasm) # runs unchanged on Aer / IBM Quantum # Bell → {'00', '11'} ✓ # GHZ-3 → {'000', '111'} ✓ # QFT-4 → uniform 16 states ✓ # (exported here, executed in Qiskit)
A dedicated REST client transpiles circuits to cQASM v3 and submits them to Quantum Inspire backends — their emulator and real quantum processors. One call runs the whole pipeline: transpile → upload → compile for the target backend → execute → fetch results.
let client = QiClient::from_config()?; // transpile → submit → run → results let r = client.execute_kql( "h 0; cx 0 1", // circuit backend_id, // QPU or emulator 1024, // shots ).await?; if let Some(res) = r.result.results { for (state, count) in res { println!("|{}⟩: {}", state, count); } }
version 3.0 qubit[2] q bit[2] c H q[0] CNOT q[0], q[1] b = measure q // generated by the cQASM transpiler // (14 unit tests, incl. this Bell case)
Honest status: the OpenQASM round-trip is verified end-to-end on this box. The Quantum Inspire client is built and unit-tested (transpiler, auth, backend topology — 14 tests pass) with credentials configured; a live submission needs an active Quantum Inspire account token. We don't claim "we run on a QPU" — we claim the circuits are portable to one, and the bridge is built. Source: crates/kq-qi (REST client + cQASM transpiler), crates/kq-core/src/qasm.rs (OpenQASM).
The headline "1000+ qubits" is a property of the representation, not of every workload. A solver that needs full state-vector amplitudes is bounded by 2N memory; the structured representations introduced in §07 — one qubit per correlated entity, pairwise relationships stored as a tensor — are not. So the honest answer to "what runs at large qubit counts" depends on the circuit's structure. The clearest case is a problem where every object literally is a qubit.
Each satellite is encoded as one qubit; its orbital phase becomes the qubit's phase; pairs whose altitudes are close and whose phases converge are flagged as candidate close approaches. Verified end-to-end on this box (Iridium NEXT + Starlink LEO catalogues):
Loading TLE Data Iridium NEXT: 80 satellites (LEO, ~780km, 86° incl) Starlink: 256 satellites (LEO, ~550km, 53° incl) Total: 336 LEO objects Conjunction Scan: Iridium × Starlink Encoding 336 satellites → 336 qubits Pairwise correlations tracked: 56,280 (= C(336,2)) Scan complete: 2.48 s
One object, one qubit. 336 today; the structured-circuit representation runs 1024 qubits in ~4 ms (verified separately), so monitoring 1,000+ objects fits the substrate naturally — the cost then moves from "what qubit count" to "how many pairs you choose to score" (which grows as C(N,2)). Honest scope: this is a fast screening pass (altitude proximity + orbital-phase correlation), not an operational SGP4 collision predictor with km-precise miss distances and covariances. The same shape — N correlated entities, pairwise relationships matter — fits large-portfolio correlation analysis conceptually; that scaling work is open.
The other domains aren't at 1,000 qubits and shouldn't claim to be. Each solve runs at the scale the physics honestly asks for:
| Domain | Largest verified solve | What it computes | Honest scaling note |
|---|---|---|---|
| Satellite conjunction | 336 objects → 336 q · 2.48 s | Pairwise close-approach screening (alt + phase) | 1 object = 1 qubit; structured B=0; pairs grow O(N²) |
| Quantum error correction | Surface d=5 (49 q); rep d=7 (13 q) | Syndrome extraction + Union-Find decoder; threshold confirmed | Clifford-only → the Clifford-tableau path scales to 1000+ q in principle; larger distances untested |
| Optimization (TSP) | N=3 cities → 9 q (Held–Karp optimal) | QAOA + RL-trained parameters (kq-rl) | Larger-N (up to 110 q for N=22) scaffolded in the repo; not retested this session |
| Nuclear shell model | ¹⁰²Sn — 64-q register · 496 dets · 3.4 s | Ground-state energy in the gds-shell (table above) | Structure (2 valence neutrons) shrinks the active space |
| Factoring | 255-bit semiprime · 0.44 s | Hybrid classical + quantum-assisted period finding | Semiprimes are smooth-by-construction (§09); not hard RSA |
| Quantum chemistry | H₂O (14 q); Fe₂S₂ CAS(6,6) (12 q); dexamfetamine (12 q) | Exact FCI of a real ab-initio active space | Active spaces beyond ≈ 20 q have no exact reference (§09) |
| Correlation / portfolio | Ising-style ZZ model — small N today | Diversification penalty as a quantum optimization | Same pairwise-correlation pattern as the flagship; scaling work open |
The qubit number is the solver register for that workload, not a marketing peak. The "1000+ qubits" headline is honest for the satellite-style structured/correlation regime; the chemistry/nuclear/factoring numbers honestly say where today's exact solves end. We will not pretend a 1024-qubit chemistry run exists.
Two properties that aren't about speed. They're about what the engine is — where your data lives, and how far one interface bends to a new problem. Both are claims about this system alone, checkable in the source. No comparison required.
The compute path is local by construction. A proprietary drug candidate, a sensitive nuclear interaction, a private key — the engine reads it from a file on your disk, works on it in memory, and writes the answer back. There is no cloud account to create, no API key to issue, no per-shot bill to pay. For the domains where it matters most, the data that matters most never has to move.
A single self-contained binary. No cloud SDK is compiled in — none for AWS, Azure, or Google. No login, no API key, no metered per-shot billing. You run it on hardware you control, and the results stay with you.
Running a circuit and solving for a ground state are pure local computation — no network call on that path. The only networking anywhere in the project is opt-in and separate: a bridge that sends a circuit to a remote QPU if you ask it to. Off by default, the engine is air-gappable.
The GPU layer is Vulkan compute compiled to SPIR-V — an open, vendor-neutral standard, not one company's proprietary toolkit. Portable to any Vulkan GPU by design. Validated so far on NVIDIA silicon — a desktop RTX 3090 and an NVIDIA Jetson Orin (ARM, 64 GB) — with an automatic CPU fallback for machines without a GPU; AMD and Intel GPU validation is future work. The benchmark numbers in Section 06 were all measured on the RTX 3090 workstation.
No accelerator on the box? The engine falls back to a CPU path automatically — a circuit still runs, slower but real. Nothing about deployment forces a specific chip, a specific cloud, or a specific country's silicon.
The engine has a single seam for "what physics am I solving?" — one Rust trait that says how to evaluate a Hamiltonian. Implement it for your operator and the rest of the stack comes for free: the ground-state solver, exact diagonalization, the observables, the descriptor export — all unchanged. The solver code is literally invariant. The only thing that changes between a molecule, an atomic nucleus, and a cryptographic energy landscape is the Hamiltonian.
// One trait — HamiltonianEval — is the only thing each domain implements. // The solver, the diagonalizer, and the observables never change. // 1) Molecular chemistry — second-quantized Hamiltonian from a FCIDUMP file let ham = SQHamiltonian::from_fcidump(&fcidump); let e = ITPSolver::new(ham).run().energy; // 2) Nuclear shell model — a different Hamiltonian, the SAME solver let ham = ShellModelHamiltonian::build(&usdb, nucleus)?; let e = ITPSolver::new(ham).run().energy; // 3) An optimization / cryptographic energy landscape — same solver again let ham = ConstraintHamiltonian::new(constraints, n_bits, coupling); let e = ITPSolver::new(ham).run().energy; // Implement one trait and you also get exact (Lanczos) diagonalization, // the observables, and CSV descriptor export — with no change to the engine.
"Serves both molecular chemistry and nuclear shell-model workloads — the expectation-value machinery is universal; only the matrix elements of the operator differ."
That isn't a slogan added afterward — it's the engine's own internal note on how the observables work. The same ⟨J²⟩, particle-number, and orbital-occupation code that measures a molecule also measures a nucleus; the descriptor exporter writes both into one table with a domain column (Section 06). The pattern repeats one level up: the dozen pathfinding strategies in Section 03 sit behind a single find_path() call, and a circuit you write is run by a representation the engine selects for you. You describe the problem; the engine decides how to execute it.
If the substrate is really general, it should handle physics that isn't quantum at all. It does. The same project ships worked simulations of classical fields and particles, each checked against the textbook answer:
One honest caveat on "flexibility": it means a clean interface and a solver that genuinely doesn't care which science it's in — shown here across chemistry, nuclear physics, optimization, and classical field simulation. It does not mean every conceivable operator is fast or fits in memory; the VRAM limits in Section 09 still apply.
The exact code behind the numbers above. Copy-paste runnable. Two examples: a textbook Bell state (basic), and a molecular ground state for drug-discovery-grade chemistry (advanced). Our side is Rust; theirs is Python — their native language.
use kq_core::circuit::ParametricCircuit; use kq_engine::qpipeline::qrun; fn main() { let mut bell = ParametricCircuit::new(2); bell.h(0); bell.cx(0, 1); let r = qrun(&bell); // engine picks the strategy println!("⟨Z⟩ = {:?}", r.z); } // ⟨Z⟩ = [0.0, 0.0] (Bell ⇒ each qubit unbiased) // 1.6 µs — warm median of 20 runs
import pennylane as qml dev = qml.device("lightning.qubit", wires=2) @qml.qnode(dev) def bell(): qml.Hadamard(0) qml.CNOT([0, 1]) return qml.probs(wires=[0, 1]) probs = bell() print(probs) # [0.5, 0.0, 0.0, 0.5] # 1,018 µs — warm median of 20 runs
from qiskit import QuantumCircuit from qiskit_aer import AerSimulator qc = QuantumCircuit(2) qc.h(0); qc.cx(0, 1) qc.save_statevector() sim = AerSimulator(method="statevector") sv = sim.run(qc).result().get_statevector() # |00⟩,|11⟩ each 0.5 — 756 µs (CPU) / 1,166 µs (GPU)
import cirq q = cirq.LineQubit.range(2) c = cirq.Circuit( cirq.H(q[0]), cirq.CNOT(q[0], q[1]), ) sv = cirq.Simulator().simulate(c).final_state_vector # |00⟩,|11⟩ each 0.5 — 667 µs (pure Python)
The same physical problem — find the lowest-energy state of a molecule — solved two ways. We use imaginary-time propagation (a deterministic eigensolver). The market standard is VQE (a variational loop). Both reach the exact answer for H₂; the difference is how.
use kq_core::molecules; use kq_engine::itp::ITPSolver; fn main() { let ham = molecules::h2(); // H₂, STO-3G let mut s = ITPSolver::new(ham); let r = s.run(); // no ansatz, no optimizer println!("E = {:.6} Ha", r.energy); } // E = -1.137306 Ha // = exact FCI to 0.0000 mHa, same answer every run
import pennylane as qml from pennylane import numpy as np coords = np.array([[0,0,0], [0,0,1.389]]) # 0.735 Å, in bohr H, n = qml.qchem.molecular_hamiltonian( ["H", "H"], coords, basis="sto-3g") hf = qml.qchem.hf_state(2, n) s, d = qml.qchem.excitations(2, n) dev = qml.device("lightning.qubit", wires=n) @qml.qnode(dev) def cost(p): qml.AllSinglesDoubles(p, range(n), hf, s, d) return qml.expval(H) p = np.zeros(len(s) + len(d)) opt = qml.GradientDescentOptimizer(0.4) for _ in range(200): # iterate to converge p = opt.step(cost, p) // E = -1.137306 Ha — 19 iterations, 2.3 s
What the chemistry example actually shows:
• Both land on the exact FCI energy, −1.137306 Ha. On a 4-qubit molecule, correctness is table stakes — everyone gets it right.
• The difference is method. Ours is a deterministic eigensolver: no ansatz to design, no classical optimizer, identical answer every run. VQE is a variational loop — pick an ansatz, run a classical optimizer over many circuit evaluations, hope it converges. That gap widens with molecule size, where ansatz choice and optimizer behaviour start to dominate the result. Our 14-qubit H₂O number (Section 06) is where this matters.
• We measured Qiskit-Nature VQE on the same molecule too: −1.137306 Ha in 97 evaluations, 0.67 s. Also correct. Same story.
• Reproduce: cargo run --release -p kq-examples --example bench_chemistry + python3 benchmarks/bench_chemistry_vqe.py
A different style of problem: instead of running a fixed circuit, you train one. This builds a QAOA circuit for a travelling-salesman tour and lets a reinforcement-learning optimizer (SPSA + Adam) tune its parameters against the route's cost Hamiltonian — quantum optimization with a machine-learning training loop (the kq-rl crate).
use kq_rl::{policy::QPolicy, optimizer::Adam, solver::RLSolver, objective::MinEnergy}; // QAOA ansatz for a 3-city tour → cost Hamiltonian let mut policy = QPolicy::from_circuit(ansatz); let objective = MinEnergy { hamiltonian: cost }; let mut opt = Adam::new(policy.n_params(), 0.10); // reinforcement-style training (SPSA gradients) let solver = RLSolver::new(200); solver.train_spsa(&mut policy, &objective, &mut opt, 0.20)?;
Held-Karp (exact) cost 101.15 0→2→1→0
QAOA + RL (p=3) cost 101.15 0→2→1→0
gap vs exact = +0.00% ← optimal tour
9 qubits · 162 trainable params
200 SPSA steps · trained in 205 s
// valid tours: 6 / 512 (~1.7% mass).
// low-depth QAOA puts most weight on
// penalty-pushed invalid states; the
// optimum is read from the best valid
// sample, not the single top bitstring.
An honest read: at depth p=3 the QAOA distribution only places ~1.7% of its mass on valid tours, but the optimal tour is in that set and the decoder finds it — a +0.00% gap to the exact answer. This is the engine used as an ML training target: kq-rl provides QPolicy, Adam, SPSA and an RLSolver; the quantum circuit is the model. Source: crates/kq-rl + examples/travel_routing_qaoa.rs (also rl_maxcut.rs).
SpaceX shows crash footage. We show our walls. Every limitation below is a physics or engineering constraint we're working to overcome — not a permanent ceiling.
Dense circuits with deep branching have a hard ceiling at 24 GB VRAM (consumer RTX 3090) — billions of computational paths is the physical limit. Phase-only and structured circuits are not affected and scale much further. We are actively researching memory-efficient representations.
Some quantum algorithms produce exponentially many paths. For those circuits, consumer GPUs hit the VRAM wall before reaching practical qubit counts. This is true for ALL gate-model quantum simulators. Our differentiator is how far we push before hitting that wall — and what we can do with phase-only circuits that bypass it entirely.
The engine is functional and validated across multiple domains, but it is not yet a polished product. APIs may change. Documentation is sparse. Error messages are engineer-facing. Production readiness requires funding for hardening, documentation, and support infrastructure.
The actual computation runs on GPUs — not on superconducting qubits, trapped ions, or photonic processors. We do bridge to real hardware: circuits export to OpenQASM (verified to run in Qiskit) and a Quantum Inspire REST client can submit them to real QPUs (see Section 06). But that is portability, not native QPU execution — and a live Quantum Inspire run currently needs an active account token. The engine is a fast classical simulator with a hardware off-ramp, not a quantum computer.
Both multi-GPU coordination within one machine and cross-node execution exist: a worker exposes a GPU-resident processor over TCP (the fleet_server example), a client drives it with the same API as a local one, and there is a server↔client round-trip test in the suite. What's missing is hardening, not the capability — each server takes one client at a time (no multiplexing), the load-balancing strategies currently fall back to round-robin, amplitudes sent over the wire are √p approximations rather than full complex values, and nodes share no quantum state (classical communication only). It is verified process-to-process; a large multi-machine cluster is untested, not proven.
Every comparison number in Section 06 — including Intel — was measured on our single workstation (RTX 3090 + Threadripper). We have not run on an A100/H100, so we make no datacenter-GPU claims. We will not quote a vendor's marketing number as if it were ours: every figure here is something we ran. Independent reproduction on other hardware is welcome and expected — and corrections are too; this is one person's work.
The pipeline combines classical number theory with quantum-assisted period finding. The large semiprimes we report (up to 255-bit) are constructed to be smooth — each prime factor p is chosen so p−1 is built from only small primes — which is exactly the case Pollard's p−1 method cracks in well under a second (that's why a 255-bit one falls so fast). Cryptographic RSA moduli are deliberately chosen to resist p−1, and we do not factor those. So this is a multi-method cryptographic-assessment pipeline, not a gate-model Shor speedup and not a claim of quantum advantage over RSA. We say so plainly.
On 2–3 qubit circuits, wall-clock is dominated by framework call overhead, not quantum compute. Our microsecond Bell-state numbers reflect a real end-to-end latency advantage (compiled, no interpreter), but they are not a compute-throughput claim. For that, read the QFT-12 column — same work, every framework.
The molecular and cluster results are active-space energies — a drug or an Fe₂S₂ core is reduced to a tractable CAS, not the whole molecule. Within that space the engine's exact diagonalization is the ground truth, and we validate against it (or against PySCF FCI) to sub-milliHartree. We do not validate against a CASSCF energy — a CASSCF number is not exact FCI, and quoting a delta against it would be misleading. Exact diagonalization is feasible to ≈20 qubits; past that, the iterative solver runs but has no exact reference, so we report the energy without an accuracy claim.
Validate quantum workloads on your hardware. Joint performance characterization and optimization for your GPU architecture. Vulkan-based — not locked to any vendor.
Quantum simulation framework with proven nuclear shell-model accuracy. Defense, energy, and fundamental physics applications. No other quantum platform offers this capability.
Joint publications, grant applications, and fundamental quantum computing research. EU Horizon Europe and EIC Accelerator eligible. Multi-domain validation track record.
Custom quantum computing engine for your R&D team. Multiple proven domains. On-premise with full data sovereignty. Self-contained deployment — no cloud dependency.
On-chain verification of quantum computation results. GPU-accelerated cryptographic operations. Custom subnet integration for decentralized validation.
GPU-accelerated orbital mechanics and conjunction detection. Fleet tracking for satellite operators. Real-time space weather integration for mission planning.
We don't do easy. If it's been done before, hire someone cheaper. If no one knows how — let's talk.
A one-person company building several deep-tech products — fully self-funded, no outside capital. If you have the means and like backing independent builders, you can help fund the work directly — no account, no forms, just scan and send.
Voluntary support for independent R&D at Kreeate Biotech SRL. Not an investment — no equity, no return — and not tax-deductible for donors.