๐ JavaScript SDK v2.1.0
์น ๋ธ๋ผ์ฐ์ ์ Node.js์์ ์คํ ๊ฐ๋ฅํ ์์ ์ปดํจํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ
๐ ๋ธ๋ผ์ฐ์ ์ง์
๋ณ๋ ์ค์น ์์ด ์น์์ ๋ฐ๋ก ์คํ
โก ๋น ๋ฅธ ํ๋กํ ํ์ดํ
์ค์๊ฐ ํ๋ก ์๊ฐํ์ ๋๋ฒ๊น
๐ฆ NPM ํจํค์ง
Node.js, React, Vue.js ์๋ฒฝ ํธํ
๐ ๋น๋๊ธฐ ์ฒ๋ฆฌ
Promise/async-await ์ง์
์ค์น
NPM (Node.js)
npm install @cqmdesk/quantum-sdk
Yarn
yarn add @cqmdesk/quantum-sdk
๋ธ๋ผ์ฐ์ (CDN)
<script src="https://cdn.cqmdesk.com/sdk/cqm-quantum-v2.1.0.min.js"></script>
๋น ๋ฅธ ์์
Node.js / ES6 Modules
JavaScriptconst { QuantumCircuit, Simulator } = require('@cqmdesk/quantum-sdk');
// 2ํ๋นํธ Bell ์ํ ์์ฑ
const qc = new QuantumCircuit(2);
qc.h(0); // Hadamard gate on qubit 0
qc.cx(0, 1); // CNOT gate (control: 0, target: 1)
qc.measureAll();
// ์๋ฎฌ๋ ์ดํฐ ์คํ
const sim = new Simulator();
const result = await sim.run(qc, { shots: 1000 });
console.log(result.getCounts());
// Output: { '00': 502, '11': 498 }
๋ธ๋ผ์ฐ์ (CDN)
HTML<!DOCTYPE html>
<html>
<head>
<script src="https://cdn.cqmdesk.com/sdk/cqm-quantum-v2.1.0.min.js"></script>
</head>
<body>
<div id="result"></div>
<script>
const { QuantumCircuit, Simulator } = CQM;
async function runQuantum() {
const qc = new QuantumCircuit(3);
qc.h(0);
qc.h(1);
qc.h(2);
qc.measureAll();
const sim = new Simulator();
const result = await sim.run(qc, { shots: 1024 });
document.getElementById('result').innerHTML =
JSON.stringify(result.getCounts(), null, 2);
}
runQuantum();
</script>
</body>
</html>
์ฃผ์ ๊ธฐ๋ฅ
1. ์์ ํ๋ก ์์ฑ
JavaScriptconst qc = new QuantumCircuit(4); // 4ํ๋นํธ ํ๋ก
// ๊ธฐ๋ณธ ๊ฒ์ดํธ
qc.h(0); // Hadamard
qc.x(1); // Pauli-X (NOT)
qc.y(2); // Pauli-Y
qc.z(3); // Pauli-Z
// ํ์ ๊ฒ์ดํธ
qc.rx(Math.PI / 4, 0); // X์ถ ํ์
qc.ry(Math.PI / 2, 1); // Y์ถ ํ์
qc.rz(Math.PI, 2); // Z์ถ ํ์
// ์ ์ด ๊ฒ์ดํธ
qc.cx(0, 1); // CNOT
qc.cz(1, 2); // Controlled-Z
qc.ccx(0, 1, 2); // Toffoli (CCX)
// ๊ธฐํ
qc.swap(0, 1); // SWAP
qc.measure(0, 0); // ์ธก์
2. ์๋ฎฌ๋ ์ด์ ์คํ
JavaScriptconst sim = new Simulator();
// ๊ธฐ๋ณธ ์คํ
const result = await sim.run(qc, { shots: 1000 });
// ๊ณ ๊ธ ์ต์
const result = await sim.run(qc, {
shots: 10000,
backend: 'statevector', // 'statevector' ๋๋ 'qasm'
optimization: 2, // ์ต์ ํ ๋ ๋ฒจ (0-3)
seed: 42 // ๋์ ์๋
});
// ๊ฒฐ๊ณผ ํ์ธ
console.log(result.getCounts()); // { '00': 502, '11': 498 }
console.log(result.getStatevector()); // [0.707, 0, 0, 0.707]
console.log(result.getProbabilities()); // [0.5, 0, 0, 0.5]
3. React ํตํฉ ์์
Reactimport React, { useState, useEffect } from 'react';
import { QuantumCircuit, Simulator } from '@cqmdesk/quantum-sdk';
function QuantumApp() {
const [result, setResult] = useState(null);
const [loading, setLoading] = useState(false);
const runCircuit = async () => {
setLoading(true);
const qc = new QuantumCircuit(2);
qc.h(0);
qc.cx(0, 1);
qc.measureAll();
const sim = new Simulator();
const res = await sim.run(qc, { shots: 1000 });
setResult(res.getCounts());
setLoading(false);
};
return (
<div>
<button onClick={runCircuit} disabled={loading}>
{loading ? 'Running...' : 'Run Quantum Circuit'}
</button>
{result && (
<pre>{JSON.stringify(result, null, 2)}</pre>
)}
</div>
);
}
export default QuantumApp;
API ๋ ํผ๋ฐ์ค
QuantumCircuit
| ๋ฉ์๋ | ์ค๋ช | ์์ |
|---|---|---|
h(qubit) |
Hadamard ๊ฒ์ดํธ | qc.h(0) |
x(qubit) |
Pauli-X ๊ฒ์ดํธ | qc.x(1) |
cx(control, target) |
CNOT ๊ฒ์ดํธ | qc.cx(0, 1) |
rx(angle, qubit) |
X์ถ ํ์ | qc.rx(Math.PI/4, 0) |
measure(qubit, cbit) |
๋จ์ผ ํ๋นํธ ์ธก์ | qc.measure(0, 0) |
measureAll() |
์ ์ฒด ํ๋นํธ ์ธก์ | qc.measureAll() |
Simulator
| ๋ฉ์๋ | ์ค๋ช | ๋ฐํ๊ฐ |
|---|---|---|
run(circuit, options) |
ํ๋ก ์คํ | Promise<Result> |
getBackends() |
์ฌ์ฉ ๊ฐ๋ฅํ ๋ฐฑ์๋ ๋ชฉ๋ก | Array<string> |
Result
| ๋ฉ์๋ | ์ค๋ช | ๋ฐํ๊ฐ |
|---|---|---|
getCounts() |
์ธก์ ๊ฒฐ๊ณผ ์นด์ดํธ | Object |
getStatevector() |
์ํ ๋ฒกํฐ | Array<Complex> |
getProbabilities() |
ํ๋ฅ ๋ถํฌ | Array<number> |
๊ณ ๊ธ ์์
์์ ํธ๋ฆฌ์ ๋ณํ (QFT)
JavaScriptfunction qft(qc, qubits) {
const n = qubits.length;
for (let i = 0; i < n; i++) {
qc.h(qubits[i]);
for (let j = i + 1; j < n; j++) {
const angle = Math.PI / Math.pow(2, j - i);
qc.cp(angle, qubits[j], qubits[i]);
}
}
// Swap qubits
for (let i = 0; i < Math.floor(n / 2); i++) {
qc.swap(qubits[i], qubits[n - i - 1]);
}
}
// ์ฌ์ฉ ์์
const qc = new QuantumCircuit(4);
qft(qc, [0, 1, 2, 3]);
qc.measureAll();
Grover ์๊ณ ๋ฆฌ์ฆ
JavaScriptfunction groverSearch(n, oracle) {
const qc = new QuantumCircuit(n);
// ์ด๊ธฐํ: ๊ท ๋ฑ ์ค์ฒฉ
for (let i = 0; i < n; i++) {
qc.h(i);
}
// Grover ๋ฐ๋ณต
const iterations = Math.floor(Math.PI / 4 * Math.sqrt(Math.pow(2, n)));
for (let iter = 0; iter < iterations; iter++) {
// Oracle
oracle(qc);
// Diffusion
for (let i = 0; i < n; i++) qc.h(i);
for (let i = 0; i < n; i++) qc.x(i);
qc.h(n - 1);
qc.mcx([...Array(n-1).keys()], n - 1);
qc.h(n - 1);
for (let i = 0; i < n; i++) qc.x(i);
for (let i = 0; i < n; i++) qc.h(i);
}
qc.measureAll();
return qc;
}
// Oracle ์์ : '11' ์ฐพ๊ธฐ
function oracle(qc) {
qc.cz(0, 1);
}
const qc = groverSearch(2, oracle);
const sim = new Simulator();
const result = await sim.run(qc, { shots: 1000 });
console.log(result.getCounts()); // '11'์ด ๋์ ํ๋ฅ ๋ก ๋ํ๋จ
๐ก Pro Tip: TypeScript ํ์
์ ์๊ฐ ํฌํจ๋์ด ์์ด ์๋์์ฑ๊ณผ ํ์
์ฒดํน์ ์ง์ํฉ๋๋ค.
โ ๏ธ ์ฃผ์: ๋ธ๋ผ์ฐ์ ํ๊ฒฝ์์๋ ํ๋นํธ ์๊ฐ 20๊ฐ๋ฅผ ์ด๊ณผํ๋ฉด ์ฑ๋ฅ ์ ํ๊ฐ ๋ฐ์ํ ์ ์์ต๋๋ค. ๋๊ท๋ชจ ์๋ฎฌ๋ ์ด์
์ Node.js ํ๊ฒฝ์ ๊ถ์ฅํฉ๋๋ค.
์ฑ๋ฅ ์ต์ ํ
JavaScript// Web Worker ์ฌ์ฉ (๋ฌด๊ฑฐ์ด ์ฐ์ฐ์ ๋ฐฑ๊ทธ๋ผ์ด๋์์ ์คํ)
const worker = new Worker('/quantum-worker.js');
worker.postMessage({
circuit: qc.toJSON(),
shots: 10000
});
worker.onmessage = (e) => {
console.log('Result:', e.data.result);
};
๋ฌธ์ ๋ฐ ์ง์
- ๐ ๋ฌธ์: docs.cqmdesk.com/sdk/javascript
- ๐ฌ Discord: discord.gg/cqmdesk
- ๐ ์ด์: GitHub Issues
- ๐ง ์ด๋ฉ์ผ: sdk@cqmdesk.com