๐ท C# SDK v1.4.1
.NET ์ํ๊ณ๋ฅผ ์ํ ์์ ์ปดํจํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ - Unity, Xamarin ์๋ฒฝ ํธํ
๐ฎ Unity ์ง์
๊ฒ์์์ ์์ ์๊ณ ๋ฆฌ์ฆ ํ์ฉ
๐ฑ Xamarin
๋ชจ๋ฐ์ผ ์ฑ์์ ์์ ์ปดํจํ
โก async/await
๋น๋๊ธฐ ํ๋ก๊ทธ๋๋ฐ ์๋ฒฝ ์ง์
๐ ๊ฐ๋ ฅํ ํ์
์ปดํ์ผ ํ์ ์์ ์ฑ ๋ณด์ฅ
์ค์น
NuGet Package Manager
PowerShellInstall-Package CQMDesk.Quantum -Version 1.4.1
.NET CLI
Bashdotnet add package CQMDesk.Quantum --version 1.4.1
PackageReference (csproj)
XML<PackageReference Include="CQMDesk.Quantum" Version="1.4.1" />
๋น ๋ฅธ ์์
๊ธฐ๋ณธ ์์ (.NET 6+)
C#using CQMDesk.Quantum;
// 2ํ๋นํธ Bell ์ํ ์์ฑ
var qc = new QuantumCircuit(2);
qc.H(0); // Hadamard gate on qubit 0
qc.CX(0, 1); // CNOT gate (control: 0, target: 1)
qc.MeasureAll();
// ์๋ฎฌ๋ ์ดํฐ ์คํ
var sim = new Simulator();
var result = await sim.RunAsync(qc, shots: 1000);
Console.WriteLine(result.GetCounts());
// Output: { "00": 502, "11": 498 }
Unity ์์
C#using UnityEngine;
using CQMDesk.Quantum;
using System.Threading.Tasks;
public class QuantumManager : MonoBehaviour
{
private Simulator simulator;
async void Start()
{
simulator = new Simulator();
var qc = new QuantumCircuit(3);
qc.H(0);
qc.H(1);
qc.H(2);
qc.MeasureAll();
var result = await simulator.RunAsync(qc, 1000);
Debug.Log($"Quantum Result: {result.GetCounts()}");
}
}
์ฃผ์ ๊ธฐ๋ฅ
1. ์์ ํ๋ก ์์ฑ
C#var 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. Fluent API (๋ฉ์๋ ์ฒด์ด๋)
C#var qc = new QuantumCircuit(3)
.H(0)
.CX(0, 1)
.CX(1, 2)
.MeasureAll();
3. ๊ณ ๊ธ ์๋ฎฌ๋ ์ด์
C#var sim = new Simulator(new SimulatorOptions
{
Backend = Backend.Statevector,
Optimization = OptimizationLevel.High,
Threads = 4,
Seed = 42
});
var options = new RunOptions
{
Shots = 10000,
MemoryLimit = "8GB"
};
var result = await sim.RunAsync(qc, options);
// ๊ฒฐ๊ณผ ํ์ธ
var counts = result.GetCounts();
var statevector = result.GetStatevector();
var probabilities = result.GetProbabilities();
4. ASP.NET Core ํตํฉ
C#using Microsoft.AspNetCore.Mvc;
using CQMDesk.Quantum;
[ApiController]
[Route("api/quantum")]
public class QuantumController : ControllerBase
{
private readonly ISimulator _simulator;
public QuantumController(ISimulator simulator)
{
_simulator = simulator;
}
[HttpPost("bell-state")]
public async Task<ActionResult<Result>> CreateBellState()
{
var qc = new QuantumCircuit(2);
qc.H(0);
qc.CX(0, 1);
qc.MeasureAll();
var result = await _simulator.RunAsync(qc, 1000);
return Ok(result);
}
[HttpPost("grover/{numQubits}")]
public async Task<ActionResult<Result>> RunGrover(int numQubits)
{
var qc = BuildGroverCircuit(numQubits);
var result = await _simulator.RunAsync(qc, 5000);
return Ok(result);
}
}
API ๋ ํผ๋ฐ์ค
QuantumCircuit
| ๋ฉ์๋ | ํ๋ผ๋ฏธํฐ | ์ค๋ช |
|---|---|---|
H(int qubit) |
qubit: ํ๋นํธ ์ธ๋ฑ์ค | Hadamard ๊ฒ์ดํธ ์ ์ฉ |
X(int qubit) |
qubit: ํ๋นํธ ์ธ๋ฑ์ค | Pauli-X ๊ฒ์ดํธ ์ ์ฉ |
CX(int control, int target) |
control, target: ํ๋นํธ ์ธ๋ฑ์ค | CNOT ๊ฒ์ดํธ ์ ์ฉ |
RX(double angle, int qubit) |
angle: ๋ผ๋์, qubit: ์ธ๋ฑ์ค | X์ถ ํ์ ๊ฒ์ดํธ |
Measure(int qubit, int cbit) |
qubit, cbit: ์ธ๋ฑ์ค | ๋จ์ผ ํ๋นํธ ์ธก์ |
MeasureAll() |
์์ | ์ ์ฒด ํ๋นํธ ์ธก์ |
Simulator
| ๋ฉ์๋ | ๋ฐํ ํ์ | ์ค๋ช |
|---|---|---|
RunAsync(QuantumCircuit, int) |
Task<Result> | ํ๋ก ์คํ (๊ธฐ๋ณธ) |
RunAsync(QuantumCircuit, RunOptions) |
Task<Result> | ํ๋ก ์คํ (๊ณ ๊ธ) |
GetAvailableBackends() |
IEnumerable<string> | ์ฌ์ฉ ๊ฐ๋ฅํ ๋ฐฑ์๋ ๋ชฉ๋ก |
Result
| ๋ฉ์๋ | ๋ฐํ ํ์ | ์ค๋ช |
|---|---|---|
GetCounts() |
Dictionary<string, int> | ์ธก์ ๊ฒฐ๊ณผ ์นด์ดํธ |
GetStatevector() |
ComplexVector | ์ํ ๋ฒกํฐ |
GetProbabilities() |
double[] | ํ๋ฅ ๋ถํฌ |
๊ณ ๊ธ ์์
๋ณ๋ ฌ ์๋ฎฌ๋ ์ด์
C#var circuits = GenerateCircuits();
var sim = new Simulator();
var tasks = circuits.Select(qc => sim.RunAsync(qc, 1000));
var results = await Task.WhenAll(tasks);
foreach (var result in results)
{
Console.WriteLine(result.GetCounts());
}
Unity ๊ฒ์ ์์ - ์์ ๋์ ์์ฑ๊ธฐ
C#using UnityEngine;
using CQMDesk.Quantum;
using System.Threading.Tasks;
public class QuantumRandomGenerator : MonoBehaviour
{
private Simulator simulator;
void Start()
{
simulator = new Simulator();
}
public async Task<int> GenerateRandomNumber(int max)
{
int numQubits = (int)Math.Ceiling(Math.Log2(max));
var qc = new QuantumCircuit(numQubits);
// ๋ชจ๋ ํ๋นํธ์ Hadamard ์ ์ฉ (๊ท ๋ฑ ๋ถํฌ)
for (int i = 0; i < numQubits; i++)
{
qc.H(i);
}
qc.MeasureAll();
var result = await simulator.RunAsync(qc, 1);
var measurement = result.GetCounts().Keys.First();
// ์ด์ง์๋ฅผ ์ ์๋ก ๋ณํ
int random = Convert.ToInt32(measurement, 2);
return random % max;
}
async void OnButtonClick()
{
int random = await GenerateRandomNumber(100);
Debug.Log($"Quantum Random: {random}");
}
}
Xamarin ๋ชจ๋ฐ์ผ ์ฑ ์์
C#using Xamarin.Forms;
using CQMDesk.Quantum;
public class QuantumPage : ContentPage
{
private Simulator simulator;
private Label resultLabel;
public QuantumPage()
{
simulator = new Simulator();
var button = new Button { Text = "Run Quantum Circuit" };
button.Clicked += OnButtonClicked;
resultLabel = new Label();
Content = new StackLayout
{
Children = { button, resultLabel }
};
}
async void OnButtonClicked(object sender, EventArgs e)
{
var qc = new QuantumCircuit(2);
qc.H(0);
qc.CX(0, 1);
qc.MeasureAll();
var result = await simulator.RunAsync(qc, 1000);
resultLabel.Text = $"Results: {result.GetCounts()}";
}
}
์์กด์ฑ ์ฃผ์ (DI) ์ค์
C#// Program.cs (.NET 6+)
using CQMDesk.Quantum;
var builder = WebApplication.CreateBuilder(args);
// Quantum SDK ์๋น์ค ๋ฑ๋ก
builder.Services.AddQuantum(options =>
{
options.Backend = Backend.Statevector;
options.Optimization = OptimizationLevel.High;
options.DefaultShots = 1000;
});
var app = builder.Build();
app.Run();
xUnit ํ ์คํธ
C#using Xunit;
using CQMDesk.Quantum;
public class QuantumCircuitTests
{
[Fact]
public async Task TestBellState()
{
var qc = new QuantumCircuit(2);
qc.H(0);
qc.CX(0, 1);
qc.MeasureAll();
var sim = new Simulator();
var result = await sim.RunAsync(qc, 1000);
var counts = result.GetCounts();
// Bell ์ํ๋ |00โฉ๊ณผ |11โฉ๋ง ๋์์ผ ํจ
Assert.Contains("00", counts.Keys);
Assert.Contains("11", counts.Keys);
Assert.DoesNotContain("01", counts.Keys);
Assert.DoesNotContain("10", counts.Keys);
// ์ฝ 50:50 ๋น์จ
var count00 = counts["00"];
var count11 = counts["11"];
Assert.InRange(Math.Abs(count00 - count11), 0, 100);
}
}
๐ก Pro Tip: Unity์์๋ UniTask๋ฅผ ์ฌ์ฉํ๋ฉด ๋ ๋์ ๋น๋๊ธฐ ์ฑ๋ฅ์ ์ป์ ์ ์์ต๋๋ค.
โ ๏ธ ์ฃผ์: Unity IL2CPP ๋น๋ ์ Managed Stripping Level์ "Minimal" ์ด์์ผ๋ก ์ค์ ํ์ธ์.
ํ๋ซํผ๋ณ ์ง์
| ํ๋ซํผ | ์ง์ ๋ฒ์ | ์ํ |
|---|---|---|
| .NET 6+ | 6.0, 7.0, 8.0 | โ ์์ ์ง์ |
| .NET Framework | 4.7.2+ | โ ์์ ์ง์ |
| Unity | 2021.3+ | โ ์์ ์ง์ |
| Xamarin | iOS 12+, Android 8+ | โ ์์ ์ง์ |
| .NET MAUI | 6.0+ | ๐ง ๋ฒ ํ |
๋ฌธ์ ๋ฐ ์ง์
- ๐ ๋ฌธ์: docs.cqmdesk.com/sdk/csharp
- ๐ฌ Discord: discord.gg/cqmdesk
- ๐ ์ด์: GitHub Issues
- ๐ง ์ด๋ฉ์ผ: sdk@cqmdesk.com