A modern TypeScript library for quantum computing simulations
npm install @q5m/q5m


A complete type-safe TypeScript library for quantum computing simulations with comprehensive algorithm support, and seamless multi-framework integration.
- ๐ TypeScript First - Complete type safety with strict mode, 90%+ test coverage
- ๐ฌ Advanced Quantum Simulation - Complete quantum computing primitives with state-of-the-art optimization
- ๐ง Flexible APIs - Multiple entry points and API styles for different use cases
- โก Modern Tooling - Built with Vite, esbuild, Jest, and Cypress for optimal DX
- ๐งช Well Tested - 2000+ comprehensive tests across unit, integration, and E2E scenarios
- ๐ Multi-Framework - Native support for React, Vue, Angular, and vanilla JavaScript
- ๐ฒ Algorithm Library - Built-in quantum algorithms with optimized implementations
- ๐ Rich Visualization - Circuit diagrams, state visualization, and export capabilities
- ๐ Extensible Architecture - Plugin system for custom extensions and integrations
- ๐ High Performance - Hybrid sparse/dense quantum states with CSR format, up to 45% performance improvement
- ๐ฏ Memory Optimized - Intelligent state representation switching, 28% memory reduction for large systems
``bash`
npm install q5m
`typescript
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());
`
`typescript
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:
`typescript`
import { Circuit, QubitState } from 'q5m/core';
// Only core quantum circuit and state functionality
`typescript`
import {
Circuit,
groverSearch,
quantumFourierTransform,
exportToQiskit
} from 'q5m';
`html`
#### React Integration
`tsx
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 (
{circuit.toString()}Probabilities: {JSON.stringify(circuit.execute().state.probabilities())}
๐ฌ Core Concepts
$3
Central abstraction for building and executing quantum computations:`typescript
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);
`$3
Advanced state representation with automatic optimization:`typescript
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);
`๐ฒ Built-in Quantum Algorithms
$3
`typescript
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);
`$3
`typescript
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());
`$3
`typescript
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);
`๐ Export & Integration
$3
`typescript
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);
`๐ Performance Features
$3
`typescript
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');
`$3
`typescript
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);
`๐จ Visualization
$3
`typescript
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());
}
`๐ API Reference
$3
- Circuit - Main quantum circuit builder and executor
- QubitState - Quantum state with automatic optimization
- Q5mState - Base quantum state abstraction
- Gate Classes - Individual quantum gate implementations$3
- groverSearch - Grover's quantum search algorithm
- quantumFourierTransform - QFT implementation
- quantumPhaseEstimation - Phase estimation algorithm
- amplitudeAmplification - Generalized amplitude amplification$3
- complex - Complex number operations
- createUnitary - Unitary matrix construction
- matXvec - Optimized matrix-vector multiplication$3
- exportToQiskit - Generate Qiskit Python code
- exportToOpenQASM - Generate OpenQASM 2.0 code
- exportToCirq - Generate Google Cirq code๐ง Configuration
$3
q5m.js is built with strict TypeScript for maximum type safety:`json
{
"compilerOptions": {
"strict": true,
"exactOptionalPropertyTypes": true,
"noUncheckedIndexedAccess": true
}
}
`$3
- ES2022 - Modern JavaScript features
- Node.js 18+ - Server-side compatibility
- Modern browsers - Chrome 91+, Firefox 90+, Safari 14+๐งช Development & Testing
$3
`bash
Unit tests
npm testIntegration tests
npm run test:integrationE2E tests across frameworks
npm run test:e2eCoverage report
npm run test:coverage
`$3
`bash
Basic performance tests
npm run benchmarkDetailed performance analysis
npm run profileMemory usage analysis
npm run test:memory
`๐ Performance Characteristics
$3
- Small circuits (2-5 qubits): ~0.1ms execution time
- Medium circuits (10-15 qubits): ~10ms execution time
- Large sparse circuits (20+ qubits): ~100ms execution time
- Memory usage: 40-60% reduction vs dense representation for sparse states$3
- Automatic sparse/dense state switching
- CSR (Compressed Sparse Row) format for very sparse states
- Optimized complex number operations
- TypedArray usage for memory efficiency
- SIMD-friendly algorithms where possible๐ค Contributing
We welcome contributions! This project follows strict code quality standards and comprehensive testing practices.
$3
`bash
git clone https://github.com/openql-org/q5mjs.git
cd q5mjs
npm install
npm run dev
`$3
- TypeScript: Strict mode enabled with zero any` typesFor complete contributing guidelines, see CONTRIBUTING.md which covers:
- Development setup and workflow
- Coding standards and type safety requirements
- Testing guidelines and coverage requirements
- Commit message format and pull request process
- Documentation standards and API guidelines
MIT License - see LICENSE for details.
- Getting Started - Quick start guide and tutorials
- API Documentation - Complete API reference
- Contributing Guidelines - Development workflow and standards
- GitHub Repository - Source code and issues
- npm Package - Package on npm registry
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