๐ฆ 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 |
๋ฌธ์ ๋ฐ ์ง์
- ๐ ๋ฌธ์: docs.cqmdesk.com/sdk/rust
- ๐ฌ Discord: discord.gg/cqmdesk
- ๐ ์ด์: GitHub Issues
- ๐ง ์ด๋ฉ์ผ: sdk@cqmdesk.com
- ๐ฆ Crates.io: crates.io/crates/cqm-quantum