A complete type-safe TypeScript library for quantum computing simulations with comprehensive algorithm support, and seamless multi-framework integration.
npm install q5m
import { Circuit } from 'q5m';
// Create a 2-qubit Bell state
const circuit = new Circuit(2);
circuit.h(0).cnot(0, 1);
const result = circuit.execute();
console.log('Bell state probabilities:', result.state.probabilities());
import { Circuit, QubitState, complex } from 'q5m';
// Create custom initial state
const customState = new QubitState(2, [
complex(0.5, 0), // |00⟩
complex(0, 0.5), // |01⟩
complex(0.5, 0), // |10⟩
complex(0, -0.5) // |11⟩
]);
const circuit = new Circuit(2);
circuit.h(0).measure(0);
const result = circuit.run(customState);
if( result.hasMeasurements ) {
for ( const m of result.measurements ){
console.log('Measurement results: [', m.measureIndex,'] ', m.outcome, '[', m.probability , '%]');
console.log('After state vector:', m.collapsedState.stateVector);
}
} else {
console.log('After state vector:', result.state.stateVector);
}
q5m.js provides optimized entry points for different use cases:
Minimal bundle (~65KB) - Essential quantum computing primitives
import { Circuit, QubitState } from 'q5m/core';
// Only core quantum circuit and state functionality
Complete library (~195KB) - All features including algorithms
import {
Circuit,
groverSearch,
quantumFourierTransform,
exportToQiskit
} from 'q5m';
UMD build for direct browser usage
<script src="https://unpkg.com/q5m/dist/q5m.min.js"></script>
<script>
const circuit = new Q5M.Circuit(3);
circuit.h(0).cnot(0, 1).cnot(1, 2);
console.log(circuit.execute().state.probabilities());
</script>
import React, { useState } from 'react';
import { Circuit, CircuitRenderer } from 'q5m';
function QuantumApp() {
const [circuit] = useState(() => {
const c = new Circuit(2);
return c.h(0).cnot(0, 1);
});
return (
<div>
<h1>Bell State Circuit</h1>
<pre>{circuit.toString()}</pre>
<p>Probabilities: {JSON.stringify(circuit.execute().state.probabilities())}</p>
</div>
);
}
Central abstraction for building and executing quantum computations:
import { Circuit } from 'q5m';
// Create circuit with specified number of qubits
const circuit = new Circuit(3);
// Fluent API for gate composition
circuit
.h(0) // Hadamard gate on qubit 0
.cnot(0, 1) // CNOT from qubit 0 to 1
.rz(Math.PI / 4, 2) // Z rotation on qubit 2
.measure([0, 1, 2]); // Measure all qubits
// Execute and get results
const result = circuit.execute();
console.log('Final state:', result.amplitudes());
console.log('Measurements:', result.measurements);
Advanced state representation with automatic optimization:
import { QubitState, complex } from 'q5m';
// Automatic sparse/dense optimization
const state = new QubitState(10); // 10-qubit state
console.log('Memory usage:', state.memoryUsage(), 'bytes');
// Access individual amplitudes efficiently
const amplitude = state.amplitude(0b1010101010);
console.log('Amplitude for |1010101010⟩:', amplitude.toString());
// State operations
const prob = state.probability(0b0000000000);
console.log('Probability of |0000000000⟩:', prob);
import { groverSearch, groverSearchForItem } from 'q5m';
// Search for specific bit pattern
const result = groverSearchForItem(4, '1010'); // 4 qubits, search for |1010⟩
console.log('Found item with probability:', result.probability(0b1010));
// Custom oracle search
const oracle = (bitString: string) => bitString === '1100';
const searchResult = groverSearch(4, oracle);
import { quantumFourierTransform, qftEncode } from 'q5m';
// Apply QFT to encode classical data
const data = [1, 2, 3, 4];
const qftCircuit = qftEncode(data);
const result = qftCircuit.execute();
console.log('QFT encoded state:', result.amplitudes());
import { quantumPhaseEstimation, estimateEigenstatePhase } from 'q5m';
// Estimate phase of a unitary operator
const unitary = [
[complex(Math.cos(0.3), 0), complex(-Math.sin(0.3), 0)],
[complex(Math.sin(0.3), 0), complex(Math.cos(0.3), 0)]
];
const phase = estimateEigenstatePhase(unitary, [complex(1, 0), complex(0, 0)], 4);
console.log('Estimated phase:', phase);
import { exportToQiskit, exportToOpenQASM, exportToCirq } from 'q5m';
const circuit = new Circuit(2);
circuit.h(0).cnot(0, 1);
// Export to various formats
const qiskitCode = exportToQiskit(circuit);
const qasmCode = exportToOpenQASM(circuit);
const cirqCode = exportToCirq(circuit);
console.log('Qiskit:\n', qiskitCode);
console.log('OpenQASM:\n', qasmCode);
console.log('Cirq:\n', cirqCode);
import { Circuit, QubitState } from 'q5m';
// Automatic sparse optimization for large systems
const largeCircuit = new Circuit(20); // 20 qubits
largeCircuit.h(0); // Most amplitudes remain zero
const state = largeCircuit.execute();
console.log('Representation:', state.isDense ? 'Dense' : 'Sparse');
console.log('Memory usage:', state.memoryUsage(), 'bytes');
import { Circuit } from 'q5m';
// Built-in performance tracking
const startTime = performance.now();
const circuit = new Circuit(15);
// Build complex circuit
for (let i = 0; i < 10; i++) {
circuit.h(i % 15).cnot(i % 15, (i + 1) % 15);
}
const result = circuit.execute();
const endTime = performance.now();
console.log(`Execution time: ${endTime - startTime}ms`);
console.log('Final state sparsity:', result.sparsity);
import { Circuit, CircuitRenderer } from 'q5m';
const circuit = new Circuit(3);
circuit.h(0).cnot(0, 1).cnot(1, 2);
// ASCII representation
console.log(circuit.toString());
// Rich visualization (if available)
if (typeof window !== 'undefined') {
const renderer = new CircuitRenderer(circuit);
document.body.appendChild(renderer.toSVG());
}
Circuit
- Main quantum circuit builder and executorQubitState
- Quantum state with automatic optimizationQ5mState
- Base quantum state abstractiongroverSearch
- Grover's quantum search algorithmquantumFourierTransform
- QFT implementationquantumPhaseEstimation
- Phase estimation algorithmamplitudeAmplification
- Generalized amplitude amplificationcomplex
- Complex number operationscreateUnitary
- Unitary matrix constructionmatXvec
- Optimized matrix-vector multiplicationexportToQiskit
- Generate Qiskit Python codeexportToOpenQASM
- Generate OpenQASM 2.0 codeexportToCirq
- Generate Google Cirq codeq5m.js is built with strict TypeScript for maximum type safety:
{
"compilerOptions": {
"strict": true,
"exactOptionalPropertyTypes": true,
"noUncheckedIndexedAccess": true
}
}
# Unit tests
npm test
# Integration tests
npm run test:integration
# E2E tests across frameworks
npm run test:e2e
# Coverage report
npm run test:coverage
# Basic performance tests
npm run benchmark
# Detailed performance analysis
npm run profile
# Memory usage analysis
npm run test:memory
We welcome contributions! This project follows strict code quality standards and comprehensive testing practices.
git clone https://github.com/openql-org/q5mjs.git
cd q5mjs
npm install
npm run dev
any
typesFor complete contributing guidelines, see CONTRIBUTING.md which covers:
MIT License - see LICENSE for details.
Built with inspiration from the quantum computing community and leveraging modern web technologies for optimal performance and developer experience.
q5m.js - Making quantum computing accessible through elegant TypeScript APIs