๐Ÿ”ท 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+ ๐Ÿšง ๋ฒ ํƒ€

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