UNPKG

quaco.js

Version:

A lightweight modular Quantum Computing Simulator in JavaScript. Supports qubits, quantum gates, entanglement, circuits, algorithms, and visualization.

57 lines (48 loc) 1.96 kB
// src/Algorithms/DeutschJozsa.js import { Simulator } from '../Simulator.js'; import { QuantumGate } from '../QuantumGate.js'; /** * Deutsch-Jozsa Algorithm Simulator */ export class DeutschJozsa { /** * Runs the Deutsch-Jozsa algorithm. * @param {number} numInputQubits - number of input qubits * @param {'constant'|'balanced'} oracleType - type of oracle function * @returns {string} 'constant' or 'balanced' prediction */ static run(numInputQubits, oracleType = 'balanced') { const sim = new Simulator(numInputQubits + 1); // Step 1: Prepare input qubits |0...0⟩ and output qubit |1⟩ sim.addGate(QuantumGate.x(), numInputQubits); // Flip last qubit to |1⟩ // Step 2: Hadamard on all qubits for (let i = 0; i <= numInputQubits; i++) { sim.addGate(QuantumGate.hadamard(), i); } // Step 3: Apply oracle if (oracleType === 'constant') { // Do nothing for constant 0 // (or flip all for constant 1) } else if (oracleType === 'balanced') { // For simulation, apply CNOT from each input qubit to output for (let i = 0; i < numInputQubits; i++) { sim.addCNOT(i, numInputQubits); } } else { throw new Error('Unsupported oracle type'); } // Step 4: Hadamard again on input qubits (not output) for (let i = 0; i < numInputQubits; i++) { sim.addGate(QuantumGate.hadamard(), i); } // Step 5: Measurement const results = sim.run(1); // Single shot is enough const measuredInput = results.slice(0, numInputQubits); // Ignore last qubit // Step 6: Analyze if (measuredInput === '0'.repeat(numInputQubits)) { return 'constant'; } else { return 'balanced'; } } }