A high-performance quantum circuit simulator specifically designed for multiplication operations using the Cuccaro adder algorithm. This simulator features memory-aware allocation, basis-state tracking for fast measurement, and comprehensive circuit analysis capabilities.
- High-Performance Simulation: Vectorized quantum gate operations for optimal performance
- Memory Management: Early warning system for large state vector allocations
- Basis-State Tracking: O(1) measurement complexity for basis-preserving circuits
- Cuccaro Adder: Efficient quantum addition using MAJ/UMA operations
- Dual Metrics Modes: Fast logical metrics (default) or detailed decomposition analysis
- Interactive CLI: Command-line tool with demo mode and flexible options
- QASM Export: Generate OpenQASM 2.0 code for quantum hardware deployment
- MCX Decomposition: Offline Barenco decomposition for multi-controlled X gates
- Topology Awareness: Robust circuit depth estimation with bounds checking
- Error Handling: Clear error messages and input validation
git clone https://github.com/scheitelpunk/Quantum_multiplier.git
cd Quantum_multiplier
pip install -e .git clone https://github.com/scheitelpunk/Quantum_multiplier.git
cd Quantum_multiplier
pip install -e .[dev]# Basic multiplication (fast, logical metrics only)
quantum-multiply 7 8
# Run demonstration with test cases
quantum-multiply --demo
# With detailed decomposition metrics (slower)
quantum-multiply 15 16 --metrics-mode decompose
# Export QASM circuits
quantum-multiply 3 5 --export-qasm
# Custom memory threshold
quantum-multiply 9 9 --warn-memory-gb 4.0from quantum_multiplier import QuantumMultiplier
# Initialize the multiplier
qm = QuantumMultiplier(max_qubits=64, warn_memory_gb=8.0)
# Perform multiplication (default: fast logical metrics)
result = qm.multiply(7, 8) # or metrics_mode="logical"
# For detailed physical circuit analysis (slower)
# result = qm.multiply(7, 8, metrics_mode="decompose")
print(f"Result: {result['quantum_result']}")
print(f"Execution time: {result['execution_time_ms']:.3f}ms")
print(f"Physical qubits required: {result['physical_qubits']}")The quantum multiplier implements the shift-and-add multiplication algorithm using:
- Cuccaro Adder: An efficient reversible adder using MAJ (majority) and UMA (unmajority) operations
- Controlled Operations: Each addition is controlled by bits of the second multiplicand
- Clean Initialization: State preparation using only X gates (no direct state vector manipulation)
- Basis Tracking: Computational basis state tracking for fast measurement without state vector scanning
For multiplying n-bit numbers A and B:
- Input registers: A (n qubits), B (n qubits)
- Result register: 2n qubits to store A×B
- Auxiliary qubits: 1 carry qubit + virtual ancillas for MCX decomposition
- Gate operations: O(n²) where n is the bit width
- Memory allocation: O(2^(2n+1)) for the state vector
- Measurement: O(1) due to basis-state tracking
- Logical qubits: 2n + 1 (for n-bit multiplication)
- Physical qubits: Depends on MCX decomposition (typically 2n + 1 + O(n) ancillas for Barenco decomposition)
Main class for performing quantum multiplication.
class QuantumMultiplier:
def __init__(self, max_qubits: int = 64, topology: Optional[Topology] = None, warn_memory_gb: float = 8.0)
def multiply(self, a: int, b: int, metrics_mode: str = "decompose") -> Dict[str, Any]Parameters:
max_qubits: Maximum number of qubits allowedtopology: Hardware topology for depth estimation (optional)warn_memory_gb: Memory threshold for allocation warnings
Returns:
quantum_result: The computed productclassical_result: Classical verificationn_qubits: Number of logical qubits usedphysical_qubits: Number of physical qubits (including ancillas)execution_time_ms: Runtime in millisecondsmetrics: Detailed circuit metricsexport: QASM circuit representations
Low-level quantum circuit simulator.
class QuantumSimulator:
def X(self, t: int) # Pauli-X gate
def CX(self, c: int, t: int) # Controlled-X gate
def CCX(self, a: int, b: int, t: int) # Toffoli gate
def MCX(self, ctrls: List[int], tgt: int) # Multi-controlled X
def SWAP(self, u: int, v: int) # Swap gateDefine custom hardware topologies for realistic depth estimation:
from quantum_multiplier import Topology
# Linear topology
linear = Topology(n_qubits=10, edges=[(i, i+1) for i in range(9)])
# Grid topology
grid = Topology(n_qubits=16, edges=[...]) # Define 4x4 grid connections
qm = QuantumMultiplier(topology=grid)from quantum_multiplier import QuantumMultiplier
qm = QuantumMultiplier()
# Multiply two positive integers
result = qm.multiply(12, 15)
print(f"12 × 15 = {result['quantum_result']}")
# Handle negative numbers
result = qm.multiply(-7, 8)
print(f"-7 × 8 = {result['quantum_result']}")# Quick demonstration
quantum-multiply --demo
# Basic usage (fast)
quantum-multiply 7 8
# With all options
quantum-multiply 7 8 \
--metrics-mode decompose \
--max-qubits 128 \
--warn-memory-gb 16.0 \
--export-qasm
# Get help
quantum-multiply --help# Fast analysis (default)
result = qm.multiply(7, 8) # uses metrics_mode="logical"
# Detailed analysis (slower)
result = qm.multiply(7, 8, metrics_mode="decompose")
# Logical circuit metrics
logical = result["metrics"]["logical"]
print(f"Logical gates: {logical['gate_counts']}")
print(f"Circuit depth: {logical['depth']}")
# Physical circuit metrics (after MCX decomposition)
physical = result["metrics"]["decomposed"]
print(f"Physical gates: {physical['gate_counts']}")
print(f"Peak ancilla usage: {physical['peak_virtual_ancillas']}")result = qm.multiply(3, 5)
# Export logical circuit
with open("multiply_3x5.qasm", "w") as f:
f.write(result["export"]["qasm_logical"])
# Export decomposed circuit (if available)
if result["export"]["qasm_decomposed"]:
with open("multiply_3x5_physical.qasm", "w") as f:
f.write(result["export"]["qasm_decomposed"])Run the test suite:
pytestWith coverage:
pytest --cov=quantum_multiplier --cov-report=html- Memory Management: Monitor the memory warning threshold for large multiplications
- Metrics Mode: Use
metrics_mode="logical"(default) for faster execution when physical metrics aren't needed - Demo Mode: Use
quantum-multiply --demofor quick testing without specifying numbers - Topology: Provide realistic topology information for accurate depth estimation, or None for faster execution
- Bit Width: Consider the exponential scaling - 20+ bit multiplications require significant memory
- Error Handling: The simulator provides clear ValueError messages instead of cryptic assertions
- Fork the repository
- Create a feature branch (
git checkout -b feature/amazing-feature) - Commit your changes (
git commit -m 'Add amazing feature') - Push to the branch (
git push origin feature/amazing-feature) - Open a Pull Request
pip install -e .[dev]
pre-commit installThis project uses:
- Black for code formatting
- isort for import sorting
- flake8 for linting
- mypy for type checking
Run all checks:
black quantum_multiplier tests
isort quantum_multiplier tests
flake8 quantum_multiplier tests
mypy quantum_multiplierThis project is licensed under the MIT License - see the LICENSE file for details.
If you use this software in your research, please cite:
@software{quantum_multiplier,
title={Quantum Multiplier: High-Performance Quantum Circuit Simulation for Multiplication},
author={Michael Neuberger},
organization={Versino PsiOmega GmbH},
year={2025},
url={https://github.com/scheitelpunk/Quantum_multiplier}
}- Based on the Cuccaro adder algorithm for efficient quantum addition
- Implements Barenco et al. decomposition for multi-controlled gates
- Inspired by various quantum computing frameworks and simulators
- GPU acceleration support
- Distributed simulation capabilities
- Additional arithmetic operations (division, modular arithmetic)
- Noise model support
- Quantum hardware backend integration
- Graphical circuit visualization