๐Ÿฆ€ Rust SDK v0.9.2

์•ˆ์ „ํ•˜๊ณ  ๋น ๋ฅธ ์–‘์ž ์ปดํ“จํŒ… ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ - ๋ฉ”๋ชจ๋ฆฌ ์•ˆ์ „์„ฑ ๋ณด์žฅ, Zero-Cost Abstraction

โšก ๊ณ ์„ฑ๋Šฅ

C/C++ ์ˆ˜์ค€์˜ ์‹คํ–‰ ์†๋„

๐Ÿ”’ ๋ฉ”๋ชจ๋ฆฌ ์•ˆ์ „

์ปดํŒŒ์ผ ํƒ€์ž„ ๋ฉ”๋ชจ๋ฆฌ ์ฒดํฌ

๐Ÿงต ๋™์‹œ์„ฑ

์•ˆ์ „ํ•œ ๋ฉ€ํ‹ฐ์Šค๋ ˆ๋“œ ์ฒ˜๋ฆฌ

๐ŸŽฏ Zero-Cost

์ถ”์ƒํ™” ๋น„์šฉ ์ œ๋กœ

์„ค์น˜

Cargo.toml์— ์ถ”๊ฐ€

TOML[dependencies]
cqm-quantum = "0.9.2"

๋˜๋Š” Cargo ๋ช…๋ น์–ด

Bashcargo add cqm-quantum

๋น ๋ฅธ ์‹œ์ž‘

๊ธฐ๋ณธ ์˜ˆ์ œ

Rustuse cqm_quantum::{QuantumCircuit, Simulator};
use std::f64::consts::PI;

fn main() -> Result<(), Box<dyn std::error::Error>> {
    // 2ํ๋น„ํŠธ Bell ์ƒํƒœ ์ƒ์„ฑ
    let mut qc = QuantumCircuit::new(2)?;
    qc.h(0)?;           // Hadamard gate on qubit 0
    qc.cx(0, 1)?;       // CNOT gate (control: 0, target: 1)
    qc.measure_all()?;
    
    // ์‹œ๋ฎฌ๋ ˆ์ดํ„ฐ ์‹คํ–‰
    let sim = Simulator::new();
    let result = sim.run(&qc, 1000)?;
    
    println!("{:?}", result.counts());
    // Output: {"00": 502, "11": 498}
    
    Ok(())
}

๋น„๋™๊ธฐ ์˜ˆ์ œ (Tokio)

Rustuse cqm_quantum::{QuantumCircuit, Simulator};
use tokio;

#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
    let mut qc = QuantumCircuit::new(3)?;
    qc.h(0)?;
    qc.h(1)?;
    qc.h(2)?;
    qc.measure_all()?;
    
    let sim = Simulator::new();
    let result = sim.run_async(&qc, 1000).await?;
    
    println!("Results: {:?}", result.counts());
    
    Ok(())
}

์ฃผ์š” ๊ธฐ๋Šฅ

1. ์–‘์ž ํšŒ๋กœ ์ƒ์„ฑ

Rustuse cqm_quantum::QuantumCircuit;
use std::f64::consts::PI;

let mut qc = QuantumCircuit::new(4)?;  // 4ํ๋น„ํŠธ ํšŒ๋กœ

// ๊ธฐ๋ณธ ๊ฒŒ์ดํŠธ
qc.h(0)?;                    // Hadamard
qc.x(1)?;                    // Pauli-X (NOT)
qc.y(2)?;                    // Pauli-Y
qc.z(3)?;                    // Pauli-Z

// ํšŒ์ „ ๊ฒŒ์ดํŠธ
qc.rx(PI / 4.0, 0)?;         // X์ถ• ํšŒ์ „
qc.ry(PI / 2.0, 1)?;         // Y์ถ• ํšŒ์ „
qc.rz(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. Builder ํŒจํ„ด

Rustuse cqm_quantum::QuantumCircuit;

let qc = QuantumCircuit::builder()
    .qubits(3)
    .h(0)
    .cx(0, 1)
    .cx(1, 2)
    .measure_all()
    .build()?;

3. ๊ณ ๊ธ‰ ์‹œ๋ฎฌ๋ ˆ์ด์…˜

Rustuse cqm_quantum::{Simulator, SimulatorOptions, Backend};

let sim = Simulator::with_options(
    SimulatorOptions::new()
        .backend(Backend::Statevector)
        .optimization_level(3)
        .threads(8)
        .seed(42)
)?;

let result = sim.run(&qc, 10000)?;

// ๊ฒฐ๊ณผ ํ™•์ธ
let counts = result.counts();
let statevector = result.statevector()?;
let probabilities = result.probabilities()?;

4. ์—๋Ÿฌ ์ฒ˜๋ฆฌ

Rustuse cqm_quantum::{QuantumCircuit, QuantumError};

fn create_bell_state() -> Result<QuantumCircuit, QuantumError> {
    let mut qc = QuantumCircuit::new(2)?;
    
    qc.h(0)?;
    qc.cx(0, 1)?;
    qc.measure_all()?;
    
    Ok(qc)
}

fn main() {
    match create_bell_state() {
        Ok(qc) => println!("Circuit created successfully"),
        Err(e) => eprintln!("Error: {}", e),
    }
}

API ๋ ˆํผ๋Ÿฐ์Šค

QuantumCircuit

๋ฉ”์„œ๋“œ ์‹œ๊ทธ๋‹ˆ์ฒ˜ ์„ค๋ช…
new(num_qubits) fn(usize) -> Result<Self> ์ƒˆ ํšŒ๋กœ ์ƒ์„ฑ
h(qubit) fn(&mut self, usize) -> Result<()> Hadamard ๊ฒŒ์ดํŠธ
cx(control, target) fn(&mut self, usize, usize) -> Result<()> CNOT ๊ฒŒ์ดํŠธ
rx(angle, qubit) fn(&mut self, f64, usize) -> Result<()> X์ถ• ํšŒ์ „
measure(qubit, cbit) fn(&mut self, usize, usize) -> Result<()> ๋‹จ์ผ ํ๋น„ํŠธ ์ธก์ •

Simulator

๋ฉ”์„œ๋“œ ๋ฐ˜ํ™˜ ํƒ€์ž… ์„ค๋ช…
run(&qc, shots) Result<SimulationResult> ๋™๊ธฐ ์‹คํ–‰
run_async(&qc, shots) impl Future<Output = Result<SimulationResult>> ๋น„๋™๊ธฐ ์‹คํ–‰

๊ณ ๊ธ‰ ์˜ˆ์ œ

๋ณ‘๋ ฌ ์‹œ๋ฎฌ๋ ˆ์ด์…˜ (Rayon)

Rustuse cqm_quantum::{QuantumCircuit, Simulator};
use rayon::prelude::*;

fn main() -> Result<(), Box<dyn std::error::Error>> {
    let circuits = generate_circuits()?;
    let sim = Simulator::new();
    
    let results: Vec<_> = circuits
        .par_iter()
        .map(|qc| sim.run(qc, 1000))
        .collect::<Result<Vec<_>, _>>()?;
    
    for result in results {
        println!("{:?}", result.counts());
    }
    
    Ok(())
}

Grover ์•Œ๊ณ ๋ฆฌ์ฆ˜

Rustuse cqm_quantum::{QuantumCircuit, Simulator};
use std::f64::consts::PI;

fn grover_search(n: usize, oracle: impl Fn(&mut QuantumCircuit) -> Result<(), Box<dyn std::error::Error>>) 
    -> Result<QuantumCircuit, Box<dyn std::error::Error>> 
{
    let mut qc = QuantumCircuit::new(n)?;
    
    // ์ดˆ๊ธฐํ™”: ๊ท ๋“ฑ ์ค‘์ฒฉ
    for i in 0..n {
        qc.h(i)?;
    }
    
    // Grover ๋ฐ˜๋ณต
    let iterations = (PI / 4.0 * (2_usize.pow(n as u32) as f64).sqrt()) as usize;
    
    for _ in 0..iterations {
        // Oracle
        oracle(&mut qc)?;
        
        // Diffusion
        for i in 0..n {
            qc.h(i)?;
            qc.x(i)?;
        }
        
        qc.h(n - 1)?;
        qc.mcx(&(0..n-1).collect::<Vec<_>>(), n - 1)?;
        qc.h(n - 1)?;
        
        for i in 0..n {
            qc.x(i)?;
            qc.h(i)?;
        }
    }
    
    qc.measure_all()?;
    Ok(qc)
}

fn main() -> Result<(), Box<dyn std::error::Error>> {
    let oracle = |qc: &mut QuantumCircuit| {
        qc.cz(0, 1)?;
        Ok(())
    };
    
    let qc = grover_search(2, oracle)?;
    
    let sim = Simulator::new();
    let result = sim.run(&qc, 1000)?;
    
    println!("Found: {:?}", result.counts());
    
    Ok(())
}

์–‘์ž ํ‘ธ๋ฆฌ์— ๋ณ€ํ™˜ (QFT)

Rustuse cqm_quantum::QuantumCircuit;
use std::f64::consts::PI;

fn qft(qc: &mut QuantumCircuit, qubits: &[usize]) -> Result<(), Box<dyn std::error::Error>> {
    let n = qubits.len();
    
    for i in 0..n {
        qc.h(qubits[i])?;
        
        for j in (i + 1)..n {
            let angle = PI / 2_f64.powi((j - i) as i32);
            qc.cp(angle, qubits[j], qubits[i])?;
        }
    }
    
    // Swap qubits
    for i in 0..(n / 2) {
        qc.swap(qubits[i], qubits[n - i - 1])?;
    }
    
    Ok(())
}

fn main() -> Result<(), Box<dyn std::error::Error>> {
    let mut qc = QuantumCircuit::new(4)?;
    qft(&mut qc, &[0, 1, 2, 3])?;
    qc.measure_all()?;
    
    Ok(())
}

WASM ํ†ตํ•ฉ (์›น ์–ด์…ˆ๋ธ”๋ฆฌ)

Rustuse wasm_bindgen::prelude::*;
use cqm_quantum::{QuantumCircuit, Simulator};

#[wasm_bindgen]
pub fn run_bell_state(shots: usize) -> Result<JsValue, JsValue> {
    let mut qc = QuantumCircuit::new(2)
        .map_err(|e| JsValue::from_str(&e.to_string()))?;
    
    qc.h(0).map_err(|e| JsValue::from_str(&e.to_string()))?;
    qc.cx(0, 1).map_err(|e| JsValue::from_str(&e.to_string()))?;
    qc.measure_all().map_err(|e| JsValue::from_str(&e.to_string()))?;
    
    let sim = Simulator::new();
    let result = sim.run(&qc, shots)
        .map_err(|e| JsValue::from_str(&e.to_string()))?;
    
    Ok(serde_wasm_bindgen::to_value(&result.counts())?)
}

ํ•˜๋“œ์›จ์–ด ์ œ์–ด ์ธํ„ฐํŽ˜์ด์Šค

Rustuse cqm_quantum::{QuantumCircuit, HardwareBackend};

#[derive(Clone)]
struct CustomHardware {
    // ํ•˜๋“œ์›จ์–ด ์—ฐ๊ฒฐ ์ •๋ณด
}

impl HardwareBackend for CustomHardware {
    fn execute(&self, qc: &QuantumCircuit, shots: usize) 
        -> Result<SimulationResult, Box<dyn std::error::Error>> 
    {
        // ์‹ค์ œ ์–‘์ž ํ•˜๋“œ์›จ์–ด๋กœ ํšŒ๋กœ ์ „์†ก
        todo!("Implement hardware communication")
    }
}

fn main() -> Result<(), Box<dyn std::error::Error>> {
    let hardware = CustomHardware { /* ... */ };
    let mut qc = QuantumCircuit::new(2)?;
    
    qc.h(0)?;
    qc.cx(0, 1)?;
    qc.measure_all()?;
    
    let result = hardware.execute(&qc, 1000)?;
    println!("{:?}", result.counts());
    
    Ok(())
}
๐Ÿ’ก Pro Tip: cargo build --release๋กœ ์ปดํŒŒ์ผํ•˜๋ฉด ์ตœ์ ํ™”๋œ ์„ฑ๋Šฅ์„ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์‹œ๋ฎฌ๋ ˆ์ด์…˜ ์†๋„๊ฐ€ ์ตœ๋Œ€ 10๋ฐฐ ๋นจ๋ผ์ง‘๋‹ˆ๋‹ค.
โš ๏ธ ์ฃผ์˜: Rust SDK๋Š” ํ˜„์žฌ ๋ฒ ํƒ€ ๋ฒ„์ „์ž…๋‹ˆ๋‹ค. API๊ฐ€ ๋ณ€๊ฒฝ๋  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ์—์„œ ์‚ฌ์šฉ ์‹œ ์ฃผ์˜ํ•˜์„ธ์š”.

์„ฑ๋Šฅ ๋ฒค์น˜๋งˆํฌ

์ž‘์—… Rust Python ๋น„๊ณ 
20ํ๋น„ํŠธ ์‹œ๋ฎฌ๋ ˆ์ด์…˜ 1.2์ดˆ 8.5์ดˆ 7๋ฐฐ ๋น ๋ฆ„
QFT (15ํ๋น„ํŠธ) 0.5์ดˆ 3.2์ดˆ 6.4๋ฐฐ ๋น ๋ฆ„
๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰ 120MB 450MB 3.7๋ฐฐ ์ ์Œ

๊ธฐ๋Šฅ ๋งคํŠธ๋ฆญ์Šค

๊ธฐ๋Šฅ ์ƒํƒœ ๋ฒ„์ „
๊ธฐ๋ณธ ๊ฒŒ์ดํŠธ โœ… ์•ˆ์ • v0.1.0+
์ œ์–ด ๊ฒŒ์ดํŠธ โœ… ์•ˆ์ • v0.2.0+
๋น„๋™๊ธฐ ์‹คํ–‰ โœ… ์•ˆ์ • v0.5.0+
WASM ์ง€์› โœ… ์•ˆ์ • v0.7.0+
ํ•˜๋“œ์›จ์–ด ๋ฐฑ์—”๋“œ ๐Ÿšง ๋ฒ ํƒ€ v0.9.0+
GPU ๊ฐ€์† ๐Ÿ”œ ๊ณ„ํš v1.0.0

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