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
JavaScript
// 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';
}
}
}