๐Ÿ’› 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);
};

๋ฌธ์˜ ๋ฐ ์ง€์›