<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Quantum Computing on kenji.blog</title><link>http://kenji.blog/ko/categories/quantum-computing/</link><description>Recent content in Quantum Computing on kenji.blog</description><generator>Hugo -- gohugo.io</generator><language>ko</language><copyright>kenjinote</copyright><lastBuildDate>Fri, 11 Sep 2026 20:00:00 +0900</lastBuildDate><atom:link href="http://kenji.blog/ko/categories/quantum-computing/index.xml" rel="self" type="application/rss+xml"/><item><title>Qiskit을 사용한 양자 프로그래밍 초입문</title><link>http://kenji.blog/ko/p/qiskit-quantum-programming-intro/</link><pubDate>Fri, 11 Sep 2026 20:00:00 +0900</pubDate><guid>http://kenji.blog/ko/p/qiskit-quantum-programming-intro/</guid><description>&lt;img src="http://kenji.blog/p/qiskit-quantum-programming-intro/img/eyecatch.jpg" alt="Featured image of post Qiskit을 사용한 양자 프로그래밍 초입문" />&lt;h2 id="1-시작하며">1. 시작하며
&lt;/h2>&lt;p>현대의 컴퓨터(고전 컴퓨터)는 우리의 삶을 극적으로 변화시켰고, 고도의 계산 능력으로 사회의 모든 측면을 지탱하고 있습니다. 그러나 일부 특정 문제(예를 들어, 거대한 수의 소인수분해, 복잡한 분자 구조의 시뮬레이션, 최적화 문제 등)에 있어서는 현재 최첨단 슈퍼컴퓨터라 하더라도 우주의 나이보다 더 긴 시간이 필요할 수 있음이 알려져 있습니다.&lt;/p>
&lt;p>이러한 &amp;lsquo;고전 컴퓨터의 한계&amp;rsquo;를 뛰어넘을 가능성을 비장하고 있는 것이 **양자 컴퓨터(Quantum Computer)**입니다. 양자역학의 신비한 성질(중첩이나 양자 얽힘)을 계산 자원으로 활용함으로써 특정 문제를 극적으로 고속화할 수 있을 것으로 생각됩니다.&lt;/p>
&lt;p>본 기사에서는 IBM이 오픈소스로 제공하는 양자 컴퓨팅 프레임워크인 **Qiskit(키스킷)**을 사용하여 양자 프로그래밍의 세계로 첫걸음을 내딛습니다. 물리나 수학의 기초부터 친절하게 해설하고, 실제로 Python으로 코드를 작성하여 시뮬레이터 상에서 양자 회로를 구동하기까지의 프로세스를 망라한 매우 상세한 입문 가이드입니다.&lt;/p>
&lt;hr>
&lt;h2 id="2-양자-계산을-지탱하는-물리와-수학의-기초">2. 양자 계산을 지탱하는 물리와 수학의 기초
&lt;/h2>&lt;p>양자 프로그래밍을 이해하기 위해서는 먼저 양자역학의 기본적인 개념을 이해할 필요가 있습니다. 여기서는 양자 비트, 중첩, 양자 얽힘이라는 3가지 중요한 기둥에 대해 해설합니다.&lt;/p>
&lt;h3 id="21-고전-비트와-양자-비트qubit">2.1 고전 비트와 양자 비트(Qubit)
&lt;/h3>&lt;p>고전 컴퓨터의 정보 단위는 &amp;lsquo;비트(Bit)&amp;lsquo;입니다. 비트는 항상 &lt;code>0&lt;/code> 또는 &lt;code>1&lt;/code> 중 하나의 상태를 취합니다.&lt;/p>
&lt;p>반면, 양자 컴퓨터 정보의 최소 단위는 **양자 비트(Qubit: Quantum bit)**라고 불립니다. 양자 비트는 &lt;code>0&lt;/code>과 &lt;code>1&lt;/code>의 상태를 취할 수 있을 뿐만 아니라, &lt;strong>그 두 가지 상태를 동시에 유지하는&lt;/strong> 것이 가능합니다.&lt;/p>
&lt;p>수학적으로 양자 비트의 상태 $|\psi\rangle$는 기저 상태 $|0\rangle$과 $|1\rangle$의 선형 결합(중첩)으로 표현됩니다.&lt;/p>
$$
|\psi\rangle = \alpha|0\rangle + \beta|1\rangle
$$
&lt;p>여기서 $\alpha$와 $\beta$는 복소수이며, 각각 상태 $|0\rangle$과 $|1\rangle$이 관측될 확률 진폭을 나타냅니다. 양자역학의 기본 원리에 따라 확률의 합은 1이 되어야 하므로 다음의 규격화 조건을 만족합니다.&lt;/p>
$$
|\alpha|^2 + |\beta|^2 = 1
$$
&lt;p>즉, 이 양자 비트를 &amp;lsquo;측정(관측)&amp;lsquo;했을 때 $|0\rangle$을 얻을 확률은 $|\alpha|^2$, $|1\rangle$을 얻을 확률은 $|\beta|^2$가 됩니다. 측정 전에는 상태가 확률적으로만 결정되어 있다는 점이 고전 비트와의 결정적인 차이입니다.&lt;/p>
&lt;div class="mermaid">graph LR
A["고전 비트 (Classical Bit)"] --> B["확정된 상태: 0 또는 1"]
C["양자 비트 (Qubit)"] --> D["중첩: 0과 1 양쪽 모두"]
D --> E["측정에 의해 확률적으로 상태가 확정"]&lt;/div>
&lt;h3 id="22-중첩superposition">2.2 중첩(Superposition)
&lt;/h3>&lt;p>앞서 언급했듯이, $|0\rangle$과 $|1\rangle$의 상태가 섞여 있는 상태를 **중첩(Superposition)**이라고 부릅니다.&lt;/p>
&lt;p>예를 들어, 1개의 양자 비트가 완전히 균등한 중첩 상태에 있을 경우 $\alpha = \frac{1}{\sqrt{2}}$, $\beta = \frac{1}{\sqrt{2}}$가 됩니다.&lt;/p>
$$
|\psi\rangle = \frac{1}{\sqrt{2}}|0\rangle + \frac{1}{\sqrt{2}}|1\rangle
$$
&lt;p>이 상태를 측정하면 $|0\rangle$과 $|1\rangle$이 각각 50%의 확률로 관측됩니다.
만약 2개의 양자 비트가 있다면, $|00\rangle, |01\rangle, |10\rangle, |11\rangle$의 4가지 상태의 중첩을 만들 수 있습니다. $n$개의 양자 비트가 있다면 $2^n$개의 상태를 동시에 표현할 수 있게 되며, 이것이 양자 컴퓨터의 병렬 처리 능력의 원천 중 하나가 됩니다.&lt;/p>
&lt;h3 id="23-양자-얽힘entanglement">2.3 양자 얽힘(Entanglement)
&lt;/h3>&lt;p>양자 계산에서 가장 강력하고도 신비한 성질이 **양자 얽힘(Entanglement)**입니다. 아인슈타인이 &amp;lsquo;기분 나쁜 원격 작용&amp;rsquo;이라고 불렀던 이 현상은, 2개 이상의 양자 비트가 서로 강하게 결합되어 한쪽 양자 비트의 상태가 결정되면 물리적으로 아무리 떨어져 있더라도 다른 쪽 양자 비트의 상태가 순식간에 결정된다는 성질입니다.&lt;/p>
&lt;p>가장 유명한 양자 얽힘 상태인 &amp;lsquo;벨 상태(Bell State)&amp;rsquo; 중 하나인 $\Phi^+$ 상태는 다음과 같이 표현됩니다.&lt;/p>
$$
|\Phi^+\rangle = \frac{|00\rangle + |11\rangle}{\sqrt{2}}
$$
&lt;p>이 상태에서는 $|01\rangle$이나 $|10\rangle$이라는 상태가 존재하지 않습니다. 따라서 1번째 양자 비트를 측정하여 $|0\rangle$이 나왔을 경우, 2번째 양자 비트를 측정할 것도 없이 확실하게 $|0\rangle$임이 확정됩니다. 반대로 1번째가 $|1\rangle$이라면 2번째도 반드시 $|1\rangle$이 됩니다.&lt;/p>
&lt;hr>
&lt;h2 id="3-양자-논리-게이트quantum-logic-gates">3. 양자 논리 게이트(Quantum Logic Gates)
&lt;/h2>&lt;p>고전 컴퓨터가 AND, OR, NOT 등의 논리 게이트를 사용하여 계산을 수행하는 것처럼, 양자 컴퓨터도 &lt;strong>양자 게이트&lt;/strong>를 사용하여 양자 비트의 상태를 조작합니다. 양자 상태는 벡터이므로 양자 게이트는 그 벡터에 작용하는 &amp;lsquo;유니터리 행렬&amp;rsquo;로 표현됩니다.&lt;/p>
&lt;h3 id="31-파울리-게이트pauli-x-y-z">3.1 파울리 게이트(Pauli-X, Y, Z)
&lt;/h3>&lt;p>파울리 게이트는 1 양자 비트에 대한 기본적인 조작입니다.&lt;/p>
&lt;p>&lt;strong>· Pauli-X 게이트 (NOT 게이트)&lt;/strong>
고전 컴퓨터의 NOT 게이트에 해당합니다. $|0\rangle$을 $|1\rangle$로, $|1\rangle$을 $|0\rangle$로 반전시킵니다. (블로흐 구에서 X축을 기준으로 180도 회전)&lt;/p>
$$
X = \begin{pmatrix} 0 &amp; 1 \\ 1 &amp; 0 \end{pmatrix}
$$
&lt;p>&lt;strong>· Pauli-Y 게이트&lt;/strong>
Y축을 기준으로 180도 회전합니다. 위상과 비트 모두를 반전시키는 효과가 있습니다.&lt;/p>
$$
Y = \begin{pmatrix} 0 &amp; -i \\ i &amp; 0 \end{pmatrix}
$$
&lt;p>&lt;strong>· Pauli-Z 게이트 (위상 반전 게이트)&lt;/strong>
$|0\rangle$의 상태는 그대로 두고, $|1\rangle$ 상태의 위상을 반전($-1$을 곱함)시킵니다. (Z축을 기준으로 180도 회전)&lt;/p>
$$
Z = \begin{pmatrix} 1 &amp; 0 \\ 0 &amp; -1 \end{pmatrix}
$$
&lt;h3 id="32-아다마르-게이트hadamard-gate">3.2 아다마르 게이트(Hadamard Gate)
&lt;/h3>&lt;p>아다마르 게이트(H 게이트)는 확정된 상태($|0\rangle$나 $|1\rangle$)를 중첩 상태로 변환하는 매우 중요한 게이트입니다.&lt;/p>
$$
H = \frac{1}{\sqrt{2}}
\begin{pmatrix}
1 &amp; 1 \\
1 &amp; -1
\end{pmatrix}
$$
&lt;p>$|0\rangle$에 H 게이트를 적용하면 균등한 중첩 상태인 $|+\rangle$이 됩니다.&lt;/p>
$$
H|0\rangle = \frac{1}{\sqrt{2}}|0\rangle + \frac{1}{\sqrt{2}}|1\rangle = |+\rangle
$$
&lt;h3 id="33-위상-게이트phase-gates">3.3 위상 게이트(Phase Gates)
&lt;/h3>&lt;p>위상 게이트는 Z 게이트를 일반화한 것으로, $|1\rangle$ 상태의 위상을 지정된 각도 $\theta$만큼 회전시킵니다.&lt;/p>
$$
P(\theta) = \begin{pmatrix} 1 &amp; 0 \\ 0 &amp; e^{i\theta} \end{pmatrix}
$$
&lt;p>대표적인 것으로 S 게이트($\theta = \pi/2$)나 T 게이트($\theta = \pi/4$)가 있습니다.&lt;/p>
&lt;h3 id="34-cnot-게이트controlled-not-gate">3.4 CNOT 게이트(Controlled-NOT Gate)
&lt;/h3>&lt;p>CNOT 게이트(CX 게이트)는 2개의 양자 비트 간에 조작을 수행하는 게이트로, 양자 얽힘을 생성하기 위해 필수 불가결합니다. &amp;lsquo;제어(Control) 비트&amp;rsquo;와 &amp;lsquo;표적(Target) 비트&amp;rsquo;로 구성됩니다.&lt;/p>
&lt;p>제어 비트가 $|1\rangle$일 경우에만 표적 비트에 X 게이트(NOT 조작)를 적용하고, 제어 비트가 $|0\rangle$일 경우에는 아무것도 하지 않습니다.&lt;/p>
$$
CNOT = \begin{pmatrix}
1 &amp; 0 &amp; 0 &amp; 0 \\
0 &amp; 1 &amp; 0 &amp; 0 \\
0 &amp; 0 &amp; 0 &amp; 1 \\
0 &amp; 0 &amp; 1 &amp; 0
\end{pmatrix}
$$
&lt;hr>
&lt;h2 id="4-qiskit의-기본과-환경-구축">4. Qiskit의 기본과 환경 구축
&lt;/h2>&lt;p>여기부터는 실제로 Python과 Qiskit을 사용하여 양자 프로그램을 작성해 보겠습니다.&lt;/p>
&lt;h3 id="41-qiskit이란">4.1 Qiskit이란?
&lt;/h3>&lt;p>&lt;strong>Qiskit&lt;/strong>은 IBM Quantum이 개발한 오픈소스 양자 컴퓨팅용 소프트웨어 개발 키트(SDK)입니다. Python을 사용하여 직관적으로 양자 회로를 구축하고 로컬 시뮬레이터나 클라우드를 통해 실제 IBM의 양자 컴퓨터 실기에서 실행할 수 있습니다.&lt;/p>
&lt;h3 id="42-설치-방법">4.2 설치 방법
&lt;/h3>&lt;p>Qiskit을 이용하기 위해서는 Python 환경이 필요합니다. 다음 명령어로 Qiskit과 관련 패키지(시뮬레이터 및 그리기용 라이브러리)를 설치합니다.&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">pip install qiskit qiskit-aer qiskit-ibm-runtime matplotlib pylatexenc
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;h3 id="43-프로그래밍의-기본-흐름">4.3 프로그래밍의 기본 흐름
&lt;/h3>&lt;p>Qiskit을 사용한 양자 프로그래밍은 주로 다음 단계로 진행됩니다.&lt;/p>
&lt;div class="mermaid">graph TD
A["1. 회로 구축 (Build)"] --> B["2. 컴파일/트랜스파일 (Compile)"]
B --> C["3. 실행 (Execute)"]
C --> D["4. 결과 분석 및 시각화 (Analyze)"]&lt;/div>
&lt;ol>
&lt;li>&lt;strong>회로 구축&lt;/strong>: &lt;code>QuantumCircuit&lt;/code> 객체를 생성하고 게이트를 추가해 나간다.&lt;/li>
&lt;li>&lt;strong>컴파일&lt;/strong>: 실행할 백엔드(실기나 시뮬레이터)에 맞춰 회로를 최적화.&lt;/li>
&lt;li>&lt;strong>실행&lt;/strong>: 백엔드에 작업을 전송하고 결과를 획득.&lt;/li>
&lt;li>&lt;strong>분석&lt;/strong>: 측정 결과의 히스토그램 등을 플롯.&lt;/li>
&lt;/ol>
&lt;hr>
&lt;h2 id="5-실전-벨-상태양자-얽힘를-만드는-회로-구축">5. 실전: 벨 상태(양자 얽힘)를 만드는 회로 구축
&lt;/h2>&lt;p>이론에서 배운 &amp;lsquo;양자 얽힘(벨 상태)&amp;lsquo;을 실제로 Qiskit으로 만들어 봅시다. 목표로 하는 상태는 $|\Phi^+\rangle = \frac{|00\rangle + |11\rangle}{\sqrt{2}}$입니다.&lt;/p>
&lt;h3 id="51-회로-설계">5.1 회로 설계
&lt;/h3>&lt;p>벨 상태를 만들려면 다음 절차를 거칩니다.&lt;/p>
&lt;ol>
&lt;li>2개의 양자 비트를 준비한다(초기 상태는 둘 다 $|0\rangle$).&lt;/li>
&lt;li>1번째 양자 비트에 아다마르 게이트(H)를 적용하여 중첩 상태로 만든다.&lt;/li>
&lt;li>1번째 양자 비트를 &amp;lsquo;제어 비트&amp;rsquo;, 2번째 양자 비트를 &amp;lsquo;표적 비트&amp;rsquo;로 하여 CNOT 게이트를 적용한다.&lt;/li>
&lt;li>결과를 읽어내기 위해 측정(Measure)을 수행한다.&lt;/li>
&lt;/ol>
&lt;h3 id="52-pythonqiskit-코드-구현">5.2 Python/Qiskit 코드 구현
&lt;/h3>&lt;p>그러면 실제 코드를 살펴봅시다.&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;span class="lnt">11
&lt;/span>&lt;span class="lnt">12
&lt;/span>&lt;span class="lnt">13
&lt;/span>&lt;span class="lnt">14
&lt;/span>&lt;span class="lnt">15
&lt;/span>&lt;span class="lnt">16
&lt;/span>&lt;span class="lnt">17
&lt;/span>&lt;span class="lnt">18
&lt;/span>&lt;span class="lnt">19
&lt;/span>&lt;span class="lnt">20
&lt;/span>&lt;span class="lnt">21
&lt;/span>&lt;span class="lnt">22
&lt;/span>&lt;span class="lnt">23
&lt;/span>&lt;span class="lnt">24
&lt;/span>&lt;span class="lnt">25
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="kn">import&lt;/span> &lt;span class="nn">numpy&lt;/span> &lt;span class="k">as&lt;/span> &lt;span class="nn">np&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kn">from&lt;/span> &lt;span class="nn">qiskit&lt;/span> &lt;span class="kn">import&lt;/span> &lt;span class="n">QuantumCircuit&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">transpile&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kn">from&lt;/span> &lt;span class="nn">qiskit_aer&lt;/span> &lt;span class="kn">import&lt;/span> &lt;span class="n">Aer&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kn">from&lt;/span> &lt;span class="nn">qiskit.visualization&lt;/span> &lt;span class="kn">import&lt;/span> &lt;span class="n">plot_histogram&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kn">import&lt;/span> &lt;span class="nn">matplotlib.pyplot&lt;/span> &lt;span class="k">as&lt;/span> &lt;span class="nn">plt&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 1. 회로 초기화&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 2개의 양자 비트와 2개의 고전 비트를 가지는 양자 회로 생성&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">qc&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">QuantumCircuit&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">2&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">2&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 2. H 게이트 적용&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 양자 비트 0 (q0)에 아다마르 게이트 적용&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">qc&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">h&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 3. CNOT 게이트 적용&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># q0을 제어 비트로, q1을 표적 비트로 CNOT 적용&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">qc&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">cx&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">1&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 4. 측정&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 양자 비트 0과 1을 측정하여 각각 고전 비트 0과 1에 쓰기&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">qc&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">measure&lt;/span>&lt;span class="p">([&lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">1&lt;/span>&lt;span class="p">],&lt;/span> &lt;span class="p">[&lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">1&lt;/span>&lt;span class="p">])&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 회로도 그리기 (matplotlib 사용)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># qc.draw(&amp;#39;mpl&amp;#39;)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">qc&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">draw&lt;/span>&lt;span class="p">())&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>이 코드를 실행하면 콘솔 상에 아스키 아트로 다음과 같은 양자 회로도가 표시됩니다.&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;span class="lnt">3
&lt;/span>&lt;span class="lnt">4
&lt;/span>&lt;span class="lnt">5
&lt;/span>&lt;span class="lnt">6
&lt;/span>&lt;span class="lnt">7
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl"> ┌───┐ ┌─┐
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">q_0: ┤ H ├──■──┤M├───
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> └───┘┌─┴─┐└╥┘┌─┐
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">q_1: ─────┤ X ├─╫─┤M├
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> └───┘ ║ └╥┘
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">c: 2/═══════════╩══╩═
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> 0 1
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>&lt;code>H&lt;/code>가 아다마르 게이트, &lt;code>■&lt;/code>와 &lt;code>X&lt;/code>의 조합이 CNOT 게이트, &lt;code>M&lt;/code>이 측정을 나타냅니다.&lt;/p>
&lt;h3 id="53-시뮬레이터에서의-실행-및-결과-해석">5.3 시뮬레이터에서의 실행 및 결과 해석
&lt;/h3>&lt;p>다음으로 이 회로를 IBM의 고성능 시뮬레이터 &lt;code>Aer&lt;/code>에서 실행하여 결과를 확인합니다.&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;span class="lnt">11
&lt;/span>&lt;span class="lnt">12
&lt;/span>&lt;span class="lnt">13
&lt;/span>&lt;span class="lnt">14
&lt;/span>&lt;span class="lnt">15
&lt;/span>&lt;span class="lnt">16
&lt;/span>&lt;span class="lnt">17
&lt;/span>&lt;span class="lnt">18
&lt;/span>&lt;span class="lnt">19
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Aer 시뮬레이터 백엔드 가져오기&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">simulator&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">Aer&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">get_backend&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;qasm_simulator&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 시뮬레이터용으로 회로 트랜스파일(최적화)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">compiled_circuit&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">transpile&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">qc&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">simulator&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 회로 실행(여기서는 1000 샷 실행)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">job&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">simulator&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">run&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">compiled_circuit&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">shots&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="mi">1000&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 결과 가져오기&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">result&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">job&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">result&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 상태 관측 횟수(카운트) 가져오기&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">counts&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">result&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">get_counts&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">compiled_circuit&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="se">\n&lt;/span>&lt;span class="s2">측정 결과:&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">counts&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 히스토그램 플롯&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># plot_histogram(counts)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># plt.show()&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>&lt;strong>결과 해석&lt;/strong>&lt;/p>
&lt;p>콘솔의 출력은 다음과 같이 나타날 것입니다.
&lt;code>측정 결과: {'00': 495, '11': 505}&lt;/code>
(※확률은 무작위이므로 실행할 때마다 수치는 약간 변동합니다)&lt;/p>
&lt;p>이상적인 시뮬레이션 환경에서는 측정 결과 &lt;code>00&lt;/code>과 &lt;code>11&lt;/code>이 대략 50%씩 관측되며, &lt;code>01&lt;/code>이나 &lt;code>10&lt;/code>은 전혀 관측되지 않습니다.
이것은 바로 우리가 작성한 벨 상태 $|\Phi^+\rangle = \frac{|00\rangle + |11\rangle}{\sqrt{2}}$의 이론적 예측과 완전히 일치합니다. 1번째 양자 비트가 0이면 2번째도 반드시 0, 1이면 반드시 1이 된다는 &amp;lsquo;양자 얽힘&amp;rsquo;이 정확하게 시뮬레이트된 것입니다.&lt;/p>
&lt;p>참고로 실기 양자 컴퓨터(IBM Quantum Hardware)에서 실행할 경우, 노이즈(양자 결어긋남이나 게이트 오류)의 영향으로 인해 드물게 &lt;code>01&lt;/code>이나 &lt;code>10&lt;/code>이 관측될 수도 있습니다. 이 노이즈를 어떻게 줄일 것인가(양자 오류 정정)가 현재 양자 컴퓨터 개발의 가장 큰 과제 중 하나입니다.&lt;/p>
&lt;hr>
&lt;h2 id="6-더-고도화된-알고리즘으로의-스케일업">6. 더 고도화된 알고리즘으로의 스케일업
&lt;/h2>&lt;p>벨 상태의 생성은 양자 프로그래밍의 &amp;lsquo;Hello World&amp;rsquo;라고도 할 수 있습니다. 이를 바탕으로 더욱 발전시킴으로써 고전 컴퓨터를 능가하는 강력한 알고리즘을 구축할 수 있습니다.&lt;/p>
&lt;h3 id="61-도이치-조사-알고리즘deutsch-jozsa-algorithm">6.1 도이치-조사 알고리즘(Deutsch-Jozsa Algorithm)
&lt;/h3>&lt;p>주어진 함수 $f(x)$가 &amp;lsquo;상수 함수(입력에 상관없이 항상 0 또는 항상 1을 출력)&amp;lsquo;인지 &amp;lsquo;균형 함수(입력의 절반에 대해 0, 나머지 절반에 대해 1을 출력)&amp;lsquo;인지 판정하는 문제입니다.
고전 컴퓨터에서는 최악의 경우 $2^{n-1} + 1$번의 함수 평가가 필요하지만, 도이치-조사 알고리즘을 사용하면 양자의 병렬성을 이용하여 &lt;strong>단 1번의 평가&lt;/strong>만으로 판정할 수 있습니다. 이는 중첩 상태를 입력하고 간섭(Interference)을 이용해 불필요한 상태를 상쇄하여 원하는 답을 증폭시키는 양자 알고리즘의 기본 패턴을 보여줍니다.&lt;/p>
&lt;h3 id="62-그로버의-알고리즘grovers-algorithm">6.2 그로버의 알고리즘(Grover&amp;rsquo;s Algorithm)
&lt;/h3>&lt;p>정렬되지 않은 $N$개의 데이터베이스에서 특정 데이터를 찾는 검색 문제에 있어, 고전 알고리즘이 평균 $N/2$번의 계산을 요구하는 반면 그로버의 알고리즘은 $\sqrt{N}$번 만에 원하는 데이터를 찾아낼 수 있습니다.
이 알고리즘은 &amp;lsquo;오라클(Oracle)&amp;lsquo;이라 불리는 블랙박스를 사용하여 목적 해의 위상을 반전시키고, 나아가 &amp;lsquo;진폭 증폭(Amplitude Amplification)&amp;lsquo;을 수행함으로써 목적 해가 관측될 확률을 극적으로 높입니다.&lt;/p>
&lt;div class="mermaid">graph TD
A["초기화 (모든 상태의 중첩)"] --> B["오라클 (정답의 위상을 반전)"]
B --> C["확산 연산자 (평균값 기준 반전에 의한 진폭 증폭)"]
C --> D{"충분한 확률에 도달했는가?"}
D -- "No" --> B
D -- "Yes" --> E["측정"]&lt;/div>
&lt;hr>
&lt;h2 id="7-마무리-및-향후-학습">7. 마무리 및 향후 학습
&lt;/h2>&lt;p>이 기사에서는 양자 컴퓨팅의 근본적인 개념인 중첩과 양자 얽힘에서 시작하여, Qiskit을 이용한 양자 논리 게이트의 조작, 그리고 실제로 벨 상태를 구축하고 시뮬레이션하여 결과를 해석하기까지 자세히 해설했습니다.&lt;/p>
&lt;p>Qiskit은 Python이라는 친숙한 언어로 작성할 수 있어 수학적, 물리적인 장벽을 넘어 알고리즘 구축에 집중할 수 있게 해주는 강력한 도구입니다. 양자 컴퓨터는 현재 노이즈를 동반하는 중간 규모 양자 장치(NISQ: Noisy Intermediate-Scale Quantum) 시대에 접어들었지만, 기계 학습(Quantum Machine Learning), 화학 시뮬레이션(Quantum Chemistry), 암호 해독 등 수많은 분야에서의 응용 연구가 전 세계적으로 빠르게 진행되고 있습니다.&lt;/p>
&lt;p>부디 이번 기회에 Qiskit을 사용하여 다양한 양자 회로를 직접 만들고, 실제 IBM Quantum 프로세서에서 구동해 보시길 바랍니다. 미래의 컴퓨팅 패러다임을 직접 체험할 수 있을 것입니다.&lt;/p>
&lt;h3 id="참고-자료">참고 자료
&lt;/h3>&lt;ul>
&lt;li>&lt;a class="link" href="https://qiskit.org/documentation/" target="_blank" rel="noopener"
>Qiskit 공식 문서&lt;/a>&lt;/li>
&lt;li>&lt;a class="link" href="https://qiskit.org/textbook/ja/preface.html" target="_blank" rel="noopener"
>Qiskit Textbook&lt;/a> - 수학적 배경이나 알고리즘을 더 깊이 배우고 싶은 분들에게 추천하는 공식 텍스트&lt;/li>
&lt;li>IBM Quantum Learning&lt;/li>
&lt;/ul>
&lt;p>양자의 세계로 오신 것을 환영합니다!&lt;/p></description></item><item><title>양자 우월성이란 무엇인가? Google과 IBM의 최신 동향</title><link>http://kenji.blog/ko/p/what-is-quantum-supremacy-google-ibm/</link><pubDate>Fri, 11 Sep 2026 18:00:00 +0900</pubDate><guid>http://kenji.blog/ko/p/what-is-quantum-supremacy-google-ibm/</guid><description>&lt;img src="http://kenji.blog/p/what-is-quantum-supremacy-google-ibm/img/eyecatch.jpg" alt="Featured image of post 양자 우월성이란 무엇인가? Google과 IBM의 최신 동향" />&lt;h2 id="1-머리말-양자-컴퓨팅의-여명과-양자-우월성">1. 머리말: 양자 컴퓨팅의 여명과 &amp;lsquo;양자 우월성&amp;rsquo;
&lt;/h2>&lt;p>양자 컴퓨팅은 물리학의 근본 원리인 양자역학을 정보 처리에 응용함으로써, 고전 컴퓨터(현재 우리가 일상적으로 사용하는 PC나 슈퍼컴퓨터)로는 현실적인 시간 내에 풀 수 없는 복잡한 문제를 해결할 가능성을 품고 있습니다. 이 분야는 오랫동안 이론적인 연구가 주를 이루었으나, 최근 하드웨어의 급속한 진보로 실용화를 향한 경쟁이 격화되고 있습니다.&lt;/p>
&lt;p>그 중에서도 가장 큰 주목을 받은 키워드 중 하나가 &amp;lsquo;양자 우월성(Quantum Supremacy)&amp;lsquo;입니다. 이는 특정 계산 작업에서 양자 컴퓨터가 고전 컴퓨터를 압도하는 계산 능력을 보여주는 순간을 의미합니다. 본 기사에서는 양자 우월성의 엄밀한 정의를 시작으로, 2019년 세계 최초로 이 마일스톤에 도달했다고 발표한 Google의 &amp;lsquo;Sycamore(시카모어)&amp;rsquo; 프로세서의 실험 세부 내용, 이에 대한 IBM의 반론과 독자적인 접근법, 그리고 진정한 실용화를 위한 가장 큰 장벽인 &amp;lsquo;양자 오류 정정(Quantum Error Correction: QEC)&amp;lsquo;과 &amp;lsquo;결함 허용 양자 컴퓨팅(Fault-Tolerant Quantum Computing: FTQC)&amp;lsquo;을 향한 최신 로드맵에 대해 기술적이고 수학적으로 깊이 있게 해설합니다.&lt;/p>
&lt;hr>
&lt;h2 id="2-이론적-배경-양자-계산의-기초와-복잡도-클래스">2. 이론적 배경: 양자 계산의 기초와 복잡도 클래스
&lt;/h2>&lt;p>양자 우월성을 이해하기 위해서는 먼저 양자 계산의 수학적 기초와 계산 복잡도 이론에서의 위치를 이해해야 합니다.&lt;/p>
&lt;h3 id="양자-비트와-중첩">양자 비트와 중첩
&lt;/h3>&lt;p>고전 컴퓨터에서 정보의 최소 단위는 비트(0 또는 1)이지만, 양자 컴퓨터에서는 양자 비트(Qubit, 큐비트)를 사용합니다. 1개의 양자 비트 상태 $|\psi\rangle$ 는 기저 상태 $|0\rangle$ 와 $|1\rangle$ 의 복소 선형 결합으로 표현됩니다.&lt;/p>
$$
|\psi\rangle = \alpha|0\rangle + \beta|1\rangle
$$
&lt;p>여기서 $\alpha, \beta \in \mathbb{C}$ 이며, 규격화 조건 $|\alpha|^2 + |\beta|^2 = 1$ 을 만족합니다. 이 성질을 &amp;lsquo;중첩(Superposition)&amp;lsquo;이라고 부릅니다.&lt;/p>
&lt;h3 id="얽힘entanglement과-텐서곱">얽힘(Entanglement)과 텐서곱
&lt;/h3>&lt;p>여러 양자 비트가 존재할 경우, 시스템 전체의 상태는 개별 양자 비트 상태 공간의 텐서곱으로 표현됩니다. $n$ 양자 비트 시스템은 $2^n$ 차원의 힐베르트 공간 $\mathcal{H}^{\otimes n}$ 상의 벡터가 됩니다.&lt;/p>
$$
|\Psi\rangle = \sum_{x \in \{0, 1\}^n} c_x |x\rangle
$$
&lt;p>여기서 $\sum |c_x|^2 = 1$ 입니다. 양자 비트들이 독립적이지 않고 한쪽의 상태가 다른 쪽에 의존하는 상태를 &amp;lsquo;양자 얽힘(Quantum Entanglement)&amp;lsquo;이라고 부릅니다. 이를 통해 양자 컴퓨터는 지수함수적으로 방대한 상태 공간을 동시에 처리할 수 있는 잠재력을 갖게 됩니다.&lt;/p>
&lt;h3 id="양자-우월성의-계산-복잡도-이론적-정의">양자 우월성의 계산 복잡도 이론적 정의
&lt;/h3>&lt;p>계산 복잡도 이론에서 고전 컴퓨터가 효율적으로(다항 시간 내에) 풀 수 있는 문제의 클래스를 &lt;strong>BPP&lt;/strong>(Bounded-error Probabilistic Polynomial time)라고 부릅니다. 반면, 양자 컴퓨터가 효율적으로 풀 수 있는 문제의 클래스는 &lt;strong>BQP&lt;/strong>(Bounded-error Quantum Polynomial time)입니다.&lt;/p>
&lt;p>양자 우월성의 실증이란, &amp;ldquo;BQP에는 포함되지만 BPP에는 포함되지 않는(혹은 그럴 가능성이 매우 높은) 특정 작업을 실제 양자 하드웨어에서 실행하여, 고전 슈퍼컴퓨터에 의한 시뮬레이션을 시간적·자원적으로 능가하는 것&amp;quot;을 의미합니다. 확장된 처치-튜링 명제(&amp;ldquo;모든 물리적으로 실현 가능한 계산 모델은 확률적 튜링 기계에 의해 다항 시간 내에 시뮬레이션할 수 있다&amp;rdquo;)를 물리적인 실험을 통해 반증하는 역사적인 시도라고 할 수 있습니다.&lt;/p>
&lt;hr>
&lt;h2 id="3-2019년-google에-의한-양자-우월성-실증">3. 2019년: Google에 의한 양자 우월성 실증
&lt;/h2>&lt;p>2019년 10월, Google Quantum AI 팀은 과학 저널 『Nature』를 통해 53 양자 비트의 초전도 프로세서 &amp;lsquo;Sycamore(시카모어)&amp;lsquo;를 사용하여 양자 우월성을 달성했다고 발표했습니다.&lt;/p>
&lt;h3 id="sycamore-프로세서의-아키텍처">Sycamore 프로세서의 아키텍처
&lt;/h3>&lt;p>Sycamore 프로세서는 2차원 격자 형태로 배치된 54개의 트랜스몬(Transmon)형 초전도 양자 비트로 구성되어 있습니다(실험에서는 1개가 오작동하여 53개를 사용). 인접한 양자 비트 사이에는 가변 결합기(Tunable Coupler)가 배치되어 고속이며 고정밀도인 2 양자 비트 게이트(iSWAP 게이트와 제어 Z 게이트의 하이브리드)를 구현했습니다.&lt;/p>
&lt;div class="mermaid">graph TD
A["양자 알고리즘 입력"] --> B["Sycamore 프로세서 (53 Qubits)"]
B --> C["무작위 양자 게이트 적용"]
C --> D["양자 상태 측정 (비트열)"]
D --> E["교차 엔트로피 벤치마킹 (XEB)"]
E --> F["양자 우월성 검증"]&lt;/div>
&lt;h3 id="무작위-양자-회로-샘플링random-circuit-sampling-rcs">무작위 양자 회로 샘플링(Random Circuit Sampling: RCS)
&lt;/h3>&lt;p>Google이 선택한 작업은 &amp;lsquo;무작위 양자 회로 샘플링&amp;rsquo;입니다. 이는 무작위로 선택된 단일 양자 비트 게이트와 2 양자 비트 게이트를 여러 사이클(깊이 $m$)에 걸쳐 적용하고, 최종 상태를 측정하여 얻어지는 비트열의 확률 분포에서 샘플링을 수행하는 것입니다.&lt;/p>
&lt;p>이상적인(노이즈가 없는) 무작위 양자 회로에서 출력되는 비트열 $x$ 의 확률은 균일 분포가 아니라 포터-토마스 분포(Porter-Thomas distribution)라고 불리는 간섭무늬와 같은 패턴을 보여줍니다. 고전 컴퓨터로 이 분포에서 샘플링을 하려면 상태 벡터 전체의 시뮬레이션이 필요하며, 계산량은 양자 비트 수 $n$ 과 회로의 깊이 $m$ 에 대해 지수함수적으로 증가합니다.&lt;/p>
&lt;h3 id="충실도fidelity-평가-선형-교차-엔트로피-벤치마크xeb">충실도(Fidelity) 평가: 선형 교차 엔트로피 벤치마크(XEB)
&lt;/h3>&lt;p>실험 결과가 단순한 노이즈가 아니라 실제로 양자 계산이 이루어진 결과임을 증명하기 위해, Google은 선형 교차 엔트로피 벤치마크(Linear Cross-Entropy Benchmarking: XEB)를 사용했습니다. 실험에서 얻은 비트열 $x_i$ 에 대한 회로의 이상적인 확률 $P(x_i)$ 를 고전 컴퓨터로 계산하고, 다음 식을 통해 충실도 $\mathcal{F}_{\text{XEB}}$ 를 구합니다.&lt;/p>
$$
\mathcal{F}_{\text{XEB}} = 2^n \langle P(x_i) \rangle_{i} - 1
$$
&lt;p>$\mathcal{F}_{\text{XEB}}$ 가 0이면 완전한 노이즈, 1이면 노이즈가 없는 이상적인 양자 프로세서를 의미합니다. Sycamore 프로세서는 깊이 20의 회로에서 $\mathcal{F}_{\text{XEB}} \approx 0.002$ (0.2%)를 달성했습니다. 언뜻 낮아 보이지만 통계적으로 유의미한 0 이상의 값이며, $2^{53} \approx 9 \times 10^{15}$ 의 상태 공간을 제어한 경이적인 성과였습니다.&lt;/p>
&lt;p>전체 오류율은 개별 게이트 오류, 측정 오류 등의 곱으로 근사적으로 모델링되었습니다.&lt;/p>
$$
\mathcal{F} \approx (1 - e_1)^{N_1}(1 - e_2)^{N_2} \cdots \approx \prod_{g \in 1Q} (1 - e_g) \prod_{g \in 2Q} (1 - e_g) \prod_{q} (1 - e_{RO})
$$
&lt;p>(※ $e_g$ 는 게이트 오류, $e_{RO}$ 는 측정 오류)&lt;/p>
&lt;p>Google은 이 회로를 고전 슈퍼컴퓨터(Summit)로 시뮬레이션하려면 약 1만 년이 걸릴 것이라고 주장했습니다. 반면, Sycamore는 불과 200초 만에 샘플링을 완료했습니다.&lt;/p>
&lt;hr>
&lt;h2 id="4-ibm의-반론-우월성에서-유용성utility으로">4. IBM의 반론: &amp;lsquo;우월성&amp;rsquo;에서 &amp;lsquo;유용성(Utility)&amp;lsquo;으로
&lt;/h2>&lt;p>Google의 발표는 전 세계에 충격을 주었지만, 세계 최대의 슈퍼컴퓨터 &amp;lsquo;Summit&amp;rsquo;을 개발하고 스스로도 양자 컴퓨터 개발을 선도하는 IBM은 즉각적으로 이 주장에 반론을 제기하는 논문을 공개했습니다.&lt;/p>
&lt;h3 id="텐서-네트워크-축약을-통한-고전-시뮬레이션의-개선">텐서 네트워크 축약을 통한 고전 시뮬레이션의 개선
&lt;/h3>&lt;p>IBM 반론의 핵심은 &amp;lsquo;고전 컴퓨터 측의 알고리즘과 자원 최적화가 불충분하다&amp;rsquo;는 점에 있었습니다. Google은 슈뢰딩거 방정식의 시간 발전을 그대로 계산하는 상태 벡터 시뮬레이터를 전제로 1만 년이라는 추정치를 제시했지만, IBM은 &amp;lsquo;텐서 네트워크(Tensor Network)&amp;lsquo;라는 기법을 사용하면 시뮬레이션 시간을 획기적으로 단축할 수 있다고 지적했습니다.&lt;/p>
&lt;p>텐서 네트워크에서는 양자 회로의 게이트 조작을 다차원 배열(텐서) 연산으로 표현하고 네트워크의 &amp;lsquo;축약(Contraction)&amp;rsquo; 순서를 최적화합니다. 게다가 Summit이 가진 250 PB라는 거대한 스토리지(디스크와 메모리의 계층화)를 최대한 활용하면 상태 벡터 전체를 유지하면서 단 &amp;lsquo;2.5일&amp;rsquo; 만에 더 높은 정밀도의 시뮬레이션이 가능하다고 주장했습니다.&lt;/p>
&lt;h3 id="quantum-advantage와-quantum-utility">Quantum Advantage와 Quantum Utility
&lt;/h3>&lt;p>이 논쟁을 계기로 업계 전체의 트렌드는 단순히 &amp;lsquo;고전적으로는 불가능한 인공적 작업을 실행하는 것(Supremacy)&amp;lsquo;에 대한 집착에서, &amp;lsquo;실제 사회의 유용한 문제에 대해 고전적인 접근법보다 실질적인 우위성을 보여주는 것(Quantum Advantage)&amp;rsquo;, 나아가 &amp;lsquo;양자 컴퓨터가 과학적 발견의 새로운 도구로서 기능하는 것(Quantum Utility)&amp;lsquo;이라는 단계로 이행해 갔습니다.&lt;/p>
&lt;p>IBM 자체는 &amp;lsquo;우월성&amp;rsquo;이라는 단어를 피하고, 양자 프로세서의 종합적인 성능 지표로서 &amp;lsquo;양자 볼륨(Quantum Volume)&amp;lsquo;이나 &amp;lsquo;CLOPS (Circuit Layer Operations Per Second)&amp;lsquo;를 제창하며 하드웨어의 규모와 품질의 균형을 중시하는 개발을 진행하고 있습니다.&lt;/p>
&lt;div class="mermaid">timeline
title "양자 마일스톤의 진화"
2019 : "Google Sycamore (53Q)" : "양자 우월성 발표"
2019 : "IBM의 반론" : "2.5일 만의 Summit 슈퍼컴퓨터 시뮬레이션"
2021 : "IBM Eagle (127Q)" : "100 큐비트 장벽 돌파"
2022 : "IBM Osprey (433Q)" : "프로세서 규모의 확장"
2023 : "Google 표면 부호" : "오류 정정 스케일링 (d=3에서 d=5로)"
2023 : "IBM Quantum Utility" : "127Q를 이용한 복잡한 스핀 모델 시뮬레이션"
2024 : "그 이후" : "논리 양자 비트 및 오류 완화의 시대"&lt;/div>
&lt;hr>
&lt;h2 id="5-다음-프론티어-오류-완화error-mitigation와-양자-오류-정정qec">5. 다음 프론티어: 오류 완화(Error Mitigation)와 양자 오류 정정(QEC)
&lt;/h2>&lt;p>현재의 양자 컴퓨터는 &amp;lsquo;NISQ(Noisy Intermediate-Scale Quantum)&amp;lsquo;라고 불리며, 노이즈(외부 환경과의 상호작용이나 제어의 불완전성으로 인한 오류)의 영향을 받기 쉬워 긴 계산을 수행하면 결과가 노이즈에 묻혀버립니다. 이 문제를 극복하기 위한 접근법에는 크게 &amp;lsquo;오류 완화(Error Mitigation)&amp;lsquo;와 &amp;lsquo;양자 오류 정정(Quantum Error Correction)&amp;rsquo; 두 가지가 있습니다.&lt;/p>
&lt;h3 id="오류-완화error-mitigation">오류 완화(Error Mitigation)
&lt;/h3>&lt;p>오류 완화는 양자 하드웨어를 변경하지 않고 고전적인 후처리를 통해 계산 결과의 기댓값에서 노이즈의 영향을 제거하는 기법입니다. IBM은 2023년 127 양자 비트의 &amp;lsquo;Eagle&amp;rsquo; 프로세서와 &amp;lsquo;영점 노이즈 외삽(Zero-Noise Extrapolation: ZNE)&amp;rsquo; 등의 오류 완화 기술을 결합하여, 복잡한 이징 모델의 시간 발전 시뮬레이션에서 최첨단 근사 텐서 네트워크 방법을 뛰어넘는 정확도를 달성하며 &amp;lsquo;Quantum Utility(양자 유용성)&amp;lsquo;를 실증했습니다.&lt;/p>
&lt;h3 id="양자-오류-정정qec과-논리-양자-비트">양자 오류 정정(QEC)과 논리 양자 비트
&lt;/h3>&lt;p>그러나 궁극적으로 임의의 복잡한 알고리즘(예를 들어 Shor의 소인수분해 알고리즘이나 복잡한 양자 화학 계산)을 실행하기 위해서는 오류 완화만으로는 불충분하며, 오류를 동적으로 감지하고 정정하는 &amp;lsquo;양자 오류 정정(QEC)&amp;lsquo;이 필수적입니다.&lt;/p>
&lt;p>QEC의 주류 접근법이 &amp;lsquo;표면 부호(Surface Code)&amp;lsquo;입니다. 이는 여러 물리 양자 비트(데이터 양자 비트)를 2차원 격자 형태로 배치하고, 그 사이에 측정용 양자 비트(앤실라 양자 비트)를 배치하여 &amp;lsquo;안정자(Stabilizer)&amp;lsquo;라고 불리는 패리티 검사를 연속적으로 수행하는 기법입니다.&lt;/p>
&lt;div class="mermaid">graph LR
Q1["데이터 큐비트 (Data)"] --- M1["X 안정자 측정 (Ancilla)"]
Q2["데이터 큐비트 (Data)"] --- M1
Q3["데이터 큐비트 (Data)"] --- M2["Z 안정자 측정 (Ancilla)"]
Q4["데이터 큐비트 (Data)"] --- M2
M1 --> EC["오류 신드롬 디코딩 (Classical)"]
M2 --> EC
EC --> LQ["논리 양자 상태 업데이트"]&lt;/div>
&lt;h4 id="임계값-정리threshold-theorem와-거리-d">임계값 정리(Threshold Theorem)와 거리 $d$
&lt;/h4>&lt;p>양자 오류 정정에는 &amp;lsquo;임계값 정리&amp;rsquo;가 존재합니다. 물리 양자 비트의 오류율 $p$ 가 특정 임계값 $p_{th}$ (표면 부호의 경우 약 1% 내외)를 밑도는 경우, 부호 거리(Distance) $d$ 를 늘림으로써(더 많은 물리 양자 비트를 1개의 논리 양자 비트에 할당함으로써) 논리 오류율 $p_L$ 을 지수함수적으로 낮출 수 있습니다.&lt;/p>
&lt;p>논리 오류율의 근사식은 다음과 같이 표현됩니다.&lt;/p>
$$
p_L \approx \Lambda \left( \frac{p}{p_{th}} \right)^{\frac{d+1}{2}}
$$
&lt;p>여기서 $\Lambda$ 는 상수입니다. $p &lt; p_{th}$ 라면 $d$ 를 키울수록 $p_L$ 은 작아집니다. 그러나 $p > p_{th}$ 인 경우, 물리 양자 비트를 늘릴수록 오히려 노이즈가 축적되어 논리 오류율이 악화되고 맙니다.&lt;/p>
&lt;h4 id="google의-2023년-마일스톤-거리-확장을-통한-오류-감소-실증">Google의 2023년 마일스톤: 거리 확장을 통한 오류 감소 실증
&lt;/h4>&lt;p>2023년 2월, Google은 『Nature』에 기념비적인 논문을 발표했습니다. 그들은 3세대 Sycamore 프로세서를 사용하여 표면 부호의 거리를 $d=3$(17 물리 양자 비트 사용)에서 $d=5$(49 물리 양자 비트 사용)로 확장했을 때, 논리 오류율이 3.028%에서 2.914%로 미세하게 감소하는 것을 세계 최초로 실증한 것입니다.&lt;/p>
&lt;p>이는 $p &lt; p_{th}$ 영역에 발을 들여놓았음을 의미하며, 물리 양자 비트를 늘리면 늘릴수록 성능이 향상된다는, FTQC를 향한 가장 중요한 원리 증명(Proof of Concept)이 완료되었음을 보여줍니다.&lt;/p>
&lt;hr>
&lt;h2 id="6-ftqc결함-허용-양자-컴퓨팅를-향한-로드맵과-전망">6. FTQC(결함 허용 양자 컴퓨팅)를 향한 로드맵과 전망
&lt;/h2>&lt;p>Google과 IBM은 각각 다른 아키텍처와 접근법을 채택하면서도, 최종 목표인 FTQC(Fault-Tolerant Quantum Computing)를 향해 치열한 개발 경쟁을 벌이고 있습니다.&lt;/p>
&lt;h3 id="ibm의-접근법-모듈화와-헤비-헥스-격자">IBM의 접근법: 모듈화와 헤비 헥스 격자
&lt;/h3>&lt;p>IBM은 오류율을 철저히 낮추는 것과 병행하여 프로세서의 스케일업에 주력하고 있습니다. &amp;lsquo;Eagle(127Q)&amp;rsquo;, &amp;lsquo;Osprey(433Q)&amp;rsquo;, &amp;lsquo;Condor(1121Q)&amp;lsquo;로 단일 칩의 한계에 도전하는 한편, &amp;lsquo;Quantum System Two&amp;rsquo;라는 모듈형 아키텍처를 발표했습니다. 또한 양자 비트의 결합 토폴로지에는 불필요한 크로스토크를 줄이고 안정성을 높이는 &amp;lsquo;헤비 헥스(Heavy-Hex) 격자&amp;rsquo;를 채택하고 있습니다. IBM의 전략은 단기적으로는 고도화된 오류 완화로 유용성을 추구하면서 단계적으로 QEC를 도입해 나가는 하이브리드 접근법입니다.&lt;/p>
&lt;h3 id="google의-접근법-논리-양자-비트의-품질-향상">Google의 접근법: 논리 양자 비트의 품질 향상
&lt;/h3>&lt;p>Google의 전략은 물리 양자 비트의 수를 급격히 늘리기보다는 1개의 논리 양자 비트 오류율을 극한까지 낮추는(예를 들어 $10^{-6}$ 까지 낮추는) 데 중점을 두고 있습니다. 그 바탕 위에 모듈 간 양자 상태를 전송하는 기술(Quantum Interconnects)을 확립하여, 수천~수만 개의 물리 양자 비트를 병렬로 동작시키는 대규모 시스템을 목표로 하고 있습니다.&lt;/p>
&lt;p>매직 상태 증류(Magic State Distillation) 등 비클리포드 게이트를 결함 허용적으로 실행하기 위한 프로토콜 구현도 앞으로의 큰 기술적 장애물이 됩니다. 실용적인 Shor의 알고리즘을 실행하여 2048비트의 RSA 암호를 해독하려면 오류율 $10^{-8}$ 이하의 논리 양자 비트가 수천 개, 물리 양자 비트로 환산하면 수백만~수천만 개가 필요하다고 알려져 있어 아직 갈 길이 멉니다.&lt;/p>
&lt;hr>
&lt;h2 id="7-맺음말">7. 맺음말
&lt;/h2>&lt;p>&amp;lsquo;양자 우월성&amp;rsquo;은 양자 컴퓨터 역사상 계산기의 이론적 잠재력을 물리적으로 증명한 중요한 마일스톤이었습니다. Google이 2019년에 보여준 실증과 IBM의 건설적인 반론은 업계 전체를 단순한 이론적 증명에서 벗어나, 실제 유용성(Utility)의 추구, 그리고 최종적인 결함 허용 양자 컴퓨팅(FTQC)을 향한 본격적인 엔지니어링 시대로 밀어 올렸습니다.&lt;/p>
&lt;p>현재 우리는 노이즈투성이인 NISQ 장치에서 오류 정정 기능을 갖춘 논리 양자 비트 장치로 넘어가는 과도기에 서 있습니다. 앞으로 몇 년에서 십 년 사이에 새로운 재료 과학의 발견, 신약 개발 프로세스의 혁명, 그리고 최적화 문제의 돌파구가 이러한 양자 하드웨어의 진화와 함께 현실이 될 것입니다.&lt;/p>
&lt;p>미래의 컴퓨터 과학을 형성해 나갈 Google과 IBM, 그리고 전 세계 연구자들의 동향에서 앞으로도 눈을 뗄 수 없습니다.&lt;/p></description></item><item><title>포스트 양자 시대의 블록체인·가상화폐는 어떻게 변할까?</title><link>http://kenji.blog/ko/p/post-quantum-blockchain-and-crypto/</link><pubDate>Fri, 11 Sep 2026 17:00:00 +0900</pubDate><guid>http://kenji.blog/ko/p/post-quantum-blockchain-and-crypto/</guid><description>&lt;img src="http://kenji.blog/p/post-quantum-blockchain-and-crypto/img/eyecatch.jpg" alt="Featured image of post 포스트 양자 시대의 블록체인·가상화폐는 어떻게 변할까?" />&lt;h2 id="1-인트로덕션-포스트-양자-시대의-발소리와-블록체인의-위기">1. 인트로덕션: 포스트 양자 시대의 발소리와 블록체인의 위기
&lt;/h2>&lt;p>2009년 사토시 나카모트에 의해 비트코인(Bitcoin)이 탄생한 이래, 블록체인 기술은 &amp;lsquo;탈중앙화되고 위변조가 불가능한 원장&amp;rsquo;으로서 전 세계 금융 시스템과 애플리케이션의 기반으로 성장했습니다. 이러한 견고한 보안을 지탱하고 있는 것이 **공개키 암호(Public Key Cryptography)**와 **암호학적 해시 함수(Cryptographic Hash Functions)**라는 현대 암호 기술입니다.&lt;/p>
&lt;p>이러한 암호 기술은 고전적인 컴퓨터(현재 우리가 사용하고 있는 PC나 슈퍼컴퓨터)로는 우주의 수명만큼의 시간을 들여도 해독할 수 없다는 수학적인 &amp;lsquo;계산 곤란성(Computational Hardness)&amp;lsquo;을 근거로 안전성을 보장하고 있습니다.&lt;/p>
&lt;p>하지만 이 전제는 물리학과 정보과학의 프론티어인 **양자 컴퓨터(Quantum Computers)**의 급속한 발전과 실용화로 인해 근본부터 뒤집히려 하고 있습니다. 양자역학 특유의 &amp;lsquo;중첩(Superposition)&amp;lsquo;이나 &amp;lsquo;양자 얽힘(Entanglement)&amp;lsquo;을 이용하는 양자 컴퓨터는 특정 수학적 문제에 있어 기존의 고전 컴퓨터를 압도하는 계산 능력, 이른바 &amp;lsquo;양자 초월성(Quantum Supremacy)&amp;lsquo;을 발휘합니다.&lt;/p>
&lt;p>본 기사에서는 블록체인 기술이 양자 컴퓨터에 의해 구체적으로 어떤 위협에 직면해 있는지, 그리고 그 해결책이 될 **내양자 암호(PQC: Post-Quantum Cryptography)**의 최신 동향과 암호자산 네트워크의 전환 시나리오에 대해 기술적이고 수리적인 관점에서 철저하게 깊이 파고들어 해설합니다.&lt;/p>
&lt;hr>
&lt;h2 id="2-양자-컴퓨터의-기초와-블록체인에-미치는-2가지-큰-위협">2. 양자 컴퓨터의 기초와 블록체인에 미치는 2가지 큰 위협
&lt;/h2>&lt;p>현재의 블록체인 시스템은 주로 다음 2가지 암호 요소로 구성되어 있으며, 이들은 각각 양자 알고리즘에 의한 서로 다른 위협에 노출되어 있습니다.&lt;/p>
&lt;div class="mermaid">graph TD
A["양자 컴퓨터의 경이적인 계산 능력"] --> B["쇼어의 알고리즘 (Shor's Algorithm)"]
A --> C["그로버의 알고리즘 (Grover's Algorithm)"]
B --> D["공개키 암호 (ECDSA/RSA/DSA) 의 붕괴"]
C --> E["암호학적 해시 함수 (SHA-256) 에 미치는 영향"]
D --> F["타인의 비밀키 특정 및 트랜잭션 위조"]
E --> G["PoW 마이닝의 우위성 및 일부 주소에 대한 공격"]
F --> H["블록체인에 있어 치명적이고 직접적인 위협"]
G --> I["알고리즘 조정 (키 길이 확장 등) 으로 대응 가능한 위협"]
style H fill:#ff9999,stroke:#cc0000,stroke-width:2px;
style I fill:#ffff99,stroke:#cccc00,stroke-width:2px;&lt;/div>
&lt;h3 id="21-타원곡선-암호ecdsa의-기초와-계산-곤란성">2.1. 타원곡선 암호(ECDSA)의 기초와 계산 곤란성
&lt;/h3>&lt;p>비트코인이나 이더리움(Ethereum)을 비롯한 많은 블록체인은 디지털 서명 알고리즘으로 **타원곡선 디지털 서명 알고리즘(ECDSA: Elliptic Curve Digital Signature Algorithm)**을 채택하고 있습니다. 구체적으로 비트코인은 &lt;code>secp256k1&lt;/code>이라는 매개변수의 타원곡선을 사용합니다.&lt;/p>
&lt;p>타원곡선 암호의 안전성은 **타원곡선 이산대수 문제(ECDLP: Elliptic Curve Discrete Logarithm Problem)**의 계산 곤란성에 의존하고 있습니다.
타원곡선은 아래의 바이어슈트라스(Weierstrass) 표준형으로 표현되는 방정식으로 정의됩니다.&lt;/p>
$$
y^2 \equiv x^3 + ax + b \pmod{p}
$$
&lt;p>비트코인의 &lt;code>secp256k1&lt;/code>에서는 $a = 0, b = 7$이며, $p$는 매우 큰 소수입니다.
이 곡선 상에 있는 베이스 포인트(기준점)를 $G$라 하고, 무작위로 선택된 256비트의 거대한 정수인 비밀키를 $k$라고 합니다. 이때, 공개키 $K$는 베이스 포인트의 $k$번 덧셈(스칼라 곱셈)을 통해 구해집니다.&lt;/p>
$$
K = k \times G = \underbrace{G + G + \dots + G}_{k \text{ times}}
$$
&lt;p>고전 컴퓨터를 사용하여 공개된 공개키 $K$와 베이스 포인트 $G$로부터 비밀키 $k$를 역산(이산대수를 구함)하는 것은, 폴라드 로(Pollard&amp;rsquo;s rho) 알고리즘과 같은 최선의 고전적 알고리즘을 사용하더라도 $\mathcal{O}(\sqrt{p})$의 지수함수적인 계산 시간이 걸립니다. 256비트 키의 경우 약 $2^{128}$번의 연산이 필요하며, 이는 현재의 슈퍼컴퓨터를 수십억 년 가동해도 풀 수 없는 수준입니다.&lt;/p>
&lt;h3 id="22-쇼어의-알고리즘shors-algorithm에-의한-붕괴">2.2. 쇼어의 알고리즘(Shor&amp;rsquo;s Algorithm)에 의한 붕괴
&lt;/h3>&lt;p>하지만 1994년에 피터 쇼어가 발표한 &lt;strong>쇼어의 알고리즘&lt;/strong>은 이 전제를 완전히 파괴했습니다. 쇼어의 알고리즘은 원래 소인수분해 문제(RSA 암호의 기반)를 다항식 시간에 풀기 위해 제안되었지만, 이산대수 문제나 타원곡선 이산대수 문제에도 적용 가능합니다.&lt;/p>
&lt;p>쇼어 알고리즘의 핵심은 **양자 푸리에 변환(QFT: Quantum Fourier Transform)**을 사용하여 함수의 &amp;lsquo;주기(Period)&amp;lsquo;를 고속으로 찾아내는 데 있습니다.&lt;/p>
$$
\text{고전적인 계산량} = \mathcal{O}(2^{n/2}) \quad (n\text{은 비트 길이})
$$
$$
\text{양자 알고리즘의 계산량} = \mathcal{O}(n^3)
$$
&lt;p>이처럼 쇼어의 알고리즘은 지수함수적인 시간을 **다항식 시간(Polynomial Time)**으로 극적으로 단축시킵니다. 충분한 논리적 양자 비트를 가진 양자 컴퓨터가 완성되면 네트워크 상에 공개된 공개키 $K$로부터 단 몇 분 또는 몇 초 만에 비밀키 $k$를 특정할 수 있게 됩니다. 이로 인해 공격자는 타인 지갑의 비밀키를 쉽게 입수하여 자금을 완전히 장악할 수 있게 됩니다.&lt;/p>
&lt;h4 id="221-쇼어의-알고리즘에-의한-ecdlp-해독의-단계별-과정">2.2.1 쇼어의 알고리즘에 의한 ECDLP 해독의 단계별 과정
&lt;/h4>&lt;p>양자 컴퓨터가 어떻게 타원곡선 이산대수 문제(ECDLP)를 푸는지, 그 내부 프로세스를 순서대로 살펴보겠습니다.&lt;/p>
&lt;p>문제 설정: $K = k \times G$에서 $G$와 $K$를 알고 있으며, 미지의 정수 $k$(비밀키)를 구하고자 합니다. 타원곡선의 위수(order)를 $N$이라고 합니다.&lt;/p>
&lt;p>&lt;strong>Step 1: 중첩 상태 생성&lt;/strong>
먼저 2개의 양자 레지스터를 준비하고 각각에 아다마르 게이트(Hadamard Gate)를 적용하여 가능한 모든 정수 조합의 중첩 상태를 생성합니다.
&lt;/p>
$$
|\psi_1\rangle = \frac{1}{N} \sum_{x=0}^{N-1} \sum_{y=0}^{N-1} |x\rangle |y\rangle |0\rangle
$$
&lt;p>&lt;strong>Step 2: 양자 오라클 적용 (함수 평가)&lt;/strong>
다음으로 타원곡선 상의 점 덧셈을 수행하는 양자 회로(오라클)를 사용하여 함수 $f(x, y) = x \times G + y \times K$를 제3 레지스터에 계산합니다.
&lt;/p>
$$
|\psi_2\rangle = \frac{1}{N} \sum_{x=0}^{N-1} \sum_{y=0}^{N-1} |x\rangle |y\rangle |x \times G + y \times K\rangle
$$
&lt;p>
여기서 중요한 것은 $K = k \times G$이므로 $f(x, y) = (x + y \cdot k) \times G$로 다시 쓸 수 있다는 점입니다.&lt;/p>
&lt;p>&lt;strong>Step 3: 제3 레지스터 측정&lt;/strong>
제3 레지스터를 측정하면 어떤 타원곡선 상의 점 $R$로 수축(collapse)합니다. 이로 인해 제1, 제2 레지스터는 $x + y \cdot k \equiv c \pmod{N}$ ($c$는 상수)를 만족하는 $(x, y)$ 쌍의 중첩 상태로 수축합니다.
&lt;/p>
$$
|\psi_3\rangle = \frac{1}{\sqrt{N}} \sum_{y=0}^{N-1} |c - y \cdot k \pmod{N}\rangle |y\rangle
$$
&lt;p>&lt;strong>Step 4: 양자 푸리에 변환(QFT) 적용&lt;/strong>
이 상태는 주기 $k$와 관련된 주기성을 가지고 있습니다. 여기에 역 양자 푸리에 변환(Inverse QFT)을 적용함으로써 위상의 간섭을 일으켜 주기 정보를 진폭으로 변환합니다.&lt;/p>
&lt;p>&lt;strong>Step 5: 측정과 고전적 후처리&lt;/strong>
제1, 제2 레지스터를 측정하면 높은 확률로 $k$에 관한 정보를 포함하는 값을 얻을 수 있습니다. 측정된 값에 대해 연분수 전개(Continued Fractions)와 같은 고전적인 정수론 알고리즘을 적용함으로써 미지의 비밀키 $k$를 완전히 특정할 수 있습니다.&lt;/p>
&lt;p>이 전체 프로세스에서 필요로 하는 양자 게이트의 수는 $\mathcal{O}(\log^3 N)$이며, 고전 컴퓨터를 통한 $\mathcal{O}(\sqrt{N})$의 탐색과는 비교할 수 없을 정도의 초고속으로 비밀키를 파헤칩니다.&lt;/p>
&lt;h3 id="23-그로버의-알고리즘grovers-algorithm과-해시-함수에-미치는-영향">2.3. 그로버의 알고리즘(Grover&amp;rsquo;s Algorithm)과 해시 함수에 미치는 영향
&lt;/h3>&lt;p>또 다른 위협은 1996년 로브 그로버(Lov Grover)가 제안한 &lt;strong>그로버의 알고리즘&lt;/strong>입니다. 이는 해시 함수(예: SHA-256)에 큰 영향을 미칩니다.&lt;/p>
&lt;p>블록체인에서 해시 함수는 데이터 무결성 보장, 주소 생성, 그리고 비트코인의 &lt;strong>PoW(Proof of Work) 마이닝&lt;/strong> 기반으로 사용되고 있습니다. 해시 함수의 역산(원상 계산)은 특정 출력값 $y$에 대해 $H(x) = y$가 되는 입력값 $x$를 찾는 &amp;lsquo;비구조화 데이터베이스 탐색 문제&amp;rsquo;로 간주할 수 있습니다.&lt;/p>
&lt;p>고전 컴퓨터에서는 $N$개의 가능성 중에서 정답을 찾기 위해 평균적으로 $\frac{N}{2}$번, 최악의 경우 $N$번의 시도가 필요합니다. 즉, 계산량은 $\mathcal{O}(N)$입니다.
하지만 그로버의 알고리즘은 &amp;lsquo;진폭 증폭(Amplitude Amplification)&amp;lsquo;이라 불리는 양자 기술을 사용합니다. 중첩 상태에 있는 모든 가능성 중에서 정답이 되는 상태의 확률 진폭을 반복적으로 증폭시킴으로써 탐색 시간을 제곱근으로 단축시킵니다.&lt;/p>
$$
\text{그로버의 알고리즘의 계산량} = \mathcal{O}(\sqrt{N})
$$
&lt;p>SHA-256의 경우 $N = 2^{256}$이므로 고전적인 무차별 대입(Brute-force) 탐색으로는 약 $2^{256}$번의 시도가 필요합니다. 하지만 그로버의 알고리즘을 사용하면 $\sqrt{2^{256}} = 2^{128}$번의 시도만으로 충분하게 됩니다. 이는 256비트의 해시 함수가 양자 컴퓨터에 대해서는 &lt;strong>실질적으로 128비트의 보안 강도로 반감된다&lt;/strong>는 것을 의미합니다.&lt;/p>
&lt;h4 id="231-sha-256은-살아남을-것인가-quantum-supremacy-in-hashing">2.3.1. SHA-256은 살아남을 것인가? (Quantum Supremacy in Hashing)
&lt;/h4>&lt;p>보안이 절반으로 줄어든다고는 해도 &amp;lsquo;128비트의 보안&amp;rsquo;은 여전히 극도로 견고합니다. $2^{128}$번의 연산은 현재의 기술 수준에서 보아도 천문학적인 수치이며, 우주의 수명 스케일의 시간이 필요합니다.
따라서 **&amp;ldquo;SHA-256은 양자 컴퓨터에 대해서도 실용적인 안전성을 유지한다&amp;rdquo;**고 널리 여겨지고 있습니다. 향후 보안 여유도를 높일 필요가 있는 경우에는 단순히 해시의 출력 길이를 2배(예: SHA-256에서 SHA-512로의 전환)로 늘리는 것만으로 고전적인 256비트 보안을 양자 세계에서도 유지할 수 있습니다.&lt;/p>
&lt;p>결론적으로 해시 함수에 대한 양자의 위협은 &amp;lsquo;경미하고 대응 가능&amp;rsquo;한 반면, 공개키 암호(ECDSA)에 대한 위협은 &amp;lsquo;치명적&amp;rsquo;이라고 할 수 있습니다.&lt;/p>
&lt;hr>
&lt;h2 id="3-현재의-암호자산bitcoin-ethereum에-미치는-구체적인-영향-분석">3. 현재의 암호자산(Bitcoin, Ethereum)에 미치는 구체적인 영향 분석
&lt;/h2>&lt;p>양자 컴퓨터에 의한 ECDSA 해독이 가능해진 세계에서 암호자산 네트워크는 구체적으로 어떤 취약성에 직면하게 될까요? 여기서는 비트코인의 구조를 예로 들어 **&amp;lsquo;공개키의 노출 타이밍&amp;rsquo;**이라는 관점에서 상세한 분석을 진행합니다.&lt;/p>
&lt;h3 id="31-주소-생성과-공개키의-비공개성">3.1. 주소 생성과 공개키의 &amp;lsquo;비공개성&amp;rsquo;
&lt;/h3>&lt;p>비트코인의 주소(P2PKH: Pay-to-Public-Key-Hash나 P2WPKH: Pay-to-Witness-Public-Key-Hash)는 공개키 그 자체가 아니라 공개키를 여러 번 해시화한 것을 사용합니다.&lt;/p>
$$
\text{Bitcoin Address} = \text{Base58Check}(\text{RIPEMD160}(\text{SHA256}(\text{Public Key})))
$$
&lt;p>앞서 언급했듯이 해시 함수는 양자 공격(그로버의 알고리즘)에 대해 내성을 가지므로, 해시값인 &amp;lsquo;주소&amp;rsquo;로부터 원래의 &amp;lsquo;공개키&amp;rsquo;를 역산하는 것은 양자 컴퓨터로도 불가능합니다.
즉, **&amp;lsquo;미사용(한 번도 자금을 송금하지 않은) 주소&amp;rsquo;**에 대해서는 블록체인 상에 공개키가 일절 노출되어 있지 않고 해시값만이 기록되어 있는 상태입니다. 따라서 공개키를 모르는 이상 쇼어의 알고리즘을 실행할 표적이 존재하지 않아 비밀키를 특정할 수 없습니다. 이 상태의 지갑은 양자적으로 안전(Quantum-safe)하다고 할 수 있습니다.&lt;/p>
&lt;h3 id="32-트랜잭션-송신-시의-치명적인-취약성프론트-러닝-공격">3.2. 트랜잭션 송신 시의 치명적인 취약성(프론트 러닝 공격)
&lt;/h3>&lt;p>문제가 발생하는 것은 사용자가 자금을 송금하는 타이밍입니다.
트랜잭션을 네트워크에 브로드캐스트(송신)할 때, 사용자는 디지털 서명과 함께 검증을 위해 &lt;strong>자신의 공개키를 트랜잭션 데이터 내에 포함시켜 네트워크 전체에 공개&lt;/strong>해야 합니다.&lt;/p>
&lt;div class="mermaid">sequenceDiagram
participant User as "사용자 (앨리스)"
participant Mempool as "Mempool (미승인 거래 풀)"
participant QuantumAttacker as "양자 공격자"
participant Miner as "마이너 (블록 생성)"
User->>Mempool: 트랜잭션 송신 (공개키 + 서명 포함)
Mempool-->>QuantumAttacker: 네트워크 상의 공개키를 감청
note right of QuantumAttacker: 쇼어의 알고리즘을 수 분 내로 실행&lt;br/>(공개키로부터 비밀키 산출)
QuantumAttacker->>QuantumAttacker: 앨리스의 비밀키를 사용해 새로운 서명 생성
QuantumAttacker->>Mempool: 더 높은 마이너 수수료로 부정 송금을 브로드캐스트
Miner->>Miner: 수수료(Gas)가 높은 부정 트랜잭션을 우선하여 블록에 포함
Miner-->>User: 블록체인에 기록 (앨리스의 자금 상실)&lt;/div>
&lt;p>일단 공개키가 Mempool(미승인 트랜잭션의 대기 장소)에 송신되면, 그 데이터는 전 세계의 노드에 공유됩니다. 만약 공격자가 초고속 양자 컴퓨터를 보유하고 있다면, 다음의 프로세스로 자금을 빼앗을 수 있습니다.&lt;/p>
&lt;ol>
&lt;li>Mempool에서 정당한 사용자(앨리스)의 트랜잭션을 감청하여 &lt;strong>공개키를 추출&lt;/strong>한다.&lt;/li>
&lt;li>쇼어의 알고리즘을 실행하여 공개키로부터 &lt;strong>비밀키를 수 분 이내(블록이 승인되기 전)에 계산&lt;/strong>한다.&lt;/li>
&lt;li>획득한 비밀키를 사용하여 앨리스의 자금을 공격자의 주소로 송금하는 &lt;strong>가짜 트랜잭션을 생성&lt;/strong>한다.&lt;/li>
&lt;li>이 가짜 트랜잭션에 앨리스의 원래 트랜잭션보다 &lt;strong>훨씬 높은 마이너 수수료(Fee)를 설정&lt;/strong>하여 네트워크에 송신한다.&lt;/li>
&lt;/ol>
&lt;p>마이너는 경제적 인센티브에 따라 수수료가 높은 트랜잭션을 우선적으로 블록에 포함시킵니다. 결과적으로 공격자의 부정 송금이 먼저 승인(Confirm)되고, 앨리스의 정당한 송금은 &amp;lsquo;잔고 부족(Double Spend)&amp;lsquo;으로 파기됩니다.
이 일련의 흐름은 **프론트 러닝 공격(Front-running Attack)**이라 불리며, 양자 컴퓨터가 실용화된 세계에서는 누군가가 송금 버튼을 누른 순간에 자금을 해커에게 빼앗기는 끔찍한 사태를 야기합니다.&lt;/p>
&lt;h3 id="33-재사용-주소와-오래된-주소p2pk의-위기">3.3. 재사용 주소와 오래된 주소(P2PK)의 위기
&lt;/h3>&lt;p>더욱 심각한 문제로, 과거에 한 번이라도 송금을 한 적이 있는 주소(잔돈 주소 등으로 재사용하고 있는 경우)는 이미 블록체인 상에 공개키가 영구적으로 기록되어 있습니다. 이들은 트랜잭션 송신을 기다릴 것도 없이 언제든지 비밀키가 계산되어 잔고를 빼앗길 위험에 노출되어 있습니다.&lt;/p>
&lt;p>또한, 사토시 나카모토의 초기 마이닝 보상(약 100만 BTC 이상)을 포함하여 2009년~2010년경에 주류였던 &lt;strong>P2PK(Pay-to-Public-Key)&lt;/strong> 포맷에서는 주소로 해시가 아닌 공개키 자체가 직접 블록체인에 기록되었습니다. 이러한 대량의 휴면 비트코인은 양자 컴퓨터에게 가장 쉬운 표적이 되어 일제히 도난당하고 시장에 덤핑됨으로써 가격 대폭락을 일으킬 가능성이 있습니다.&lt;/p>
&lt;hr>
&lt;h2 id="4-내양자-암호pqc-post-quantum-cryptography로의-전환-시나리오">4. 내양자 암호(PQC: Post-Quantum Cryptography)로의 전환 시나리오
&lt;/h2>&lt;p>이러한 &amp;lsquo;Q-Day(양자 컴퓨터에 의한 암호 돌파의 날)&amp;lsquo;의 파국을 피하기 위해, 암호학계와 블록체인 커뮤니티는 양자 알고리즘으로도 해독이 어려운 **내양자 암호(PQC)**로의 전환을 계획하고 있습니다.
미국 국립표준기술연구소(NIST)는 수년간 PQC의 표준화 프로세스를 진행해 왔으며, 수차례에 걸친 엄격한 평가를 거쳐 유망한 몇 가지 암호 방식이 최종 표준으로 선정되었습니다.&lt;/p>
&lt;p>블록체인의 디지털 서명 대체재로 주목받고 있는 주요 PQC 알고리즘을 그 수리적 메커니즘과 함께 상세히 해설합니다.&lt;/p>
&lt;h3 id="41-해시-기반-서명hash-based-signatures">4.1. 해시 기반 서명(Hash-Based Signatures)
&lt;/h3>&lt;p>해시 기반 서명은 그 안전성이 &amp;lsquo;해시 함수의 충돌 내성&amp;rsquo;이라는 매우 단순하고 견고한 기반에만 의존하는 암호 방식입니다. 양자 컴퓨터에 대한 해시 함수의 안전성은 이미 증명되었기 때문에(앞서 언급했듯이 128비트의 보안 여유도만 있으면 충분함) 매우 신뢰성이 높은 접근 방식입니다.
대표적인 것으로 **램포트 서명(Lamport Signatures)**이나 이를 확장한 WOTS(Winternitz One-Time Signature), 그리고 NIST 표준화 후보인 &lt;strong>SPHINCS+&lt;/strong>(현재는 FIPS 205로서 SLH-DSA라 불림)가 있습니다.&lt;/p>
&lt;h4 id="411-램포트-서명의-수리적-상세-one-time-signature">4.1.1. 램포트 서명의 수리적 상세 (One-Time Signature)
&lt;/h4>&lt;p>램포트 서명의 구조를 더욱 수학적으로 상세히 살펴보겠습니다.
해시 함수를 $H: \{0, 1\}^* \to \{0, 1\}^{256}$이라고 합시다.&lt;/p>
&lt;p>&lt;strong>【키 생성】&lt;/strong>
앨리스(송신자)는 진난수 생성기(TRNG)를 사용하여 256쌍의 비밀키 쌍을 생성합니다.
&lt;/p>
$$
\text{sk}_{i,0} \in \{0, 1\}^{256}, \quad \text{sk}_{i,1} \in \{0, 1\}^{256} \quad (1 \le i \le 256)
$$
&lt;p>
이로 인해 비밀키 $\text{sk}$는 총 512개의 256비트 문자열로 구성됩니다(크기: $512 \times 32 = 16,384$ 바이트).&lt;/p>
&lt;p>다음으로 공개키 $\text{pk}$를 계산합니다. 각 비밀키 컴포넌트를 각각 해시화합니다.
&lt;/p>
$$
\text{pk}_{i,0} = H(\text{sk}_{i,0}), \quad \text{pk}_{i,1} = H(\text{sk}_{i,1})
$$
&lt;p>
공개키 역시 동일하게 $16,384$ 바이트가 됩니다. 이를 블록체인 네트워크에 공개합니다.&lt;/p>
&lt;p>&lt;strong>【서명 생성】&lt;/strong>
앨리스는 트랜잭션 데이터 $M$에 서명하기 위해 먼저 그 해시값을 계산합니다.
&lt;/p>
$$
h = H(M) \in \{0, 1\}^{256}
$$
&lt;p>
해시값 $h$의 $i$번째 비트를 $h_i \in \{0, 1\}$이라고 합니다.
앨리스의 서명 $\sigma$는 각 비트 $h_i$에 대응하는 비밀키 컴포넌트의 집합이 됩니다.
&lt;/p>
$$
\sigma = (\text{sk}_{1, h_1}, \text{sk}_{2, h_2}, \dots, \text{sk}_{256, h_{256}})
$$
&lt;p>
즉, 메시지 해시의 비트가 &lt;code>0&lt;/code>이라면 $\text{sk}_{i,0}$을 공개하고, &lt;code>1&lt;/code>이라면 $\text{sk}_{i,1}$을 공개합니다. 서명 크기는 $256 \times 32 = 8,192$ 바이트가 됩니다.&lt;/p>
&lt;p>&lt;strong>【서명 검증】&lt;/strong>
마이너(검증자)는 수신한 트랜잭션 $M$과 서명 $\sigma = (s_1, s_2, \dots, s_{256})$, 그리고 공개키 $\text{pk}$를 사용하여 검증을 수행합니다.
트랜잭션의 해시 $h = H(M)$을 재계산하여, 각 $s_i$를 해시화한 것이 공개키의 대응하는 요소 $\text{pk}_{i, h_i}$와 일치하는지 확인합니다.
&lt;/p>
$$
H(s_i) \overset{?}{=} \text{pk}_{i, h_i} \quad (\text{for all } 1 \le i \le 256)
$$
&lt;p>이 프로세스는 수학적으로 지극히 단순하며, 양자 컴퓨터가 $H$의 역산을 할 수 없는 한 서명을 위조하는 것은 불가능합니다. 하지만 한 번 서명을 하면 비밀키의 절반이 네트워크에 노출되기 때문에 같은 키 쌍으로 다른 메시지에 서명하게 되면 노출된 비밀키들이 조합되어 공격자에게 위조의 여지를 주게 되므로, &amp;lsquo;단 한 번(One-Time)&amp;lsquo;밖에 쓸 수 없다는 강한 제약이 생깁니다.
이를 실용화하기 위해 머클 트리(Merkle Tree)를 사용하여 다수의 원타임 키를 하나의 루트 공개키로 묶는 &lt;strong>XMSS&lt;/strong>나 상태 비저장(Stateless) 방식인 &lt;strong>SPHINCS+&lt;/strong> 등의 기술이 개발되었으나, 서명 크기가 수십 킬로바이트에 달한다는 단점이 있습니다.&lt;/p>
&lt;h3 id="42-격자-기반-암호lattice-based-cryptography">4.2. 격자 기반 암호(Lattice-Based Cryptography)
&lt;/h3>&lt;p>현재 PQC의 주류로서 가장 기대받고 있으며, NIST의 메인 표준 규격(FIPS 204: ML-DSA / 구 CRYSTALS-Dilithium이나 Falcon 등)으로 채택된 것이 &lt;strong>격자 기반 암호&lt;/strong>입니다.&lt;/p>
&lt;p>격자 기반 암호의 안전성은 &amp;lsquo;다차원 격자에서의 최단 벡터 문제(SVP: Shortest Vector Problem)&amp;lsquo;나 &amp;lsquo;오차가 있는 학습 문제(LWE: Learning With Errors)&amp;lsquo;와 같이 수학적으로 증명된 어려운 문제에 의존하고 있습니다. 격자 문제는 양자 컴퓨터를 사용하더라도 효율적으로 푸는 알고리즘이 발견되지 않았습니다.&lt;/p>
&lt;p>&lt;strong>LWE(Learning With Errors)의 수리 모델:&lt;/strong>
LWE 문제의 기본적인 아이디어는 연립일차방정식에 의도적으로 &amp;lsquo;작은 노이즈(오차)&amp;lsquo;를 더함으로써 문제를 극적으로 어렵게 만든다는 것입니다.
비밀 벡터를 $\mathbf{s} \in \mathbb{Z}_q^n$이라고 합시다.
무작위로 선택된 거대한 공개 행렬 $\mathbf{A} \in \mathbb{Z}_q^{m \times n}$과 의도적으로 부가되는 작은 노이즈 벡터 $\mathbf{e} \in \mathbb{Z}_q^m$이 있습니다.
공개키 $\mathbf{b}$는 다음과 같이 계산됩니다.&lt;/p>
$$
\mathbf{b} = \mathbf{A}\mathbf{s} + \mathbf{e} \pmod{q}
$$
&lt;p>행렬 $\mathbf{A}$와 벡터 $\mathbf{b}$(공개키)가 공개되어 있더라도 그로부터 비밀키 $\mathbf{s}$를 역산하는 것은 노이즈 $\mathbf{e}$의 존재로 인해 매우 어려워집니다. 노이즈가 없다면 단순한 가우스 소거법으로 풀 수 있지만, 노이즈가 있음으로써 모든 차원에서의 탐색 공간이 폭발적으로 증가하여 고전 컴퓨터와 양자 컴퓨터 모두에 대해 견고한 보안을 제공합니다.
블록체인 등에서 사용되는 실제 알고리즘(Dilithium 등)에서는 이를 다항식 환(Polynomial Ring) 위에서 전개한 **Ring-LWE(또는 Module-LWE)**가 사용되어, 키 크기 축소 및 계산의 고속화가 이루어지고 있습니다.&lt;/p>
&lt;ul>
&lt;li>&lt;strong>장점&lt;/strong>: 해시 기반 서명에 비해 공개키나 서명의 크기가 비교적 작고(수 킬로바이트 정도), 서명 생성 및 검증의 계산 속도가 매우 빠릅니다(ECDSA와 동등 이상).&lt;/li>
&lt;li>&lt;strong>단점&lt;/strong>: 수학적인 구조가 복잡하고 역사적인 검증 기간이 짧기 때문에, 향후 새로운 해독 알고리즘이 발견될 위험이 제로는 아닙니다.&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h2 id="5-블록체인의-pqc-전환에-있어서의-기술적-과제">5. 블록체인의 PQC 전환에 있어서의 기술적 과제
&lt;/h2>&lt;p>PQC 알고리즘(Dilithium이나 SPHINCS+ 등)이 존재한다고 해서 이를 내일 당장 비트코인이나 이더리움에 도입할 수 있는 것은 아닙니다. 분산형 시스템 특유의 무거운 과제들이 여러 가지 존재합니다.&lt;/p>
&lt;h3 id="51-서명-크기의-비대화와-확장성의-붕괴">5.1. 서명 크기의 비대화와 확장성의 붕괴
&lt;/h3>&lt;p>PQC 도입에 있어서 가장 큰 장벽은 데이터 크기의 대폭적인 비대화입니다.
현재 ECDSA의 서명 크기가 약 70바이트인 것에 반해, 격자 기반 암호인 Dilithium(ML-DSA)에서는 서명 크기가 약 2,420바이트~4,595바이트(보안 레벨에 따라 다름)이며 공개키 크기도 1,300바이트를 넘습니다. 해시 기반인 SPHINCS+에 이르러서는 서명만으로 수만 바이트에 달합니다.&lt;/p>
&lt;p>만약 비트코인이 현재와 동일한 블록 크기 상한(SegWit 포함 약 4MB의 가중치) 그대로 PQC를 도입할 경우, 1개의 블록에 저장할 수 있는 트랜잭션의 수는 격감합니다. 네트워크의 처리량(TPS: Transactions Per Second)은 파멸적으로 저하되고 송금 지연이 상태화될 것입니다.
이를 해결하기 위해서는 블록 크기를 대폭 늘려야 하지만, 이는 풀 노드의 스토리지 요구 사항이나 네트워크 대역폭 요구 사항을 증대시켜 개인의 노드 운영을 어렵게 만들고, 결과적으로 &lt;strong>네트워크의 중앙집권화&lt;/strong>를 초래한다는 딜레마에 빠지게 됩니다.&lt;/p>
&lt;div class="mermaid">pie title "블록체인에서의 서명 데이터 크기 비교 (개념도)"
"ECDSA (약 70 Bytes)" : 2
"Dilithium ML-DSA (약 2,500 Bytes)" : 58
"SPHINCS+ (약 17,000 Bytes)" : 40&lt;/div>
&lt;p>&lt;em>(※ PQC 도입에 따른 트랜잭션 데이터의 비대화는 확장성에 대한 치명적인 병목이 됩니다)&lt;/em>&lt;/p>
&lt;h3 id="52-ethereum-virtual-machine-evm에-미치는-영향과-사전-컴파일된-컨트랙트">5.2. Ethereum Virtual Machine (EVM)에 미치는 영향과 사전 컴파일된 컨트랙트
&lt;/h3>&lt;p>이더리움(Ethereum)과 같은 튜링 완전한 스마트 컨트랙트 플랫폼에서 PQC의 도입은 EVM(Ethereum Virtual Machine)의 근본적인 업그레이드를 요구합니다.
현재의 EVM에서는 ECDSA 서명 검증을 위해 &lt;code>ecrecover&lt;/code> (주소: &lt;code>0x01&lt;/code>)라는 사전 컴파일된 컨트랙트(Precompiled Contract)가 마련되어 있어, 매우 낮은 가스비(3000 Gas)로 서명 검증을 수행할 수 있도록 최적화되어 있습니다.&lt;/p>
&lt;p>하지만 Dilithium이나 Falcon과 같은 새로운 격자 기반 암호 알고리즘의 검증 처리는 복잡한 다항식 연산이나 행렬 연산을 수반하기 때문에, 기존의 EVM 연산 코드(Opcode)만으로 구현하면 단 1회의 서명 검증만으로 수백만에서 수천만 가스를 소비할 가능성이 있습니다. 이는 현재의 블록 가스 한도(약 3000만 Gas)를 1개의 트랜잭션으로 고갈시키는 수준입니다.&lt;/p>
&lt;p>이를 회피하기 위해서는 네트워크의 하드포크를 통해 새롭게 PQC 검증용 사전 컴파일된 컨트랙트(예: &lt;code>0x10&lt;/code>에 DilithiumVerify를 할당하는 등)를 EVM 자체에 내장해야 합니다. 여기에는 각 이더리움 클라이언트(Geth, Nethermind, Erigon 등)의 코어 개발자가 협력하여 C++, Go, Rust 등의 언어 레벨에서 격자 기반 암호 검증 로직을 최적화하여 구현하고, 보안 감사를 실시하는 장기간에 걸친 프로세스가 필요합니다.&lt;/p>
&lt;h3 id="53-하드포크를-통한-합의-형성의-어려움">5.3. 하드포크를 통한 합의 형성의 어려움
&lt;/h3>&lt;p>기반이 되는 서명 알고리즘을 변경하려면 네트워크 전체의 프로토콜을 갱신하는 **하드포크(Hard Fork)**가 불가피합니다. 하지만 비트코인처럼 &amp;lsquo;규칙을 바꾸지 않는 것, 탈중앙화되어 있을 것&amp;rsquo;에 무게를 두는 커뮤니티에서 합의를 이끌어내는 프로세스는 정치적으로도 매우 어렵습니다. PQC로의 전환에 관한 BIP(Bitcoin Improvement Proposal)가 제안된 후 구현에 이르기까지는 수년에 걸친 논의와 테스트가 필요할 것입니다.&lt;/p>
&lt;hr>
&lt;h2 id="6-언제-q-day는-오는가-전환을-향한-로드맵">6. 언제 &amp;lsquo;Q-Day&amp;rsquo;는 오는가? 전환을 향한 로드맵
&lt;/h2>&lt;p>&amp;lsquo;양자 컴퓨터가 256비트의 타원곡선 암호를 완전히 해독하는 날(Q-Day)&amp;lsquo;은 언제 올까요?
연구자들 사이에서도 의견이 분분하지만, 많은 전문가들은 &lt;strong>&amp;lsquo;2030년대 중반에서 2040년대에 걸쳐&amp;rsquo;&lt;/strong>, 적어도 수천에서 수만 개의 안정적인 논리적 양자 비트(노이즈 내성을 가진 오류가 정정된 양자 비트)를 가진 대규모 양자 컴퓨터가 등장할 것으로 예측하고 있습니다. 하지만 하드웨어 아키텍처의 돌파구나 보다 효율적인 양자 알고리즘의 발견에 따라 그 시기가 앞당겨질 가능성(2030년 전후)도 부정할 수 없습니다.&lt;/p>
&lt;p>암호자산 생태계가 늦기 전에 취해야 할 로드맵은 다음과 같습니다.&lt;/p>
&lt;h3 id="1단계-하이브리드-서명과-계정-추상화-현재2028년경">1단계: 하이브리드 서명과 계정 추상화 (현재~2028년경)
&lt;/h3>&lt;p>현재의 블록체인 업계, 특히 Ethereum의 개발진(Vitalik Buterin 등)은 ECDSA와 PQC(해시 기반 서명이나 격자 기반 암호)를 결합한 **&amp;lsquo;하이브리드 서명&amp;rsquo;**을 검토하고 있습니다. 이는 기존의 안전한 ECDSA에 의한 서명과 PQC에 의한 서명을 모두 트랜잭션에 부여하여, 어느 한쪽이 뚫리더라도 안전성을 유지한다는 접근 방식입니다.
또한, 계정 추상화(Account Abstraction, ERC-4337)를 활용함으로써 프로토콜 레벨의 하드포크를 기다리지 않고 스마트 컨트랙트 지갑 상에서 옵트인(희망하는 사용자만) 방식으로 PQC 서명을 구현 및 지원하는 노력도 진행되고 있습니다.&lt;/p>
&lt;h3 id="2단계-영지식-증명zk-rollups의-활용-2025년">2단계: 영지식 증명(ZK-Rollups)의 활용 (2025년~)
&lt;/h3>&lt;p>PQC의 가장 큰 약점인 &amp;lsquo;서명 데이터의 비대화&amp;rsquo;를 해결할 비장의 카드로 기대되고 있는 것이 레이어 2 기술인 **ZK-Rollups(영지식 증명)**의 활용입니다.
거대한 PQC 서명 데이터를 Layer 1(메인 체인)에 직접 기록하는 것이 아니라, Layer 2 상에서 다수의 PQC 트랜잭션을 검증 및 집약합니다. 그리고 ZK-SNARKs나 ZK-STARKs를 사용하여 이들을 하나의 극히 작은 &amp;lsquo;증명 데이터(Proof)&amp;lsquo;로 압축하여 Layer 1에 기록하는 것입니다.
참고로 SNARKs의 일부 구성(Groth16 등)은 그 자체가 양자 컴퓨터에 취약하기 때문에 내양자성을 가진 해시 함수에만 의존하는 &lt;strong>ZK-STARKs&lt;/strong>의 채택이 핵심이 됩니다.&lt;/p>
&lt;h3 id="3단계-프로토콜-레벨의-하드포크-2030년경">3단계: 프로토콜 레벨의 하드포크 (2030년경)
&lt;/h3>&lt;p>NIST에 의한 PQC 표준화가 완전히 정착되고 업계 표준 라이브러리가 갖추어져 충분히 테스트된 단계에서, Bitcoin이나 Ethereum 등 주요 체인의 기본 서명 방식을 완전히 PQC로 전환하는 하드포크가 실시될 것으로 예상됩니다. 이 전환기에는 사용자에게 &amp;lsquo;오래된 지갑에서 PQC를 지원하는 새로운 지갑으로 자금을 이동하도록 촉구하는&amp;rsquo; 대규모 공지가 이루어지게 될 것입니다.&lt;/p>
&lt;h3 id="선구적인-프로젝트-사례">선구적인 프로젝트 사례
&lt;/h3>&lt;p>일부 블록체인 프로젝트는 이러한 양자 위협을 선제적으로 인지하고 초기 단계부터 내양자성을 표방하며 개발되고 있습니다.&lt;/p>
&lt;ul>
&lt;li>&lt;strong>QRL (Quantum Resistant Ledger)&lt;/strong>: XMSS(확장 머클 서명 방식)라는 해시 기반의 PQC를 프로토콜 레벨에서 네이티브하게 구현한 초기 블록체인입니다.&lt;/li>
&lt;li>&lt;strong>Algorand / Cellframe&lt;/strong>: 미래의 PQC 업데이트를 염두에 둔 유연한 암호 계층의 모듈형 아키텍처를 가지고 있으며, 격자 기반 암호의 통합을 적극적으로 모색하고 있는 프로젝트들입니다.&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h2 id="7-결론-암호자산의-미래와-우리의-자산을-지키기-위해">7. 결론: 암호자산의 미래와 우리의 자산을 지키기 위해
&lt;/h2>&lt;p>&amp;lsquo;포스트 양자 시대&amp;rsquo;의 도래는 단순한 SF(공상과학)의 상상 영역을 넘어 이미 현실의 암호 시스템에 대한 구체적인 기술적 과제로서 우리 눈앞에 다가와 있습니다.&lt;/p>
&lt;p>쇼어의 알고리즘과 그로버의 알고리즘이라는 양자 컴퓨터의 두 자루의 검은 현재 블록체인의 기반인 공개키 암호와 해시 함수를 각각 위협합니다. 특히 ECDSA의 취약성은 치명적이며, 프론트 러닝 공격에 의한 자금 도난 위험을 피하기 위해서는 내양자 암호(PQC)로의 전환이 절대적으로 피할 수 없는 길입니다.&lt;/p>
&lt;p>하지만 기술계와 블록체인 커뮤니티는 그저 손을 놓고 파멸을 기다리고 있는 것만은 아닙니다. 격자 기반 암호나 해시 기반 서명과 같은 PQC 알고리즘의 선정과 표준화가 착실히 진행되고 있으며, 영지식 증명(ZK-STARKs)이나 Layer 2의 스케일링 기술을 활용함으로써 PQC 도입의 가장 큰 장벽인 &amp;lsquo;데이터 크기의 비대화&amp;rsquo;를 극복할 길도 보이기 시작했습니다.&lt;/p>
&lt;p>우리 일반 암호자산 사용자나 투자자가 지금 당장 패닉에 빠져 자금을 모두 매각할 필요는 없습니다. 하지만 다음과 같은 기본적인 리터러시와 자기방어 의식을 가지는 것이 중요합니다.&lt;/p>
&lt;ul>
&lt;li>&lt;strong>주소 재사용을 피한다&lt;/strong>: &amp;lsquo;사용된 주소(한 번이라도 자금을 송금하여 공개키가 블록체인 상에 노출된 주소)&amp;lsquo;에는 자금을 장기간 보관하지 않도록, 프라이버시 관점뿐만 아니라 보안 관점에서도 철저히 한다.&lt;/li>
&lt;li>&lt;strong>기술 동향에 주목한다&lt;/strong>: Bitcoin의 BIP나 Ethereum의 EIP 등 주요 네트워크의 PQC 전환에 관한 논의나 하드포크 뉴스에 촉각을 곤두세우고, 필요해진 타이밍에 적절히 지갑 전환 작업을 수행할 수 있도록 한다.&lt;/li>
&lt;/ul>
&lt;p>블록체인의 역사는 항상 새로운 기술적 위협에 대한 업그레이드와 레질리언스(회복력)의 역사이기도 합니다. 확장성 문제나 환경 문제(PoW에서 PoS로의 전환 등)를 극복해 온 것처럼, 이 전대미문의 양자 위협에 대해서도 생태계 전체가 해결책을 모색하고 적응해 나갈 것입니다.
양자 컴퓨터라는 인류의 새로운 지혜와 탈중앙화된 분산 원장이라는 신뢰의 기술이 충돌로 인해 붕괴하는 것이 아니라, 더 높은 차원에서 융합된 견고한 시스템으로 승화되어 가는 미래를 기대해 봅니다.&lt;/p>
&lt;hr>
&lt;p>&lt;em>참고 문헌 및 관련 링크:&lt;/em>&lt;/p>
&lt;ul>
&lt;li>National Institute of Standards and Technology (NIST) - Post-Quantum Cryptography Standardization Project&lt;/li>
&lt;li>Shor, P. W. (1994). Algorithms for quantum computation: discrete logarithms and factoring.&lt;/li>
&lt;li>Grover, L. K. (1996). A fast quantum mechanical algorithm for database search.&lt;/li>
&lt;li>Buterin, V. (2024). How to hard-fork to save most users&amp;rsquo; funds in a quantum emergency.&lt;/li>
&lt;/ul></description></item><item><title>양자 어닐링과 양자 게이트 방식의 차이를 알기 쉽게 해설</title><link>http://kenji.blog/ko/p/quantum-annealing-vs-gate-model-explained/</link><pubDate>Fri, 11 Sep 2026 12:00:00 +0900</pubDate><guid>http://kenji.blog/ko/p/quantum-annealing-vs-gate-model-explained/</guid><description>&lt;img src="http://kenji.blog/p/quantum-annealing-vs-gate-model-explained/img/eyecatch.jpg" alt="Featured image of post 양자 어닐링과 양자 게이트 방식의 차이를 알기 쉽게 해설" />&lt;h1 id="양자-어닐링과-양자-게이트-방식의-차이를-알기-쉽게-해설">양자 어닐링과 양자 게이트 방식의 차이를 알기 쉽게 해설
&lt;/h1>&lt;p>양자 컴퓨팅은 현대의 고전 컴퓨터(기존의 슈퍼컴퓨터를 포함)로는 계산에 방대한 시간이 걸리는 특정 문제를, 양자 역학적인 원리(중첩이나 양자 얽힘)를 이용하여 비약적으로 빠르게 풀 수 있는 가능성을 지닌 차세대 계산 기술입니다.&lt;/p>
&lt;p>현재 양자 컴퓨터 실현을 위한 접근 방식으로 크게 나누어 **&amp;lsquo;양자 어닐링(Quantum Annealing)&amp;rsquo;**과 **&amp;lsquo;양자 게이트 방식(Quantum Gate Model)&amp;rsquo;**이라는 두 가지 주류 패러다임이 존재합니다. 이 두 방식은 기반이 되는 물리적 접근 방식, 주로 다루는 계산 작업, 그리고 구현에 있어서의 하드웨어 과제가 크게 다릅니다.&lt;/p>
&lt;p>본 기사에서는 이 두 방식에 대해 물리적인 원리, 수리 모델(Ising 모델, QUBO, 유니터리 변환 등), 현재의 기술적 한계, 그리고 구체적인 유스케이스에 이르기까지 매우 상세하고 기술적인 관점에서 철저하게 비교·해설합니다.&lt;/p>
&lt;hr>
&lt;h2 id="1-양자-계산의-기초-고전-컴퓨터와의-근본적인-차이">1. 양자 계산의 기초: 고전 컴퓨터와의 근본적인 차이
&lt;/h2>&lt;p>고전 컴퓨터는 정보를 &amp;lsquo;0&amp;rsquo; 또는 &amp;lsquo;1&amp;rsquo; 중 하나의 상태를 가지는 &amp;lsquo;비트(Bit)&amp;lsquo;로서 처리합니다. 반면 양자 컴퓨터는 &amp;lsquo;양자 비트(Qubit)&amp;lsquo;를 사용합니다. 양자 비트는 양자 역학의 &amp;lsquo;중첩(Superposition)&amp;rsquo; 원리에 의해 0과 1의 두 가지 상태를 동시에 확률적으로 가질 수 있습니다.&lt;/p>
&lt;p>또한, &amp;lsquo;양자 얽힘(Entanglement)&amp;lsquo;이라고 불리는 현상을 이용함으로써 여러 양자 비트의 상태가 서로 강하게 상관관계를 가지며, 하나의 양자 비트에 대한 조작이 시스템 전체에 순식간에 영향을 미치게 됩니다. 이를 통해 병렬 처리적인 계산(양자 병렬성)이 가능해집니다.&lt;/p>
&lt;p>그러나 양자 상태는 외부의 노이즈(열이나 전자파 등)에 대해 매우 취약하며, 상태가 깨져서 고전적인 상태로 돌아가 버리는 &amp;lsquo;결어긋남(Decoherence)&amp;lsquo;이 큰 과제가 되고 있습니다. 이 노이즈 문제에 대한 접근 방식의 차이가 어닐링과 게이트 방식의 설계 사상에 큰 차이를 가져오고 있습니다.&lt;/p>
&lt;hr>
&lt;h2 id="2-양자-어닐링-quantum-annealing-의-상세">2. 양자 어닐링 (Quantum Annealing) 의 상세
&lt;/h2>&lt;p>양자 어닐링은 주로 **&amp;lsquo;조합 최적화 문제&amp;rsquo;**를 푸는 데 특화된 전용 계산 아키텍처입니다. 1998년 도쿄 공업 대학의 카도와키 만페이(門脇万平) 씨와 니시모리 히데토시(西森秀稔) 씨가 제안한 이론을 바탕으로 하고 있으며, 캐나다의 D-Wave Systems사가 세계 최초로 상용화함으로써 널리 알려지게 되었습니다.&lt;/p>
&lt;h3 id="21-물리적-메커니즘-횡자장-이징-모델과-양자-요동">2.1. 물리적 메커니즘: 횡자장 이징 모델과 양자 요동
&lt;/h3>&lt;p>양자 어닐링은 자연계의 물리계가 &amp;lsquo;에너지가 가장 낮은 상태(바닥 상태)&amp;lsquo;로 안정되려는 성질을 계산에 이용합니다.&lt;/p>
&lt;p>고전적인 접근 방식인 &amp;lsquo;시뮬레이티드 어닐링(담금질 기법)&amp;lsquo;에서는 열 요동을 이용하여 국소 최적해(로컬 미니멈)에서 탈출합니다. 반면, 양자 어닐링에서는 &amp;lsquo;양자 요동(Quantum Fluctuation)&amp;lsquo;을 이용하고, &amp;lsquo;양자 터널 효과(Quantum Tunneling)&amp;lsquo;에 의해 에너지 장벽을 빠져나가, 보다 효율적으로 전역 최적해(글로벌 미니멈)를 탐색합니다.&lt;/p>
&lt;p>양자 어닐링 계의 시간 발전은 다음의 해밀토니안(계의 전체 에너지를 나타내는 연산자) $H(t)$ 로 기술됩니다.&lt;/p>
$$ H(t) = A(t) H_0 + B(t) H_P $$
&lt;p>여기서, $t$ 는 시간, $A(t)$ 는 서서히 감소하는 함수, $B(t)$ 는 서서히 증가하는 함수입니다.&lt;/p>
&lt;ul>
&lt;li>&lt;strong>$H_0$(초기 해밀토니안)&lt;/strong>: 횡자장(Transverse field)을 나타내며, 양자 요동을 발생시킵니다.
$$ H_0 = - \sum_{i} \sigma_i^x $$
($\sigma_i^x$ 는 파울리 X 행렬이며, 비트의 반전을 나타냅니다.)&lt;/li>
&lt;li>&lt;strong>$H_P$(문제 해밀토니안)&lt;/strong>: 풀고자 하는 최적화 문제를 표현하는 이징 모델(Ising Model)입니다.&lt;/li>
&lt;/ul>
&lt;p>초기 상태 ($t=0$) 에서는 $A(0)$ 가 최대이며, 계는 $H_0$ 의 바닥 상태(모든 상태가 균등하게 중첩된 상태)에 있습니다. 거기서 시간을 두고 천천히 횡자장을 약화시키는 동시에 문제 해밀토니안의 상호작용을 강화해 나갑니다.&lt;/p>
&lt;h3 id="22-단열-양자-계산-adiabatic-quantum-computation">2.2. 단열 양자 계산 (Adiabatic Quantum Computation)
&lt;/h3>&lt;p>이 과정에서 중요한 것이 **&amp;lsquo;단열 정리(Adiabatic Theorem)&amp;rsquo;**입니다. 단열 정리에 따르면, 계를 &amp;lsquo;충분히 천천히(단열적으로)&amp;rsquo; 변화시키면, 계는 항상 그 순간의 해밀토니안의 바닥 상태에 계속 머무르게 됩니다.&lt;/p>
&lt;p>즉, 최종적으로 $A(t) \to 0$, $B(t) \to 1$ 이 되었을 때, 계는 $H_P$ 의 바닥 상태, 즉 **&amp;lsquo;최적화 문제의 엄밀해&amp;rsquo;**에 도달해 있게 됩니다.&lt;/p>
&lt;div class="mermaid">graph TD
A["해밀토니안 H_0 (초기 상태)"] -->|"단열적 변화 (충분히 천천히)"| B["항상 바닥 상태를 유지"]
A -->|"비단열적 변화 (너무 빠름/열 노이즈)"| C["들뜬 상태로의 전이 (오류)"]
B --> D["해밀토니안 H_P (전역 최적해)"]
C --> E["국소적 최적해에 갇힘"]
D --> F["해의 판독"]
E --> F&lt;/div>
&lt;h3 id="23-qubo에서-ising-모델로의-매핑">2.3. QUBO에서 Ising 모델로의 매핑
&lt;/h3>&lt;p>실세계의 문제를 양자 어닐러로 풀기 위해서는, 문제를 &lt;strong>QUBO(Quadratic Unconstrained Binary Optimization: 제약 없는 이차 이진 최적화)&lt;/strong> 형식으로 정식화해야 합니다.&lt;/p>
&lt;p>QUBO의 목적 함수는 다음과 같이 정의됩니다.
&lt;/p>
$$ \min_{x \in \{0,1\}^n} \sum_{i} Q_{ii} x_i + \sum_{i &lt; j} Q_{ij} x_i x_j $$
&lt;p>
여기서, $x_i \in \{0, 1\}$ 는 이진 변수, $Q$ 는 가중치 행렬입니다.&lt;/p>
&lt;p>하드웨어(D-Wave 등)는 물리적인 스핀(위 방향/아래 방향)을 다루기 때문에, 변수를 $\sigma_i \in \{-1, +1\}$ 를 사용하는 이징 모델로 변환할 필요가 있습니다. 변환 식은 다음과 같습니다.
&lt;/p>
$$ x_i = \frac{1 - \sigma_i}{2} \quad \text{또는} \quad \sigma_i = 1 - 2x_i $$
&lt;p>이것을 QUBO 식에 대입하여 정리하면 이징 모델의 해밀토니안 $H_P$ 를 얻을 수 있습니다.
&lt;/p>
$$ H_P = - \sum_{i&lt;j} J_{ij} \sigma_i^z \sigma_j^z - \sum_{i} h_i \sigma_i^z $$
&lt;ul>
&lt;li>$J_{ij}$: 스핀 간의 상호작용(결합 계수). 물리적인 양자 비트 간의 결합 강도.&lt;/li>
&lt;li>$h_i$: 각 스핀에 대한 국소 자기장(바이어스).&lt;/li>
&lt;/ul>
&lt;h3 id="24-양자-어닐링의-하드웨어와-과제-d-wave의-예">2.4. 양자 어닐링의 하드웨어와 과제 (D-Wave의 예)
&lt;/h3>&lt;p>D-Wave의 양자 프로세서는 초전도 양자 간섭계(SQUID)를 사용하여 구현되었습니다. 물리적인 양자 비트들 간의 결합은 하드웨어의 배선에 의존하고 있으며, 완전 결합(모든 비트가 서로 연결된 상태)이 아닙니다.
초기의 &amp;lsquo;키메라 그래프(Chimera graph)&amp;lsquo;에서 &amp;lsquo;페가수스 그래프(Pegasus)&amp;rsquo;, &amp;lsquo;제파 그래프(Zephyr)&amp;lsquo;로 진화하면서 결합도는 향상되었지만 여전히 제한이 있습니다.&lt;/p>
&lt;p>그렇기 때문에 복잡한 그래프 구조를 가진 문제를 물리적인 그래프에 매핑하는 **&amp;lsquo;마이너 임베딩(Minor Embedding)&amp;rsquo;**이라는 처리가 필요합니다. 이로 인해 하나의 논리 변수를 여러 물리 양자 비트(체인)로 표현하게 되어, 사용할 수 있는 실질적인 양자 비트 수가 감소하고 계산 정밀도가 떨어지는 과제가 있습니다.&lt;/p>
&lt;hr>
&lt;h2 id="3-양자-게이트-방식-quantum-gate-model-의-상세">3. 양자 게이트 방식 (Quantum Gate Model) 의 상세
&lt;/h2>&lt;p>양자 게이트 방식은 고전 컴퓨터의 논리 게이트(AND, OR, NOT 등)를 양자 역학적으로 확장한 것으로, **&amp;lsquo;범용 양자 계산(Universal Quantum Computation)&amp;rsquo;**을 가능하게 하는 아키텍처입니다. IBM, Google, Rigetti, IonQ 등의 많은 기업이 이 방식을 채택하고 있습니다.&lt;/p>
&lt;h3 id="31-유니터리-변환과-상태-벡터">3.1. 유니터리 변환과 상태 벡터
&lt;/h3>&lt;p>양자 게이트 방식에서는 양자 비트 시스템 전체의 상태를 &amp;lsquo;상태 벡터(State Vector)&amp;rsquo; $|\psi\rangle$ 로서 표현합니다. 1 양자 비트의 상태는 다음과 같이 바닥 상태 $|0\rangle$ 과 $|1\rangle$ 의 선형 결합으로 나타냅니다.
&lt;/p>
$$ |\psi\rangle = \alpha |0\rangle + \beta |1\rangle $$
&lt;p>
여기서, $\alpha$ 와 $\beta$ 는 복소 확률 진폭이며, $|\alpha|^2 + |\beta|^2 = 1$ 을 만족합니다. 이 상태는 기하학적으로 &amp;lsquo;블로흐 구(Bloch Sphere)&amp;rsquo; 상의 점으로 시각화됩니다.&lt;/p>
&lt;p>양자 계산의 단계는 상태 벡터에 대한 &lt;strong>유니터리 연산자(Unitary Operator) $U$&lt;/strong> 의 적용으로 기술됩니다. 유니터리 행렬은 $U^\dagger U = I$(에르미트 켤레와의 곱이 단위 행렬이 됨)라는 성질을 가지며, 양자 역학에 있어서 슈뢰딩거 방정식의 시간 발전에 대응하는 가역적인 조작입니다.
&lt;/p>
$$ |\psi_{t+1}\rangle = U_t |\psi_t\rangle $$
&lt;h3 id="32-기본적인-양자-게이트와-회로-모델">3.2. 기본적인 양자 게이트와 회로 모델
&lt;/h3>&lt;p>양자 계산 알고리즘은 일련의 양자 게이트 시퀀스(양자 회로)로서 설계됩니다.&lt;/p>
&lt;ul>
&lt;li>&lt;strong>파울리 게이트 (X, Y, Z)&lt;/strong>: 블로흐 구에서의 각 축을 중심으로 한 180도 회전. X 게이트는 고전의 NOT 게이트에 해당합니다.&lt;/li>
&lt;li>&lt;strong>아다마르 게이트 (H)&lt;/strong>: $|0\rangle$ 을 $\frac{|0\rangle + |1\rangle}{\sqrt{2}}$ 로 변환하여 중첩 상태를 만들어냅니다.
$$ H = \frac{1}{\sqrt{2}} \begin{pmatrix} 1 &amp; 1 \\ 1 &amp; -1 \end{pmatrix} $$&lt;/li>
&lt;li>&lt;strong>CNOT 게이트 (Controlled-NOT)&lt;/strong>: 2 양자 비트 게이트. 제어 비트가 $|1\rangle$ 일 때만 표적 비트에 X 게이트를 적용합니다. 이를 통해 양자 얽힘(Entanglement)을 생성합니다.&lt;/li>
&lt;/ul>
&lt;p>모든 양자 알고리즘은 소수의 1 양자 비트 게이트와 CNOT 게이트의 조합에 의해 근사적으로 표현할 수 있습니다(범용 게이트 세트).&lt;/p>
&lt;div class="mermaid">graph LR
Q0["Qubit 0: |0>"] --> H1["아다마르 게이트 (H)"]
Q1["Qubit 1: |0>"] --> I1["항등 조작 (I)"]
H1 --> C1["제어 비트 (Control)"]
I1 --> T1["표적 비트 (Target)"]
C1 -. "얽힘" .- T1
C1 --> M0["측정 (Measurement)"]
T1 --> M1["측정 (Measurement)"]
M0 --> Result["고전적 결과 (0 or 1)"]
M1 --> Result&lt;/div>
&lt;h3 id="33-오류-정정과-nisq에서-ftqc로의-길">3.3. 오류 정정과 NISQ에서 FTQC로의 길
&lt;/h3>&lt;p>양자 게이트 방식의 가장 큰 과제는 양자 상태가 노이즈에 의해 파괴되는 &amp;lsquo;결어긋남&amp;rsquo;입니다. 계산 단계(게이트 깊이)가 깊어질수록 오류가 축적됩니다.&lt;/p>
&lt;p>이상적인 계산을 수행하기 위해서는 **양자 오류 정정(Quantum Error Correction)**이 필수적입니다. 예를 들어 &amp;lsquo;표면 부호(Surface Code)&amp;rsquo; 등의 기법에서는 여러 물리 양자 비트를 묶어 하나의 오류 없는 &amp;lsquo;논리 양자 비트(Logical Qubit)&amp;lsquo;를 구성합니다. 그러나 하나의 논리 양자 비트를 만들기 위해 수천~수만 개의 물리 양자 비트가 필요하게 되어 막대한 오버헤드가 발생합니다.&lt;/p>
&lt;p>현재 우리가 있는 단계는 오류 정정이 없는 수십~수백 양자 비트의 &lt;strong>NISQ(Noisy Intermediate-Scale Quantum)&lt;/strong> 디바이스 시대입니다. 완벽한 오류 정정을 갖춘 **FTQC(Fault-Tolerant Quantum Computing: 결함 허용 양자 계산)**의 실현에는 아직 많은 돌파구가 필요합니다.&lt;/p>
&lt;hr>
&lt;h2 id="4-기술적수학적-비교-요약">4. 기술적·수학적 비교 요약
&lt;/h2>&lt;p>두 아키텍처의 근본적인 차이를 비교합니다.&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th style="text-align:left">비교 항목&lt;/th>
&lt;th style="text-align:left">양자 어닐링 (Quantum Annealing)&lt;/th>
&lt;th style="text-align:left">양자 게이트 방식 (Gate Model)&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>계산 모델&lt;/strong>&lt;/td>
&lt;td style="text-align:left">단열 양자 계산 (해밀토니안의 연속적인 시간 발전)&lt;/td>
&lt;td style="text-align:left">유니터리 변환 (이산적인 게이트 조작의 시퀀스)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>적합한 문제&lt;/strong>&lt;/td>
&lt;td style="text-align:left">조합 최적화 문제 (QUBO, 이징 모델)&lt;/td>
&lt;td style="text-align:left">범용 (양자 화학 시뮬레이션, 소인수 분해, 검색 등)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>표현 능력&lt;/strong>&lt;/td>
&lt;td style="text-align:left">휴리스틱 최적화 (근사해)&lt;/td>
&lt;td style="text-align:left">범용 양자 튜링 머신과 등가 (이론상 모든 계산이 가능)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>구현 예&lt;/strong>&lt;/td>
&lt;td style="text-align:left">D-Wave Systems&lt;/td>
&lt;td style="text-align:left">IBM, Google, Quantinuum, IonQ 등&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>노이즈 내성&lt;/strong>&lt;/td>
&lt;td style="text-align:left">비교적 강함 (바닥 상태 부근에 머물기 때문에 어느 정도의 열 노이즈는 허용 가능)&lt;/td>
&lt;td style="text-align:left">매우 약함 (약간의 노이즈로 위상이 어긋나고 계산 결과가 파괴됨)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>확장성&lt;/strong>&lt;/td>
&lt;td style="text-align:left">수천~수만 양자 비트 규모 (물리적 구조에 의존. 논리 비트화는 어려움)&lt;/td>
&lt;td style="text-align:left">수백 양자 비트 규모 (FTQC를 향해서는 수백만 규모가 필요)&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>양자 어닐링은 &amp;lsquo;특정 목적의 코프로세서&amp;rsquo;로서 고전 컴퓨터의 한계를 보완하는 형태로 최적화 문제를 푸는 데 적합합니다. 반면 양자 게이트 방식은 &amp;lsquo;범용 컴퓨터&amp;rsquo;의 양자 버전이며, 궁극적으로는 고전 컴퓨터를 능가하는 계산 능력(양자 우월성)을 목표로 하지만 하드웨어 구축이 매우 어렵습니다.&lt;/p>
&lt;hr>
&lt;h2 id="5-현재의-한계와-과제">5. 현재의 한계와 과제
&lt;/h2>&lt;h3 id="양자-어닐링의-한계">양자 어닐링의 한계
&lt;/h3>&lt;ol>
&lt;li>&lt;strong>결합도의 제한 (Connectivity)&lt;/strong>: 앞서 언급한 마이너 임베딩으로 인해 문제 규모가 커지면 필요한 물리 양자 비트 수가 지수 함수적으로 증가합니다.&lt;/li>
&lt;li>&lt;strong>계수의 정밀도 (Precision)&lt;/strong>: $J_{ij}$ 나 $h_i$ 같은 아날로그 파라미터를 하드웨어 상에 설정할 때의 물리적인 오차가 해의 품질에 직결됩니다.&lt;/li>
&lt;li>&lt;strong>온도와 비단열 전이&lt;/strong>: 시스템 온도가 절대 영도가 아니기 때문에 열적 들뜸(Thermal Excitation)에 의해 최적해에서 벗어날 확률이 있습니다.&lt;/li>
&lt;/ol>
&lt;h3 id="양자-게이트-방식의-한계">양자 게이트 방식의 한계
&lt;/h3>&lt;ol>
&lt;li>&lt;strong>결어긋남 시간 (Coherence Time)&lt;/strong>: 양자 상태를 유지할 수 있는 시간은 겨우 수 마이크로초에서 수 밀리초 정도이며, 그 사이에 실행할 수 있는 게이트 수(회로의 깊이)가 엄격하게 제한됩니다.&lt;/li>
&lt;li>&lt;strong>게이트 충실도 (Gate Fidelity)&lt;/strong>: 2 양자 비트 게이트(CNOT 등)의 조작 오류율이 아직 충분히 낮지 않습니다(일반적으로 99.x% 정도). FTQC의 실현을 위해서는 이를 99.99% 이상으로 끌어올릴 필요가 있습니다.&lt;/li>
&lt;li>&lt;strong>양자 볼륨 (Quantum Volume)&lt;/strong>: 단순한 양자 비트 수뿐만 아니라, 상호 결합이나 오류율을 고려한 실질적인 계산 능력(양자 볼륨)을 스케일링하는 것이 현재의 가장 큰 과제입니다.&lt;/li>
&lt;/ol>
&lt;hr>
&lt;h2 id="6-구체적인-유스케이스와-알고리즘">6. 구체적인 유스케이스와 알고리즘
&lt;/h2>&lt;p>각 방식이 장점을 가지는 구체적인 응용 분야를 살펴보겠습니다.&lt;/p>
&lt;h3 id="61-양자-어닐링의-유스케이스">6.1. 양자 어닐링의 유스케이스
&lt;/h3>&lt;ul>
&lt;li>&lt;strong>물류·라우팅&lt;/strong>: 다수 차량의 배송 경로 최적화(순회 외판원 문제의 변형). 교통 체증을 고려한 실시간 경로 탐색.&lt;/li>
&lt;li>&lt;strong>금융 공학&lt;/strong>: 포트폴리오 최적화. 리스크를 최소화하면서 수익을 최대화하는 종목의 조합 탐색.&lt;/li>
&lt;li>&lt;strong>머신러닝&lt;/strong>: 특성 선택(Feature Selection). 방대한 데이터셋에서 가장 예측에 기여하는 변수의 조합을 추출.&lt;/li>
&lt;li>&lt;strong>제조업&lt;/strong>: 공장에서의 잡샵 스케줄링(Job-shop Scheduling) 문제(어떤 기계로 어떤 부품을 어떤 순서로 가공하는 것이 가장 빠른가).&lt;/li>
&lt;/ul>
&lt;h3 id="62-양자-게이트-방식의-유스케이스">6.2. 양자 게이트 방식의 유스케이스
&lt;/h3>&lt;ul>
&lt;li>&lt;strong>양자 화학 시뮬레이션&lt;/strong>: 분자의 에너지 상태나 화학 반응을 고정밀도로 시뮬레이트.&lt;/li>
&lt;li>&lt;strong>소인수 분해 (Shor의 알고리즘)&lt;/strong>: 거대한 합성수를 다항식 시간에 소인수 분해하는 알고리즘. 이것이 실용화되면 현재의 RSA 암호 등의 공개키 암호 기반이 깨지기 때문에 내양자 계산기 암호(PQC)로의 전환이 시급해지고 있습니다.&lt;/li>
&lt;li>&lt;strong>데이터베이스 검색 (Grover의 알고리즘)&lt;/strong>: 정렬되지 않은 데이터베이스에서 원하는 데이터를 검색할 때, 고전 컴퓨터에서는 $O(N)$ 의 단계가 필요하지만 Grover의 알고리즘에서는 $O(\sqrt{N})$ 의 단계로 검색 가능합니다.&lt;/li>
&lt;/ul>
&lt;h3 id="63-nisq-시대의-하이브리드-알고리즘-vqe와-qaoa">6.3. NISQ 시대의 하이브리드 알고리즘: VQE와 QAOA
&lt;/h3>&lt;p>NISQ 디바이스의 얕은 양자 회로 제약을 극복하기 위해, 양자 컴퓨터와 고전 컴퓨터의 장점을 결합한 &amp;lsquo;변분 양자 알고리즘(Variational Quantum Algorithms)&amp;lsquo;이 주목받고 있습니다.&lt;/p>
&lt;ul>
&lt;li>&lt;strong>VQE (Variational Quantum Eigensolver)&lt;/strong>: 분자의 바닥 상태 에너지를 구하는 알고리즘. 매개변수화된 양자 회로(Ansatz)를 사용하여 양자 상태를 준비하고, 에너지 기댓값 $\langle \psi(\theta) | H | \psi(\theta) \rangle$ 를 측정합니다. 이 기댓값을 목적 함수로 하여 고전 최적화 알고리즘(경사 하강법 등)을 사용해 매개변수 $\theta$ 를 업데이트합니다. 이것을 수렴할 때까지 반복함으로써 분자의 정확한 에너지 상태를 구합니다.&lt;/li>
&lt;li>&lt;strong>QAOA (Quantum Approximate Optimization Algorithm)&lt;/strong>: 양자 게이트 방식을 사용하여 조합 최적화 문제를 푸는 알고리즘. 양자 어닐링의 단열적인 시간 발전을 &amp;lsquo;트로터 전개(Trotterization)&amp;lsquo;를 통해 이산적인 게이트 조작으로 근사하고, 번갈아가며 해밀토니안을 작용시킴으로써 근사해를 얻습니다. QAOA는 게이트 방식으로 최적화 문제를 푸는 유력한 수단으로 기대되고 있습니다.&lt;/li>
&lt;/ul>
&lt;div class="mermaid">graph TD
User["사용자 문제"] --> Formulation{"문제의 성질"}
Formulation -- "조합 최적화" --> QA_Path["양자 어닐링 / 이징 머신"]
QA_Path --> QUBO["QUBO 정식화"]
QUBO --> DWave["D-Wave 실행"]
Formulation -- "화학 계산·범용 계산" --> Gate_Path["양자 게이트 방식"]
Gate_Path --> Circuit["양자 회로 설계 (VQE / QAOA)"]
Circuit --> IBMGoogle["IBM / Google 양자 하드웨어 실행"]&lt;/div>
&lt;hr>
&lt;h2 id="7-정리">7. 정리
&lt;/h2>&lt;p>양자 어닐링과 양자 게이트 방식은 모두 양자 역학의 신비한 성질을 계산 자원으로 활용한다는 점에서는 같지만, 그 접근 방식과 도달 목표는 크게 다릅니다.&lt;/p>
&lt;ul>
&lt;li>&lt;strong>양자 어닐링&lt;/strong>은 조합 최적화라는 특정 실문제에 대해 조기에 실용적인 성과를 내기 위한 &amp;lsquo;특화형 휴리스틱 엔진&amp;rsquo;입니다. 현재 이미 다양한 기업들에 의해 실증 실험(PoC)이 진행되고 있습니다.&lt;/li>
&lt;li>&lt;strong>양자 게이트 방식&lt;/strong>은 물리·화학의 엄밀한 시뮬레이션부터 암호 해독까지, 컴퓨터 과학의 패러다임을 근본적으로 뒤집을 가능성을 지닌 &amp;lsquo;범용 양자 컴퓨터&amp;rsquo;입니다. 단, 오류 정정이라는 거대한 벽을 넘기 위한 장기적인 연구 개발이 필요합니다.&lt;/li>
&lt;/ul>
&lt;p>장래에는 고전 슈퍼컴퓨터(HPC)를 핵심으로 하되 최적화 작업에는 어닐링 머신을, 양자 화학 계산에는 게이트형 양자 컴퓨터를 호출하는 식의 &lt;strong>&amp;lsquo;이종 혼합(헤테로지니어스) 컴퓨팅&amp;rsquo;&lt;/strong> 환경이 구축될 것으로 생각됩니다.&lt;/p>
&lt;p>양자 컴퓨터는 아직 발전 중인 기술이지만 하드웨어와 알고리즘 양쪽에서 일취월장하는 진화를 거듭하고 있습니다. 이징 모델의 수리나 양자 회로의 기초를 이해하는 것은 다가올 양자 네이티브 시대를 대비하는 큰 무기가 될 것입니다.&lt;/p>
&lt;hr>
&lt;p>&lt;em>이 기사는 양자 컴퓨팅의 기초 개념부터 최신 하드웨어 동향까지를 망라하여 해설한 것입니다. 앞으로도 최신 연구 동향에 주목해 주십시오.&lt;/em>&lt;/p></description></item><item><title>쇼어의 알고리즘을 Python으로 시뮬레이션해 보았다</title><link>http://kenji.blog/ko/p/shors-algorithm-simulation-python/</link><pubDate>Fri, 11 Sep 2026 08:00:00 +0900</pubDate><guid>http://kenji.blog/ko/p/shors-algorithm-simulation-python/</guid><description>&lt;img src="http://kenji.blog/p/shors-algorithm-simulation-python/img/eyecatch.jpg" alt="Featured image of post 쇼어의 알고리즘을 Python으로 시뮬레이션해 보았다" />&lt;h1 id="1-서론-양자-컴퓨터가-가져올-암호의-위기">1. 서론: 양자 컴퓨터가 가져올 암호의 위기
&lt;/h1>&lt;p>현대 인터넷 사회에서 보안의 대부분은 &lt;strong>공개키 암호 방식&lt;/strong>(특히 RSA 암호)에 의존하고 있습니다. 우리가 온라인 쇼핑에서 신용카드 정보를 전송할 때나 기밀성이 높은 데이터를 주고받을 때, 그 통신 내용은 RSA 암호에 의해 강력하게 보호받고 있습니다.&lt;/p>
&lt;p>RSA 암호 안전성의 근거는 &amp;ldquo;&lt;strong>거대한 정수의 소인수분해는 고전 컴퓨터(우리가 평소 사용하는 PC나 슈퍼컴퓨터)로는 극히 어렵다&lt;/strong>&amp;ldquo;라는 수학적인 사실에 의존하고 있습니다. 그러나 1994년 피터 쇼어(Peter Shor)가 발표한 &amp;ldquo;&lt;strong>쇼어의 알고리즘(Shor&amp;rsquo;s Algorithm)&lt;/strong>&amp;ldquo;은 이 전제를 근본부터 뒤엎는 것이었습니다. 쇼어의 알고리즘을 대규모 양자 컴퓨터에서 실행하면 고전 컴퓨터로는 우주의 나이 이상의 시간이 걸리는 소인수분해를 불과 수 분에서 수 시간 만에 풀 수 있다는 것이 수학적으로 증명된 것입니다.&lt;/p>
&lt;p>본 문서에서는 이 쇼어의 알고리즘이 어떻게 소인수분해를 고속으로 수행하는지, 그 수학적인 구조부터 Python과 양자 계산 프레임워크인 &lt;strong>Qiskit&lt;/strong>을 이용한 구체적인 시뮬레이션 구현까지 철저하고 상세하게 해설해 나가겠습니다.&lt;/p>
&lt;hr>
&lt;h1 id="2-계산량의-극적인-변화-지수-함수에서-다항식-시간으로">2. 계산량의 극적인 변화: 지수 함수에서 다항식 시간으로
&lt;/h1>&lt;p>왜 소인수분해가 어려운 것일까요? 고전 컴퓨터에서 최고의 소인수분해 알고리즘으로 알려진 &amp;lsquo;일반 수체 체(General Number Field Sieve, GNFS)&amp;lsquo;를 사용하더라도 그 계산량은 준지수 함수적이 됩니다.&lt;/p>
&lt;p>자릿수가 $N$인 합성수를 소인수분해하는 데 걸리는 시간 계산량은 고전적인 기법에서는 다음과 같습니다.&lt;/p>
$$ O\left(\exp\left( c (\log N)^{1/3} (\log \log N)^{2/3} \right)\right) $$
&lt;p>이 때문에 키 길이를 늘리는(예를 들어 2048비트나 4096비트로 만드는) 것만으로도 고전 컴퓨터로 해독하는 데 수천 년, 수만 년이라는 비현실적인 시간이 걸리게 됩니다.&lt;/p>
&lt;p>그러나 양자 컴퓨터에서 &lt;strong>쇼어의 알고리즘&lt;/strong>을 사용하면 계산량은 입력 비트 수 $\log N$에 대해 다항식 시간으로 극적으로 단축됩니다.&lt;/p>
$$ O((\log N)^3) $$
&lt;p>이것은 비트 수를 2배로 늘렸을 때, 고전 컴퓨터에서는 계산 시간이 천문학적으로 증가하는 반면, 양자 컴퓨터에서는 계산 시간이 기껏해야 8배 정도밖에 늘어나지 않음을 의미합니다. 이 **지수 함수 시간에서 다항식 시간으로의 계산량 클래스 단축(BQP 클래스로의 포함)**이야말로 쇼어 알고리즘의 진정한 대단함입니다.&lt;/p>
&lt;div class="mermaid">graph TD
A["입력 크기(비트 수) N의 증가"] --> B{"알고리즘의 선택"}
B -->|고전: 일반 수체 체| C["준지수 함수적 증가 O(exp(...))"]
B -->|양자: 쇼어의 알고리즘| D["다항식 시간 O((log N)^3)"]
C --> E["수천 년~수십억 년 (해독 불가능)"]
D --> F["수 분~수 시간 (현실적인 시간 내 해독)"]&lt;/div>
&lt;hr>
&lt;h1 id="3-알고리즘의-전체상과-수학적-배경">3. 알고리즘의 전체상과 수학적 배경
&lt;/h1>&lt;p>쇼어의 알고리즘은 사실 모든 것을 양자 컴퓨터로 하는 것은 아닙니다. 고전 컴퓨터를 통한 전처리·후처리와 양자 컴퓨터를 통한 핵심 부분(주기 발견 알고리즘)의 연계를 통해 이루어집니다.&lt;/p>
&lt;p>알고리즘의 전체적인 흐름은 다음과 같습니다.&lt;/p>
&lt;div class="mermaid">graph TD
A["입력: 소인수분해하고 싶은 합성수 N"] --> B["a &lt; N 인 난수 a 를 선택"]
B --> C{"gcd(a, N) > 1 ?"}
C -- "Yes" --> D["자명한 인수 gcd(a, N) 을 출력하고 종료"]
C -- "No" --> E["양자 알고리즘으로 f(x) = a^x mod N 의 주기 r 을 찾음"]
E --> F{"r 이 짝수이고 a^(r/2) ≢ -1 mod N ?"}
F -- "No" --> B
F -- "Yes" --> G["인수 p = gcd(a^(r/2) - 1, N), q = gcd(a^(r/2) + 1, N) 을 계산"]
G --> H["출력: p, q"]&lt;/div>
&lt;h2 id="소인수분해에서-주기-발견-문제로의-귀착">소인수분해에서 주기 발견 문제로의 귀착
&lt;/h2>&lt;p>쇼어의 천재적인 번뜩임은 &amp;ldquo;&lt;strong>소인수분해 문제&lt;/strong>&amp;ldquo;를 &amp;ldquo;&lt;strong>주기 발견 문제(Order Finding Problem)&lt;/strong>&amp;ldquo;로 변환한 것에 있습니다.&lt;/p>
&lt;p>정수 $N$(소인수분해하고 싶은 수)과 서로소인 정수 $a$($1 &lt; a &lt; N$)를 생각해 봅시다. 다음과 같은 모듈러 지수 함수를 정의합니다.&lt;/p>
$$ f(x) = a^x \bmod N $$
&lt;p>이 함수는 어떤 주기 $r$을 가집니다. 즉, 임의의 $x$에 대하여 $f(x+r) = f(x)$가 성립합니다. 특히 $x=0$일 때,&lt;/p>
$$ a^r \equiv 1 \pmod N $$
&lt;p>이 되는 최소의 양의 정수 $r$을 &amp;ldquo;$a$의 $N$을 법으로 하는 위수(Order)&amp;ldquo;라고 부릅니다. 이 주기 $r$을 찾을 수 있다면, 다음과 같이 소인수를 도출해 낼 수 있습니다.&lt;/p>
&lt;p>식을 변형하면,
&lt;/p>
$$ a^r - 1 \equiv 0 \pmod N $$
&lt;p>
만약 $r$이 짝수라면, 합차 공식을 사용하여 인수분해할 수 있습니다.
&lt;/p>
$$ (a^{r/2} - 1)(a^{r/2} + 1) \equiv 0 \pmod N $$
&lt;p>이것은 $N$이 $(a^{r/2} - 1)$ 또는 $(a^{r/2} + 1)$ 중 하나와 공약수를 가짐을 의미합니다(단, $a^{r/2} \not\equiv -1 \pmod N$이라는 조건을 만족해야 합니다). 따라서 유클리드 호제법을 사용하여,&lt;/p>
$$ p = \gcd(a^{r/2} - 1, N) $$
$$ q = \gcd(a^{r/2} + 1, N) $$
&lt;p>을 계산하면, $N$의 비자명한 소인수 $p, q$를 찾을 수 있는 것입니다. 이 계산(최대공약수 계산이나 난수 생성)은 고전 컴퓨터에서 매우 고속으로 수행할 수 있습니다. 문제는 &lt;strong>주기 $r$을 어떻게 고속으로 찾을 것인가&lt;/strong> 하는 점으로 좁혀집니다. 고전 컴퓨터에서는 이 주기 $r$을 찾는 것 자체에 지수 함수적인 시간이 소요되어 버립니다. 여기서 양자 컴퓨터가 나설 차례가 됩니다.&lt;/p>
&lt;hr>
&lt;h1 id="4-양자-알고리즘-부분-주기-발견의-구조">4. 양자 알고리즘 부분: 주기 발견의 구조
&lt;/h1>&lt;p>양자 컴퓨터를 사용하여 주기 $r$을 찾기 위한 서브루틴은 다음의 4가지 단계로 구성됩니다.&lt;/p>
&lt;div class="mermaid">graph LR
subgraph "양자 상태의 전이"
S1["|0⟩|0⟩ (초기화)"] --> S2["H 게이트: 중첩 Σ|x⟩|0⟩"]
S2 --> S3["오라클 U: Σ|x⟩|a^x mod N⟩"]
S3 --> S4["QFT: 간섭에 의한 주기 추출"]
S4 --> S5["측정: 근사치 y 획득"]
end&lt;/div>
&lt;h2 id="1단계-양자-레지스터의-초기화와-중첩">1단계: 양자 레지스터의 초기화와 중첩
&lt;/h2>&lt;p>먼저, 2개의 양자 레지스터를 준비합니다. 제1 레지스터는 상태를 입력하기 위한 것이고, 제2 레지스터는 함수의 계산 결과를 저장하기 위한 것입니다.
초기 상태는 모두 $|0\rangle$입니다.&lt;/p>
$$ |\psi_0\rangle = |0\rangle_1 |0\rangle_2 $$
&lt;p>제1 레지스터의 모든 양자 비트에 아다마르 게이트(Hadamard Gate)를 적용하여, 생각할 수 있는 모든 입력 $x$ ($0$에서 $Q-1$까지, $Q=2^n$)에 대해 동일한 확률의 중첩 상태를 만들어 냅니다.&lt;/p>
$$ |\psi_1\rangle = \frac{1}{\sqrt{Q}} \sum_{x=0}^{Q-1} |x\rangle_1 |0\rangle_2 $$
&lt;p>이로 인해 양자 컴퓨터는 한 번의 연산으로 $Q$개의 모든 입력에 대한 상태를 동시에 유지하게 됩니다. 이것이 &lt;strong>양자 병렬성&lt;/strong>의 강력한 원천입니다.&lt;/p>
&lt;h2 id="2단계-오라클-함수모듈러-거듭제곱의-적용">2단계: 오라클 함수(모듈러 거듭제곱)의 적용
&lt;/h2>&lt;p>다음으로, 양자 연산 회로 $U_f$를 사용하여 함수 $f(x) = a^x \bmod N$을 계산하고 그 결과를 제2 레지스터에 저장합니다.&lt;/p>
$$ |\psi_2\rangle = \frac{1}{\sqrt{Q}} \sum_{x=0}^{Q-1} |x\rangle_1 |a^x \bmod N\rangle_2 $$
&lt;p>이 시점에서 제1 레지스터와 제2 레지스터는 &lt;strong>양자 얽힘(Entanglement)&lt;/strong> 상태에 있습니다. 만약 (가정하여) 제2 레지스터를 관측하여 특정 값 $k = a^{x_0} \bmod N$을 얻었다고 하면, 제1 레지스터의 상태는 그 값 $k$를 주는 $x$의 중첩 상태로 붕괴됩니다. 함수의 주기가 $r$이므로, 남는 상태는 $x_0, x_0+r, x_0+2r, \dots$ 이라는 $r$ 간격의 값이 됩니다.&lt;/p>
$$ |\psi_3\rangle = \sqrt{\frac{r}{Q}} \sum_{j=0}^{M-1} |x_0 + j r\rangle_1 |k\rangle_2 $$
&lt;p>그러나 우리는 $x_0$을 알고 싶은 것이 아니라 주기 $r$ 자체를 알고 싶어 합니다. 이 상태에서 $r$을 직접 관측하는 것은 불가능합니다. 그래서 양자 푸리에 변환을 사용합니다.&lt;/p>
&lt;h2 id="3단계-양자-푸리에-변환qft에-의한-위상-간섭">3단계: 양자 푸리에 변환(QFT)에 의한 위상 간섭
&lt;/h2>&lt;p>제1 레지스터에 대해 **양자 푸리에 변환(Quantum Fourier Transform, QFT)**을 적용합니다. QFT는 고전적인 이산 푸리에 변환의 양자 버전으로, 상태 벡터의 진폭을 변환합니다. 기저 상태 $|x\rangle$에 대한 QFT의 작용은 다음과 같이 정의됩니다.&lt;/p>
$$ QFT |x\rangle = \frac{1}{\sqrt{Q}} \sum_{y=0}^{Q-1} \omega^{xy} |y\rangle $$
&lt;p>여기서 $\omega = e^{2\pi i / Q}$입니다.&lt;/p>
&lt;p>QFT를 적용하면 상태의 진폭이 간섭을 일으킵니다. 수학적인 세부 사항은 생략하겠지만, 주기 $r$을 갖는 상태에 대해 QFT를 적용하면 파동이 **보강 간섭(Constructive Interference)**을 일으키는 것은 $y$가 $Q/r$의 정수배에 극히 가까운 값일 때뿐입니다. 그 이외의 상태는 **상쇄 간섭(Destructive Interference)**에 의해 확률 진폭이 상쇄되어 0에 가까워집니다.&lt;/p>
&lt;h2 id="4단계-측정과-연분수-전개">4단계: 측정과 연분수 전개
&lt;/h2>&lt;p>마지막으로 제1 레지스터를 측정합니다. 측정에 의해 얻어지는 값 $y$는 높은 확률로 다음 조건을 만족합니다.&lt;/p>
$$ y \approx c \frac{Q}{r} \implies \frac{y}{Q} \approx \frac{c}{r} $$
&lt;p>($c$는 $0 \le c &lt; r$인 미지의 정수입니다)&lt;/p>
&lt;p>얻어진 유리수 $y/Q$에 대해 고전 알고리즘인 **연분수 전개(Continued Fraction Expansion)**를 적용함으로써 근사 분수 $c/r$을 계산하고, 분모에서 주기 $r$을 추출합니다.&lt;/p>
&lt;hr>
&lt;h1 id="5-python과-qiskit을-이용한-시뮬레이션-구현">5. Python과 Qiskit을 이용한 시뮬레이션 구현
&lt;/h1>&lt;p>이론만으로는 실감이 나지 않으므로, 실제로 Python과 IBM의 양자 계산 프레임워크인 &lt;strong>Qiskit&lt;/strong>을 사용하여 쇼어의 알고리즘을 시뮬레이션해 봅시다.&lt;/p>
&lt;p>여기서는 가장 고전적이고 유명한 예인 **&amp;quot;$N=15$를 $a=7$을 사용하여 소인수분해하기&amp;rdquo;**라는 시나리오를 구현합니다.&lt;/p>
&lt;h2 id="실행-환경-준비">실행 환경 준비
&lt;/h2>&lt;p>미리 Qiskit을 설치해 둡니다.&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">pip install qiskit qiskit-aer numpy
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;h2 id="python-구현-코드의-전체상">Python 구현 코드의 전체상
&lt;/h2>&lt;p>다음 코드는 $N=15, a=7$에 특화된 쇼어의 알고리즘 구현 예입니다. 범용적인 모듈러 거듭제곱 회로를 구성하는 것은 현재의 시뮬레이터에서는 계산 비용이 너무 높기 때문에, 특정한 $a=7$인 경우의 게이트 동작을 하드코딩하고 있습니다.&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt"> 10
&lt;/span>&lt;span class="lnt"> 11
&lt;/span>&lt;span class="lnt"> 12
&lt;/span>&lt;span class="lnt"> 13
&lt;/span>&lt;span class="lnt"> 14
&lt;/span>&lt;span class="lnt"> 15
&lt;/span>&lt;span class="lnt"> 16
&lt;/span>&lt;span class="lnt"> 17
&lt;/span>&lt;span class="lnt"> 18
&lt;/span>&lt;span class="lnt"> 19
&lt;/span>&lt;span class="lnt"> 20
&lt;/span>&lt;span class="lnt"> 21
&lt;/span>&lt;span class="lnt"> 22
&lt;/span>&lt;span class="lnt"> 23
&lt;/span>&lt;span class="lnt"> 24
&lt;/span>&lt;span class="lnt"> 25
&lt;/span>&lt;span class="lnt"> 26
&lt;/span>&lt;span class="lnt"> 27
&lt;/span>&lt;span class="lnt"> 28
&lt;/span>&lt;span class="lnt"> 29
&lt;/span>&lt;span class="lnt"> 30
&lt;/span>&lt;span class="lnt"> 31
&lt;/span>&lt;span class="lnt"> 32
&lt;/span>&lt;span class="lnt"> 33
&lt;/span>&lt;span class="lnt"> 34
&lt;/span>&lt;span class="lnt"> 35
&lt;/span>&lt;span class="lnt"> 36
&lt;/span>&lt;span class="lnt"> 37
&lt;/span>&lt;span class="lnt"> 38
&lt;/span>&lt;span class="lnt"> 39
&lt;/span>&lt;span class="lnt"> 40
&lt;/span>&lt;span class="lnt"> 41
&lt;/span>&lt;span class="lnt"> 42
&lt;/span>&lt;span class="lnt"> 43
&lt;/span>&lt;span class="lnt"> 44
&lt;/span>&lt;span class="lnt"> 45
&lt;/span>&lt;span class="lnt"> 46
&lt;/span>&lt;span class="lnt"> 47
&lt;/span>&lt;span class="lnt"> 48
&lt;/span>&lt;span class="lnt"> 49
&lt;/span>&lt;span class="lnt"> 50
&lt;/span>&lt;span class="lnt"> 51
&lt;/span>&lt;span class="lnt"> 52
&lt;/span>&lt;span class="lnt"> 53
&lt;/span>&lt;span class="lnt"> 54
&lt;/span>&lt;span class="lnt"> 55
&lt;/span>&lt;span class="lnt"> 56
&lt;/span>&lt;span class="lnt"> 57
&lt;/span>&lt;span class="lnt"> 58
&lt;/span>&lt;span class="lnt"> 59
&lt;/span>&lt;span class="lnt"> 60
&lt;/span>&lt;span class="lnt"> 61
&lt;/span>&lt;span class="lnt"> 62
&lt;/span>&lt;span class="lnt"> 63
&lt;/span>&lt;span class="lnt"> 64
&lt;/span>&lt;span class="lnt"> 65
&lt;/span>&lt;span class="lnt"> 66
&lt;/span>&lt;span class="lnt"> 67
&lt;/span>&lt;span class="lnt"> 68
&lt;/span>&lt;span class="lnt"> 69
&lt;/span>&lt;span class="lnt"> 70
&lt;/span>&lt;span class="lnt"> 71
&lt;/span>&lt;span class="lnt"> 72
&lt;/span>&lt;span class="lnt"> 73
&lt;/span>&lt;span class="lnt"> 74
&lt;/span>&lt;span class="lnt"> 75
&lt;/span>&lt;span class="lnt"> 76
&lt;/span>&lt;span class="lnt"> 77
&lt;/span>&lt;span class="lnt"> 78
&lt;/span>&lt;span class="lnt"> 79
&lt;/span>&lt;span class="lnt"> 80
&lt;/span>&lt;span class="lnt"> 81
&lt;/span>&lt;span class="lnt"> 82
&lt;/span>&lt;span class="lnt"> 83
&lt;/span>&lt;span class="lnt"> 84
&lt;/span>&lt;span class="lnt"> 85
&lt;/span>&lt;span class="lnt"> 86
&lt;/span>&lt;span class="lnt"> 87
&lt;/span>&lt;span class="lnt"> 88
&lt;/span>&lt;span class="lnt"> 89
&lt;/span>&lt;span class="lnt"> 90
&lt;/span>&lt;span class="lnt"> 91
&lt;/span>&lt;span class="lnt"> 92
&lt;/span>&lt;span class="lnt"> 93
&lt;/span>&lt;span class="lnt"> 94
&lt;/span>&lt;span class="lnt"> 95
&lt;/span>&lt;span class="lnt"> 96
&lt;/span>&lt;span class="lnt"> 97
&lt;/span>&lt;span class="lnt"> 98
&lt;/span>&lt;span class="lnt"> 99
&lt;/span>&lt;span class="lnt">100
&lt;/span>&lt;span class="lnt">101
&lt;/span>&lt;span class="lnt">102
&lt;/span>&lt;span class="lnt">103
&lt;/span>&lt;span class="lnt">104
&lt;/span>&lt;span class="lnt">105
&lt;/span>&lt;span class="lnt">106
&lt;/span>&lt;span class="lnt">107
&lt;/span>&lt;span class="lnt">108
&lt;/span>&lt;span class="lnt">109
&lt;/span>&lt;span class="lnt">110
&lt;/span>&lt;span class="lnt">111
&lt;/span>&lt;span class="lnt">112
&lt;/span>&lt;span class="lnt">113
&lt;/span>&lt;span class="lnt">114
&lt;/span>&lt;span class="lnt">115
&lt;/span>&lt;span class="lnt">116
&lt;/span>&lt;span class="lnt">117
&lt;/span>&lt;span class="lnt">118
&lt;/span>&lt;span class="lnt">119
&lt;/span>&lt;span class="lnt">120
&lt;/span>&lt;span class="lnt">121
&lt;/span>&lt;span class="lnt">122
&lt;/span>&lt;span class="lnt">123
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="kn">import&lt;/span> &lt;span class="nn">numpy&lt;/span> &lt;span class="k">as&lt;/span> &lt;span class="nn">np&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kn">from&lt;/span> &lt;span class="nn">qiskit&lt;/span> &lt;span class="kn">import&lt;/span> &lt;span class="n">QuantumCircuit&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kn">from&lt;/span> &lt;span class="nn">qiskit_aer&lt;/span> &lt;span class="kn">import&lt;/span> &lt;span class="n">AerSimulator&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kn">from&lt;/span> &lt;span class="nn">qiskit.visualization&lt;/span> &lt;span class="kn">import&lt;/span> &lt;span class="n">plot_histogram&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kn">from&lt;/span> &lt;span class="nn">fractions&lt;/span> &lt;span class="kn">import&lt;/span> &lt;span class="n">Fraction&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kn">import&lt;/span> &lt;span class="nn">math&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 1. 역 양자 푸리에 변환 (QFT†) 을 구성하는 함수&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">def&lt;/span> &lt;span class="nf">qft_dagger&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">n&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;&amp;#34;&amp;#34;n 양자 비트의 역 양자 푸리에 변환 회로를 생성한다&amp;#34;&amp;#34;&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">qc&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">QuantumCircuit&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">n&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># 순서를 반전하기 위한 SWAP 게이트&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">for&lt;/span> &lt;span class="n">qubit&lt;/span> &lt;span class="ow">in&lt;/span> &lt;span class="nb">range&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">n&lt;/span>&lt;span class="o">//&lt;/span>&lt;span class="mi">2&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">qc&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">swap&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">qubit&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">n&lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">qubit&lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># 제어 위상 게이트와 H 게이트의 적용&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">for&lt;/span> &lt;span class="n">j&lt;/span> &lt;span class="ow">in&lt;/span> &lt;span class="nb">range&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">n&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">for&lt;/span> &lt;span class="n">m&lt;/span> &lt;span class="ow">in&lt;/span> &lt;span class="nb">range&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">j&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">qc&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">cp&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">np&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">pi&lt;/span>&lt;span class="o">/&lt;/span>&lt;span class="nb">float&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">2&lt;/span>&lt;span class="o">**&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">j&lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">m&lt;/span>&lt;span class="p">)),&lt;/span> &lt;span class="n">m&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">j&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">qc&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">h&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">j&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">qc&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">name&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="s2">&amp;#34;QFT_dagger&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="n">qc&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 2. 7^x mod 15 의 제어 모듈러 거듭제곱 연산을 구성하는 함수&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">def&lt;/span> &lt;span class="nf">c_amod15&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">a&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">power&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;&amp;#34;&amp;#34;특정 a와 거듭제곱에 대한 제어 U 게이트를 생성한다(N=15 전용)&amp;#34;&amp;#34;&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">U&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">QuantumCircuit&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">4&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">for&lt;/span> &lt;span class="n">_&lt;/span> &lt;span class="ow">in&lt;/span> &lt;span class="nb">range&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">power&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># a=7인 경우의 7^x mod 15 의 하드코딩 논리&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="n">a&lt;/span> &lt;span class="ow">in&lt;/span> &lt;span class="p">[&lt;/span>&lt;span class="mi">2&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="mi">13&lt;/span>&lt;span class="p">]:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">U&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">swap&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">2&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="mi">3&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">U&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">swap&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="mi">2&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">U&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">swap&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="n">a&lt;/span> &lt;span class="ow">in&lt;/span> &lt;span class="p">[&lt;/span>&lt;span class="mi">7&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="mi">8&lt;/span>&lt;span class="p">]:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">U&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">swap&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">U&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">swap&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="mi">2&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">U&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">swap&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">2&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="mi">3&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="n">a&lt;/span> &lt;span class="ow">in&lt;/span> &lt;span class="p">[&lt;/span>&lt;span class="mi">4&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">11&lt;/span>&lt;span class="p">]:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">U&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">swap&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="mi">3&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">U&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">swap&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="mi">2&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="n">a&lt;/span> &lt;span class="ow">in&lt;/span> &lt;span class="p">[&lt;/span>&lt;span class="mi">7&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="mi">11&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="mi">13&lt;/span>&lt;span class="p">]:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">for&lt;/span> &lt;span class="n">q&lt;/span> &lt;span class="ow">in&lt;/span> &lt;span class="nb">range&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">4&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">U&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">x&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">q&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">U&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">U&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">to_gate&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">U&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">name&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="sa">f&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">a&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">^&lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">power&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2"> mod 15&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">c_U&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">U&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">control&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="n">c_U&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 3. 메인 양자 회로 구성&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">def&lt;/span> &lt;span class="nf">shor_circuit&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">a&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">n_count&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># n_count: 제어 레지스터의 비트 수&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># 타겟 레지스터는 0~15 를 표현하기 위해 4비트&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">qc&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">QuantumCircuit&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">n_count&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="mi">4&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">n_count&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># 제1 레지스터(제어 레지스터)의 초기화(중첩의 생성)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">for&lt;/span> &lt;span class="n">q&lt;/span> &lt;span class="ow">in&lt;/span> &lt;span class="nb">range&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">n_count&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">qc&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">h&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">q&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># 제2 레지스터(타겟 레지스터)를 |1&amp;gt; (0001) 로 초기화&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">qc&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">x&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">3&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="n">n_count&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># 제어 모듈러 거듭제곱 연산(오라클)의 적용&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">for&lt;/span> &lt;span class="n">q&lt;/span> &lt;span class="ow">in&lt;/span> &lt;span class="nb">range&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">n_count&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># 2^q 승의 연산을 적용&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">qc&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">append&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">c_amod15&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">a&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">2&lt;/span>&lt;span class="o">**&lt;/span>&lt;span class="n">q&lt;/span>&lt;span class="p">),&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">[&lt;/span>&lt;span class="n">q&lt;/span>&lt;span class="p">]&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="p">[&lt;/span>&lt;span class="n">i&lt;/span>&lt;span class="o">+&lt;/span>&lt;span class="n">n_count&lt;/span> &lt;span class="k">for&lt;/span> &lt;span class="n">i&lt;/span> &lt;span class="ow">in&lt;/span> &lt;span class="nb">range&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">4&lt;/span>&lt;span class="p">)])&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># 제1 레지스터에 역 양자 푸리에 변환을 적용&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">qc&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">append&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">qft_dagger&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">n_count&lt;/span>&lt;span class="p">),&lt;/span> &lt;span class="nb">range&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">n_count&lt;/span>&lt;span class="p">))&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># 제1 레지스터를 측정&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">qc&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">measure&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nb">range&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">n_count&lt;/span>&lt;span class="p">),&lt;/span> &lt;span class="nb">range&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">n_count&lt;/span>&lt;span class="p">))&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="n">qc&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># --- 실행 섹션 ---&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">if&lt;/span> &lt;span class="vm">__name__&lt;/span> &lt;span class="o">==&lt;/span> &lt;span class="s2">&amp;#34;__main__&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">N&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mi">15&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">a&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mi">7&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">n_count&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mi">8&lt;/span> &lt;span class="c1"># 제어 레지스터에 8 양자 비트를 사용 (Q=256)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="sa">f&lt;/span>&lt;span class="s2">&amp;#34;탐색 설정: N=&lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">N&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">, a=&lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">a&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">, 제어 양자 비트 수=&lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">n_count&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># 회로의 생성&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">qc&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">shor_circuit&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">a&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">n_count&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># 시뮬레이터에서의 실행&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">sim&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">AerSimulator&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># 최신 Qiskit에서는 transpile을 권장&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kn">from&lt;/span> &lt;span class="nn">qiskit&lt;/span> &lt;span class="kn">import&lt;/span> &lt;span class="n">transpile&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">compiled_circuit&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">transpile&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">qc&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">sim&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">job&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">sim&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">run&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">compiled_circuit&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">shots&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="mi">1024&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">result&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">job&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">result&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">counts&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">result&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">get_counts&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="se">\n&lt;/span>&lt;span class="s2">측정 결과(비트열: 관측 횟수):&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">for&lt;/span> &lt;span class="n">bitstring&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">count&lt;/span> &lt;span class="ow">in&lt;/span> &lt;span class="n">counts&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">items&lt;/span>&lt;span class="p">():&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="sa">f&lt;/span>&lt;span class="s2">&amp;#34; &lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">bitstring&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">: &lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">count&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">회&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># 고전적 후처리: 연분수 전개에 의한 주기 r의 특정&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="se">\n&lt;/span>&lt;span class="s2">--- 주기의 계산과 소인수분해 ---&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">phases&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="p">[]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">for&lt;/span> &lt;span class="n">output&lt;/span> &lt;span class="ow">in&lt;/span> &lt;span class="n">counts&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># 비트열을 10진수로 변환&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">decimal&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nb">int&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">output&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">2&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># 위상 = 측정값 / 2^n_count&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">phase&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">decimal&lt;/span> &lt;span class="o">/&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="mi">2&lt;/span>&lt;span class="o">**&lt;/span>&lt;span class="n">n_count&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">phases&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">append&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">phase&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># 연분수 전개에 의해 근사 분수를 획득. 분모의 상한은 N=15&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">frac&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">Fraction&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">phase&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">limit_denominator&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">15&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">r&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">frac&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">denominator&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="sa">f&lt;/span>&lt;span class="s2">&amp;#34;관측값: &lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">decimal&lt;/span>&lt;span class="si">:&lt;/span>&lt;span class="s2">3d&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2"> | 위상: &lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">phase&lt;/span>&lt;span class="si">:&lt;/span>&lt;span class="s2">.4f&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2"> | 연분수: &lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">frac&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2"> | 추정 주기 r = &lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">r&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># 주기 r이 짝수이고 유효한 결과를 가져오는지 확인&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="n">r&lt;/span> &lt;span class="o">%&lt;/span> &lt;span class="mi">2&lt;/span> &lt;span class="o">==&lt;/span> &lt;span class="mi">0&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">guess1&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">math&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">gcd&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">a&lt;/span>&lt;span class="o">**&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">r&lt;/span>&lt;span class="o">//&lt;/span>&lt;span class="mi">2&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">-&lt;/span> &lt;span class="mi">1&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">N&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">guess2&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">math&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">gcd&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">a&lt;/span>&lt;span class="o">**&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">r&lt;/span>&lt;span class="o">//&lt;/span>&lt;span class="mi">2&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="mi">1&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">N&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="n">guess1&lt;/span> &lt;span class="ow">not&lt;/span> &lt;span class="ow">in&lt;/span> &lt;span class="p">[&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">N&lt;/span>&lt;span class="p">]&lt;/span> &lt;span class="ow">or&lt;/span> &lt;span class="n">guess2&lt;/span> &lt;span class="ow">not&lt;/span> &lt;span class="ow">in&lt;/span> &lt;span class="p">[&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">N&lt;/span>&lt;span class="p">]:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="sa">f&lt;/span>&lt;span class="s2">&amp;#34; =&amp;gt; 성공! &lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">N&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2"> 의 소인수는 &lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">guess1&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2"> 와(과) &lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">guess2&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2"> 입니다.&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">else&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="sa">f&lt;/span>&lt;span class="s2">&amp;#34; =&amp;gt; 자명한 인수뿐임. 다시 시도.&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">else&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="sa">f&lt;/span>&lt;span class="s2">&amp;#34; =&amp;gt; 주기가 홀수이므로 실패.&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;h2 id="코드의-해설과-실행-결과의-해석">코드의 해설과 실행 결과의 해석
&lt;/h2>&lt;p>위의 코드를 실행하면 제어 레지스터의 측정 결과로서 높은 확률로 특정 피크(관측값)를 얻을 수 있습니다. &lt;code>n_count=8&lt;/code>($Q=256$)인 경우, 이상적인 양자 컴퓨터(또는 시뮬레이터)라면 관측값으로 &lt;code>0&lt;/code>, &lt;code>64&lt;/code>, &lt;code>128&lt;/code>, &lt;code>192&lt;/code>와 같은 수치가 압도적인 확률로 출현합니다.&lt;/p>
&lt;p>이것들을 $Q=256$으로 나누면 위상 $y/Q$는 각각 $0.0$, $0.25$, $0.5$, $0.75$가 됩니다.
이 위상을 연분수 전개하면:&lt;/p>
&lt;ul>
&lt;li>$0.25 \to 1/4$ (추정 주기 $r=4$)&lt;/li>
&lt;li>$0.50 \to 1/2$ (추정 주기 $r=2$)&lt;/li>
&lt;li>$0.75 \to 3/4$ (추정 주기 $r=4$)&lt;/li>
&lt;/ul>
&lt;p>여기서 얻어진 주기 $r=4$를 사용하여 소인수를 계산합니다.
$a=7, r=4$이므로,
$p = \gcd(7^2 - 1, 15) = \gcd(48, 15) = 3$
$q = \gcd(7^2 + 1, 15) = \gcd(50, 15) = 5$&lt;/p>
&lt;p>훌륭하게 $15 = 3 \times 5$의 소인수분해에 성공했습니다.&lt;/p>
&lt;blockquote>
&lt;p>[!TIP]
측정값으로 $y=128$(위상 $0.5$)을 얻은 경우, 분모는 $2$가 되어 참값인 주기 $r=4$가 아니라 그 약수를 얻게 됩니다. 이런 경우에는 알고리즘을 여러 번 실행하거나 얻어진 $r$의 배수를 조사함으로써 진짜 주기에 도달할 수 있습니다.&lt;/p>
&lt;/blockquote>
&lt;hr>
&lt;h1 id="6-실용화를-향한-과제와-nisq-시대의-한계">6. 실용화를 향한 과제와 NISQ 시대의 한계
&lt;/h1>&lt;p>시뮬레이터 상에서 $N=15$를 소인수분해하는 것은 간단하게 할 수 있었지만, 실제 사회에서 사용되고 있는 RSA-2048(617자리의 10진수)을 소인수분해하려면 현실의 양자 컴퓨터에는 아직 수많은 장벽이 존재합니다.&lt;/p>
&lt;p>현재 우리가 살고 있는 시대는 &lt;strong>NISQ(Noisy Intermediate-Scale Quantum: 노이즈가 있는 중간 규모 양자) 시대&lt;/strong>라고 불립니다. 양자 비트는 외부 환경의 노이즈에 극히 취약하여, 계산 도중에 &amp;lsquo;결어긋남(데코히어런스)&amp;lsquo;을 일으켜 상태가 깨져 버립니다.&lt;/p>
&lt;p>쇼어의 알고리즘과 같이 깊은(게이트 수가 많은) 회로를 정확하게 실행하기 위해서는 노이즈를 정정하는 **양자 오류 정정(Quantum Error Correction)**이 필수적입니다. 하나의 노이즈 없는 &amp;lsquo;논리 양자 비트&amp;rsquo;를 만들어 내기 위해 수천 개의 &amp;lsquo;물리 양자 비트&amp;rsquo;를 표면 부호(Surface Code) 등으로 인코딩해야 합니다.&lt;/p>
&lt;p>2048비트의 RSA 암호를 깨기 위해서는 수천 개의 완벽한 논리 양자 비트가 필요하며, 이를 실현하려면 &lt;strong>수백만에서 수천만 개의 물리 양자 비트&lt;/strong>를 탑재한 결함 허용(오류 내성) 양자 컴퓨터가 필요할 것으로 추산되고 있습니다. 현재 최첨단 양자 프로세서도 수백~수천 물리 양자 비트 정도이기 때문에, 당장 전 세계의 암호가 깨지는 것은 아닙니다.&lt;/p>
&lt;blockquote>
&lt;p>[!WARNING]
그러나 &amp;ldquo;Store Now, Decrypt Later(지금 저장하고, 나중에 해독한다)&amp;ldquo;라는 위협 모델이 존재합니다. 공격자는 현재 암호화되어 있는 기밀 통신을 암호 데이터인 채로 대량으로 저장해 두고, 10~20년 후에 강력한 양자 컴퓨터가 완성되는 순간에 모든 것을 해독하려는 전략을 취할 가능성이 있습니다.&lt;/p>
&lt;/blockquote>
&lt;hr>
&lt;h1 id="7-양자-내성-암호pqc로의-전환">7. 양자 내성 암호(PQC)로의 전환
&lt;/h1>&lt;p>이러한 &amp;lsquo;Q-Day(양자 컴퓨터가 암호를 깨는 날)&amp;lsquo;의 도래에 대비하여, 미국 국립표준기술연구소(NIST)를 필두로 전 세계 암호학자들이 **양자 내성 암호(Post-Quantum Cryptography, PQC)**의 제정을 추진하고 있습니다.&lt;/p>
&lt;p>PQC는 쇼어의 알고리즘을 사용해도 (혹은 그로버의 알고리즘을 사용해도) 효율적으로 풀 수 없을 것으로 수학적으로 여겨지는 새로운 수학적 문제(격자 문제, 다변수 다항식 문제, 해시 함수 기반 등)를 기반으로 하고 있습니다. 이미 &amp;lsquo;CRYSTALS-Kyber&amp;rsquo;나 &amp;lsquo;CRYSTALS-Dilithium&amp;rsquo;과 같은 알고리즘이 표준 규격으로 선정되어, Apple의 iMessage나 각종 웹 브라우저의 통신 프로토콜에 도입이 서서히 시작되고 있습니다.&lt;/p>
&lt;p>IT 인프라를 관리하는 엔지니어에게 있어, 기존의 RSA나 타원곡선 암호에서 PQC로의 &amp;lsquo;크립토 어질리티(암호 민첩성: 빠르게 암호 방식을 전환할 수 있는 설계)&amp;lsquo;를 시스템에 통합하는 것이 향후 큰 과제가 될 것입니다.&lt;/p>
&lt;hr>
&lt;h1 id="8-맺음말">8. 맺음말
&lt;/h1>&lt;p>본 기사에서는 쇼어 알고리즘의 이론적인 수학적 배경에서 시작하여 양자 푸리에 변환을 사용한 주기 추출의 메커니즘, 그리고 Python과 Qiskit을 이용한 구체적인 시뮬레이션 코드까지 1만 자 규모의 분량으로 철저하게 해설했습니다.&lt;/p>
&lt;p>양자역학이라는 미시적 세계의 물리 법칙이 거시적 정보과학의 근간인 계산량 이론이나 암호 이론을 근본부터 뒤엎어 버린다는 사실은 과학의 역사에 있어 가장 흥미진진한 패러다임 전환 중 하나입니다. 현재 진행형으로 계속 발전하고 있는 양자 컴퓨팅 기술과 그에 맞서는 새로운 암호 기술의 공방전에서 앞으로도 눈을 뗄 수 없습니다.&lt;/p>
&lt;p>꼭 이번에 소개한 Python 코드를 자신의 환경에서 실행해 보시고, 양자 상태의 중첩과 간섭이 만들어 내는 &amp;lsquo;계산의 마법&amp;rsquo;을 체감해 보시기 바랍니다.&lt;/p>
&lt;hr>
&lt;p>&lt;strong>참고 문헌&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>Shor, P. W. (1994). &amp;ldquo;Algorithms for quantum computation: discrete logarithms and factoring&amp;rdquo;. Proceedings 35th Annual Symposium on Foundations of Computer Science.&lt;/li>
&lt;li>Nielsen, M. A., &amp;amp; Chuang, I. L. (2010). &amp;ldquo;Quantum Computation and Quantum Information&amp;rdquo;. Cambridge University Press.&lt;/li>
&lt;li>Qiskit Documentation: &lt;a class="link" href="https://qiskit.org/documentation/" target="_blank" rel="noopener"
>https://qiskit.org/documentation/&lt;/a>&lt;/li>
&lt;/ul></description></item><item><title>【도해 PQC】 양자 내성 암호의 주요 알고리즘 비교</title><link>http://kenji.blog/ko/p/post-quantum-cryptography-algorithms-comparison/</link><pubDate>Fri, 11 Sep 2026 07:00:00 +0900</pubDate><guid>http://kenji.blog/ko/p/post-quantum-cryptography-algorithms-comparison/</guid><description>&lt;img src="http://kenji.blog/p/post-quantum-cryptography-algorithms-comparison/img/eyecatch.jpg" alt="Featured image of post 【도해 PQC】 양자 내성 암호의 주요 알고리즘 비교" />&lt;h2 id="1-시작하며-양자-컴퓨터가-가져올-암호의-위기">1. 시작하며: 양자 컴퓨터가 가져올 &amp;lsquo;암호의 위기&amp;rsquo;
&lt;/h2>&lt;p>현대 인터넷 사회에서 통신의 기밀성과 데이터의 무결성을 보호하기 위해 공개키 암호 기술은 인프라로서 필수 불가결합니다. 현재 널리 사용되고 있는 RSA 암호나 타원 곡선 암호(ECC)는 각각 &amp;lsquo;거대한 합성수의 소인수분해의 어려움&amp;rsquo;이나 &amp;lsquo;타원 곡선 상의 이산대수 문제의 어려움&amp;rsquo;이라는 수학적인 장벽에 의존하여 안전성을 담보하고 있습니다. 고전적인 컴퓨터(슈퍼컴퓨터를 포함하여 현재 우리가 사용하고 있는 컴퓨터)에서는 이러한 수학적 문제를 풀기 위해서는 우주의 나이보다 더 오랜 시간이 걸린다고 증명되어 있으며, 그것이 안전성의 근거가 되어 왔습니다.&lt;/p>
&lt;p>그러나 이 견고한 전제는 &lt;strong>양자 컴퓨터&lt;/strong>의 이론과 실용화의 진전으로 인해 근본적으로 뒤집히려 하고 있습니다. 1994년에 암호학자 피터 쇼어(Peter Shor)가 발표한 &amp;lsquo;&lt;strong>쇼어의 알고리즘(Shor&amp;rsquo;s Algorithm)&lt;/strong>&amp;lsquo;은 충분한 성능을 가진 오류 내성 범용 양자 컴퓨터(CRQC: Cryptographically Relevant Quantum Computer)에서 실행함으로써 소인수분해 문제나 이산대수 문제를 &amp;lsquo;다항식 시간&amp;rsquo;에 해독할 수 있음을 이론적으로 증명했습니다. 이는 현재 사용되고 있는 공개키 암호가 모두 무력화됨을 의미합니다.&lt;/p>
&lt;div class="mermaid">graph TD
A["대규모 양자 컴퓨터 (CRQC)"] -->|실행| B["쇼어의 알고리즘"]
B -->|다항식 시간에 해독| C["소인수분해 문제 (RSA)"]
B -->|다항식 시간에 해독| D["이산대수 문제 (ECC / ECDSA)"]
C --> E["암호 통신의 도청·데이터 위조·스푸핑"]
D --> E
F["Store Now, Decrypt Later (SNDL)"] --> E&lt;/div>
&lt;p>&amp;ldquo;양자 컴퓨터의 본격적인 완성은 아직 수십 년 후의 일이므로 문제없다&amp;quot;라고 생각하는 것은 매우 위험합니다. 왜냐하면, &lt;strong>Store Now, Decrypt Later (SNDL: 지금 저장하고 나중에 복호화한다)&lt;/strong> 라고 불리는 공격 기법이 이미 현실적인 위협이 되고 있기 때문입니다. 이는 악의적인 국가나 해커 조직이 현재 암호화된 통신 데이터(TLS 트래픽 등)를 대량으로 스토리지에 저장해 두었다가, 장래에 강력한 양자 컴퓨터를 이용할 수 있게 되는 순간 그것들을 모두 복호화하는 공격입니다. 국가 기밀, 인프라 정보, 장기간 보호해야 할 의료 데이터 등은 이미 이러한 위협에 노출되어 있습니다.&lt;/p>
&lt;p>또한 대칭키 암호(AES 등)나 해시 함수(SHA-256 등)에 대해서도 1996년에 발견된 &lt;strong>그로버의 알고리즘(Grover&amp;rsquo;s Algorithm)&lt;/strong> 이 존재합니다. 이로 인해 무차별 대입 공격(브루트 포스)의 계산량이 제곱근으로 감소합니다. 즉, AES-128의 보안 수준은 실질적으로 2의 64승으로 반감되기 때문에, 양자 시대에는 AES-256이나 SHA-384와 같은 더 긴 키나 해시 길이를 사용하는 것이 권장됩니다.&lt;/p>
&lt;p>이 전례 없는 암호 위기에 대항하기 위해 탄생한 것이 바로 양자 컴퓨터를 사용해도 해독이 어려운 새로운 수학적 문제에 기반한 &lt;strong>양자 내성 암호(Post-Quantum Cryptography: PQC)&lt;/strong> 입니다. 본 기사에서는 미국 국립표준기술연구소(NIST)가 주도하여 진행해 온 PQC 표준화 프로세스의 결과에 바탕을 두고, 주요 PQC 알고리즘에 대해 그 수학적 배경부터 작동 원리, 아키텍처 비교까지 매우 상세하게 해설합니다.&lt;/p>
&lt;hr>
&lt;h2 id="2-nist의-pqc-표준화-프로젝트의-전모와-역사">2. NIST의 PQC 표준화 프로젝트의 전모와 역사
&lt;/h2>&lt;p>암호 기술의 전환에는 프로토콜의 재설계, 시스템 업데이트, 하드웨어 교체 등을 포함하여 수년에서 수십 년의 시간이 걸립니다. 그렇기 때문에 전 세계의 암호학자들은 초기부터 PQC 연구를 진행해 왔습니다. 그 중심적인 역할을 맡아온 곳이 미국의 NIST(국립표준기술연구소)입니다. NIST는 2016년에 PQC의 표준화 프로세스를 공모하여 전 세계의 암호 커뮤니티로부터 전혀 새로운 암호 알고리즘의 제안을 받았습니다.&lt;/p>
&lt;p>표준화 대상이 된 것은 다음 두 가지 주요 카테고리입니다.&lt;/p>
&lt;ol>
&lt;li>&lt;strong>공개키 암호 / 키 캡슐화 메커니즘 (KEM: Key Encapsulation Mechanism)&lt;/strong>: TLS 연결 등에서 통신 경로를 암호화하기 위한 대칭키를 안전하게 공유(분배)하기 위한 구조.&lt;/li>
&lt;li>&lt;strong>디지털 서명 (Digital Signatures)&lt;/strong>: 소프트웨어 업데이트나 전자 인증서에서 데이터가 위조되지 않았음과 송신자의 스푸핑이 없음(진정성)을 증명하기 위한 구조.&lt;/li>
&lt;/ol>
&lt;p>약 6년에 걸친 매우 치열한 평가·분석 및 암호 해독 경쟁(Round 1~Round 3)을 거쳐, 일부 알고리즘에 대해서는 Round 4의 추가 평가가 이루어졌습니다. 그 결과, 2024년에 다음 알고리즘들이 정식 연방 정보 처리 표준(FIPS)으로 발행되어 향후 세계 표준으로 확정되었습니다.&lt;/p>
&lt;ul>
&lt;li>&lt;strong>FIPS 203 (ML-KEM)&lt;/strong>: CRYSTALS-Kyber 기반 KEM&lt;/li>
&lt;li>&lt;strong>FIPS 204 (ML-DSA)&lt;/strong>: CRYSTALS-Dilithium 기반 디지털 서명&lt;/li>
&lt;li>&lt;strong>FIPS 205 (SLH-DSA)&lt;/strong>: SPHINCS+ 기반 상태 비저장(Stateless) 해시 기반 서명&lt;/li>
&lt;li>&lt;strong>(향후 책정 예정) FN-DSA&lt;/strong>: FALCON 기반 디지털 서명&lt;/li>
&lt;/ul>
&lt;p>선정된 이 알고리즘들은 의존하는 수학적인 &amp;lsquo;어려움 문제&amp;rsquo;가 각각 달라서, 어느 한 알고리즘에서 장래 치명적인 취약점이 발견되더라도 시스템 전체가 붕괴하지 않도록 다양성(Crypto Agility)이 확보되어 있습니다. 표준화 과정에서는 주로 성능 면에서 격자 기반 암호(Lattice-based cryptography)가 주역이 되었지만, 해시 기반 암호나 코드 기반 암호가 강력한 백업으로 채택되었습니다.&lt;/p>
&lt;hr>
&lt;h2 id="3-pqc의-주요-수학적-접근-방식-분류">3. PQC의 주요 수학적 접근 방식 분류
&lt;/h2>&lt;p>PQC 알고리즘은 그 안전성의 근거가 되는 수학적 문제에 따라 주로 다음 5가지 카테고리로 크게 나뉩니다. 본 기사에서는 특히 상위 3가지에 대해 자세히 파고듭니다.&lt;/p>
&lt;ol>
&lt;li>&lt;strong>격자 기반 암호 (Lattice-based Cryptography)&lt;/strong>:
다차원 격자 공간에서의 최단 벡터 문제(SVP)나 최근접 벡터 문제(CVP), 그리고 여기서 파생된 LWE 문제에 기반합니다. NIST 표준화의 중심이며, Kyber, Dilithium, FALCON이 이에 해당합니다. 처리 속도, 공개키 크기, 암호문 크기의 균형이 가장 뛰어나 범용적인 사용에 적합합니다.&lt;/li>
&lt;li>&lt;strong>해시 기반 암호 (Hash-based Cryptography)&lt;/strong>:
암호학적 해시 함수(SHA-2, SHAKE 등)의 &amp;lsquo;충돌 저항성&amp;rsquo;과 &amp;lsquo;일방향성&amp;rsquo;에만 안전성의 근거를 둡니다. 디지털 서명(SPHINCS+ 등)에만 적용 가능하지만, 안전성 증명이 가장 확고하며 미지의 수학적 공격에 대한 내성이 극히 높은 것이 특징입니다.&lt;/li>
&lt;li>&lt;strong>코드 기반 암호 (Code-based Cryptography)&lt;/strong>:
오류 정정 코드 이론에 기반하여 신드롬 복호화 문제(Syndrome Decoding Problem)의 어려움에 의존합니다. 1970년대에 제안된 Classic McEliece가 대표적으로, 매우 긴 역사와 입증된 안전성을 가지는 반면 공개키의 크기가 메가바이트 단위로 극단적으로 큽니다.&lt;/li>
&lt;li>&lt;strong>다변수 다항식 암호 (Multivariate Polynomial Cryptography)&lt;/strong>:
유한체 상의 다변수 연립 이차방정식의 해를 구하는 것(MQ 문제)의 어려움에 기반합니다. 주로 디지털 서명(Rainbow 등)으로 제안되었으나, NIST의 최종 라운드 진행 중에 PC 1대로 며칠 만에 해독되는 강력한 공격 기법이 발견되어 많은 알고리즘이 표준화에서 탈락했습니다.&lt;/li>
&lt;li>&lt;strong>동종 사상 암호 (Isogeny-based Cryptography)&lt;/strong>:
타원 곡선의 동종 사상(Isogeny) 그래프 상에서의 경로 탐색 문제에 기반합니다. 키 크기가 매우 작아 ECC의 정당한 후계자로 기대되었으나, 최종 후보였던 &amp;lsquo;SIKE&amp;rsquo;가 2022년에 고전적인 수학(Castryck-Decru 공격 등)을 이용하여 일반 PC에서 불과 몇 시간 만에 완전히 해독되어 PQC 설계의 어려움과 두려움을 상징하는 극적인 결말을 맞았습니다.&lt;/li>
&lt;/ol>
&lt;hr>
&lt;h2 id="4-격자-암호의-심연-lwe-문제와-module-lwe의-수학적-기초">4. 격자 암호의 심연: LWE 문제와 Module-LWE의 수학적 기초
&lt;/h2>&lt;p>현재 가장 유력하게 여겨지며 표준화의 중심이 된 &lt;strong>격자 기반 암호&lt;/strong>. 그 안전성의 근저에 있는 것이 &lt;strong>LWE 문제 (Learning with Errors: 오차가 있는 학습 문제)&lt;/strong> 입니다. 2005년에 Oded Regev가 제창하였고, 이 획기적인 공적으로 그는 괴델상(Gödel Prize)을 수상했습니다. LWE 문제를 이해하지 않고서는 현대의 PQC를 논할 수 없습니다.&lt;/p>
&lt;h3 id="41-lwe-문제learning-with-errors란-무엇인가">4.1. LWE 문제(Learning with Errors)란 무엇인가
&lt;/h3>&lt;p>먼저 간단한 연립 일차 방정식을 생각해 봅시다. 어떤 법 $q$ (모듈로 $q$) 하에서 알려진 임의의 행렬 $A$와 알려지지 않은 비밀 벡터 $\vec{s}$가 있고 그 곱인 $\vec{b}$가 주어졌다고 가정합시다.&lt;/p>
$$ \vec{b} = A\vec{s} \pmod q $$
&lt;p>이때 공개 정보인 $A$와 $\vec{b}$로부터 미지의 $\vec{s}$를 구하는 것은 간단합니다. 고전적인 알고리즘인 &amp;lsquo;가우스 소거법&amp;rsquo;을 사용하면 다항식 시간에 쉽게 $\vec{s}$를 계산할 수 있습니다.&lt;/p>
&lt;p>그러나 이 식에 &amp;lsquo;작고 의도적인 오차(노이즈)&amp;lsquo;를 더하면 문제의 난이도가 극적으로 상승합니다. 이것이 바로 &lt;strong>LWE 문제&lt;/strong>입니다.&lt;/p>
&lt;p>미지의 비밀 벡터 $\vec{s} \in \mathbb{Z}_q^n$과 임의로 선택된 행렬 $A \in \mathbb{Z}_q^{m \times n}$를 준비합니다. 나아가 정규분포나 이항분포 등에 따라 선택된 &amp;lsquo;요소의 값이 충분히 작은&amp;rsquo; 오차 벡터 $\vec{e} \in \mathbb{Z}_q^m$를 준비하고 다음과 같이 $\vec{b}$를 계산합니다.&lt;/p>
$$ \vec{b} = A\vec{s} + \vec{e} \pmod q $$
&lt;p>&lt;strong>Search LWE 문제&lt;/strong>란 &amp;ldquo;공개 정보 $(A, \vec{b})$로부터 비밀 정보 $\vec{s}$를 구하라&amp;quot;는 문제입니다. 이 오차 $\vec{e}$가 존재함으로써 가우스 소거법 등 대수학적 해법을 시도하려 하면, 방정식을 더하고 빼는 과정에서 오차 $\vec{e}$가 눈덩이처럼 증폭되어 최종적으로 무작위 값과 구별할 수 없게 되어 파탄 나고 맙니다.&lt;/p>
&lt;p>LWE 문제의 대단한 점은 &amp;lsquo;격자 상의 최악 경우 계산 복잡도 문제(Worst-case hardness)&amp;lsquo;인 GapSVP(판정 최단 벡터 문제)나 SIVP(최단 독립 벡터 문제)를 풀 수 있는 양자 알고리즘이 존재하지 않는 한, LWE 문제도 평균적(Average-case)으로 풀 수 없다는 강력한 이론적 증명(환원)이 존재한다는 것입니다. 즉, 무작위로 생성된 암호키라 하더라도 이론적인 한계에 의해 뒷받침되는 확고한 안전성을 가짐이 보장되어 있습니다.&lt;/p>
&lt;h3 id="42-ring-lwe와-module-lwe를-통한-극적인-효율화">4.2. Ring-LWE와 Module-LWE를 통한 극적인 효율화
&lt;/h3>&lt;p>일반적인 LWE 문제(Standard LWE)는 안전성의 근거가 매우 명확하지만, 행렬 $A$의 크기가 매우 커져 키 크기가 메가바이트 급이 되므로 실용적이지 않습니다. 그래서 제안된 것이 다항식 환(Polynomial Rings)을 이용하여 대수적인 구조를 갖게 하는 접근 방식입니다.&lt;/p>
&lt;p>&lt;strong>Ring-LWE 문제&lt;/strong>에서는 단순한 벡터나 행렬 대신, 어떤 다항식 환 $R_q$의 원소(다항식)를 사용합니다. NIST 표준에서 일반적으로 사용되는 것은 다음과 같은 원분 다항식 환(Cyclotomic Polynomial Ring)입니다.&lt;/p>
$$ R_q = \mathbb{Z}_q[X]/(X^n + 1) $$
&lt;p>여기서 $n$은 2의 거듭제곱(예: 256), $q$는 적당한 소수입니다. 이 환 위에서 요소 $a, s, e \in R_q$를 이용하여 $b = a \cdot s + e \pmod q$를 계산합니다. 하나의 다항식 $a$가 $n$개의 계수를 갖기 때문에 데이터를 대폭 압축할 수 있으며, 나아가 &lt;strong>NTT (Number Theoretic Transform: 수론 변환)&lt;/strong> 라는 고속 푸리에 변환(FFT)의 유한체 버전을 사용함으로써 $O(n \log n)$의 계산량으로 초고속으로 다항식 곱셈이 가능해집니다.&lt;/p>
&lt;p>하지만 Ring-LWE에는 &amp;lsquo;환의 특수한 대수 구조로 인한 미지의 취약점이 존재할지도 모른다&amp;rsquo;는 우려가 있었습니다. 또한 보안 수준(AES-128, 192, 256 상당 등)을 변경할 때 다항식의 차수 $n$ 자체를 변경해야 하며, 이에 따라 NTT 알고리즘 등 구현 전체를 다시 작성해야 한다는 공학적인 과제가 있었습니다.&lt;/p>
&lt;p>그래서 표준화 알고리즘인 Kyber나 Dilithium이 채택한 것이 바로 &lt;strong>Module-LWE (M-LWE) 문제&lt;/strong>입니다. Module-LWE는 구조가 없는 Standard LWE와 너무 많은 구조를 가진 Ring-LWE의 딱 중간에 위치하는 절충안이며, 다항식 환 $R_q$의 요소를 성분으로 하는 $k \times k$의 행렬(모듈)을 사용합니다.&lt;/p>
$$ \vec{b} = A\vec{s} + \vec{e} \pmod{R_q} \quad (A \in R_q^{k \times k}, \vec{s}, \vec{e} \in R_q^k) $$
&lt;p>Module-LWE의 가장 큰 이점은 다항식의 차수 $n$(NIST 표준에서는 $n=256$)을 고정한 채 행렬의 차원 $k$만 변경하여 쉽게 보안 수준을 확장(Scale)할 수 있다는 점입니다.
예를 들어 Kyber의 경우 다음과 같이 차원 $k$를 조정합니다.&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Kyber512 (Level 1)&lt;/strong>: $k = 2$ (AES-128 상당)&lt;/li>
&lt;li>&lt;strong>Kyber768 (Level 3)&lt;/strong>: $k = 3$ (AES-192 상당)&lt;/li>
&lt;li>&lt;strong>Kyber1024 (Level 5)&lt;/strong>: $k = 4$ (AES-256 상당)&lt;/li>
&lt;/ul>
&lt;p>이로 인해 기반이 되는 NTT의 코드나 다항식 연산의 하드웨어 회로를 모든 보안 수준에서 100% 재사용할 수 있게 되어 구현의 안전성과 효율성이 극적으로 향상되었습니다.&lt;/p>
&lt;hr>
&lt;h2 id="5-crystals-kyber-ml-kem-차세대-키-캡슐화-메커니즘">5. CRYSTALS-Kyber (ML-KEM): 차세대 키 캡슐화 메커니즘
&lt;/h2>&lt;p>&lt;strong>FIPS 203 (ML-KEM)&lt;/strong> 으로 공식 표준화된 CRYSTALS-Kyber는 앞서 언급한 Module-LWE 문제에 기반한 키 캡슐화 메커니즘(KEM)입니다. 앞으로 TLS 1.3이나 SSH 등에서 세션 키를 안전하게 공유하기 위한 사실상의 세계 표준이 될 것입니다.&lt;/p>
&lt;h3 id="51-kem-key-encapsulation-mechanism-아키텍처">5.1. KEM (Key Encapsulation Mechanism) 아키텍처
&lt;/h3>&lt;p>PQC의 시대에서는 RSA처럼 &amp;lsquo;클라이언트가 대칭키를 만들어 서버의 공개키로 암호화해서 보낸다&amp;rsquo;는 직접적인 접근 방식이 아니라, KEM이라는 캡슐화의 틀이 표준이 됩니다.&lt;/p>
&lt;div class="mermaid">sequenceDiagram
participant Client as "클라이언트 (Alice)"
participant Server as "서버 (Bob)"
Note over Client: "ML-KEM KeyGen()"
Client->>Client: "비밀키 (sk) 와 공개키 (pk) 생성"
Client->>Server: "공개키 (pk) 전송"
Note over Server: "ML-KEM Encaps()"
Server->>Server: "무작위 대칭키 (K) 생성"
Server->>Server: "K를 pk로 캡슐화하여 암호문 (c) 생성"
Server->>Client: "암호문 (c) 전송"
Note over Client: "ML-KEM Decaps()"
Client->>Client: "비밀키 (sk) 를 사용하여 암호문 (c) 복호화"
Client->>Client: "캡슐화를 해제하고 대칭키 (K) 추출"
Note over Client, Server: "공유한 대칭키 (K) 를 사용하여 AES 등으로 암호화 통신 시작"&lt;/div>
&lt;h3 id="52-kyber-내부-알고리즘의-원리와-후지사키-오카모토-변환fujisaki-okamoto-transform">5.2. Kyber 내부 알고리즘의 원리와 후지사키-오카모토 변환(Fujisaki-Okamoto Transform)
&lt;/h3>&lt;p>Kyber의 설계는 매우 세련되었습니다. 먼저 CPA(선택 평문 공격)에 대해서만 안전한 공개키 암호 방식(Kyber.CPAPKE)을 구축하고, 여기에 &lt;strong>후지사키-오카모토 변환 (Fujisaki-Okamoto Transform)&lt;/strong> 이라고 불리는 암호학적으로 매우 강력 기법을 적용함으로써 CCA(적응적 선택 암호문 공격)에 대해서도 안전한 완전한 KEM으로 업그레이드하는 설계를 채택했습니다.&lt;/p>
&lt;p>CPAPKE의 핵심이 되는 암호화와 복호화의 메커니즘은 다음과 같습니다.&lt;/p>
&lt;ol>
&lt;li>
&lt;p>&lt;strong>키 생성 (Key Generation)&lt;/strong>:&lt;/p>
&lt;ul>
&lt;li>임의의 시드 값으로부터 NTT 도메인 상의 행렬 $A \in R_q^{k \times k}$를 생성합니다. 법 $q$는 $3329$가 사용됩니다.&lt;/li>
&lt;li>중심 이항 분포(CBD)로부터 작은 계수를 갖는 비밀 벡터 $\vec{s}$와 오차 벡터 $\vec{e}$를 샘플링합니다.&lt;/li>
&lt;li>$\vec{t} = A\vec{s} + \vec{e}$를 계산합니다. 공개키는 $(A, \vec{t})$, 비밀키는 $\vec{s}$입니다. (실제로는 $A$는 시드 값으로서 공개되어 대역폭을 절약합니다).&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>암호화 (Encryption)&lt;/strong>:&lt;/p>
&lt;ul>
&lt;li>공유하려는 32바이트 메시지(대칭키의 재료) $m$을 다항식으로 인코딩합니다.&lt;/li>
&lt;li>새로운 임의의 벡터 $\vec{r}$과 작은 오차 $\vec{e_1}, e_2$를 생성합니다.&lt;/li>
&lt;li>$\vec{u} = A^T\vec{r} + \vec{e_1}$&lt;/li>
&lt;li>$v = \vec{t}^T\vec{r} + e_2 + \lfloor q/2 \rceil \cdot m$&lt;/li>
&lt;li>암호문은 $(\vec{u}, v)$가 됩니다.&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>복호화 (Decryption)&lt;/strong>:&lt;/p>
&lt;ul>
&lt;li>수신자는 $v - \vec{s}^T\vec{u}$를 계산합니다.&lt;/li>
&lt;li>이 식을 수식으로 전개하면 다음과 같이 됩니다.
$v - \vec{s}^T\vec{u} = (\vec{t}^T\vec{r} + e_2 + \lfloor q/2 \rceil \cdot m) - \vec{s}^T(A^T\vec{r} + \vec{e_1})$&lt;/li>
&lt;li>여기서 $\vec{t} = A\vec{s} + \vec{e}$를 대입하면 주항인 $\vec{s}^TA^T\vec{r}$가 상쇄됩니다.&lt;/li>
&lt;li>남는 것은 $\lfloor q/2 \rceil \cdot m + (\vec{e}^T\vec{r} + e_2 - \vec{s}^T\vec{e_1})$이 됩니다.&lt;/li>
&lt;li>괄호 안의 항은 &amp;lsquo;작은 오차끼리의 곱이나 합&amp;rsquo;이므로 전체적으로도 충분히 작은 값(노이즈)에 머무릅니다. 따라서 각 계수가 $0$에 가까운지 $q/2$에 가까운지를 임계값 판정함으로써 원래 메시지 $m$의 비트(0 또는 1)를 완전히 오류 없이 복원할 수 있습니다.&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ol>
&lt;p>Kyber의 가장 큰 강점은 그 압도적인 &lt;strong>처리 속도&lt;/strong>와 &lt;strong>적절한 키 크기&lt;/strong>에 있습니다. Kyber768의 경우 공개키 크기는 1,184바이트, 암호문 크기는 1,088바이트이며, RSA-3072(키 크기 약 384바이트) 등과 비교하면 크지만 현대 인터넷 통신의 MTU(Maximum Transmission Unit) 내에 패킷 분할 없이 담는 것이 가능하여 네트워크 지연(Latency)에 거의 악영향을 주지 않습니다.&lt;/p>
&lt;hr>
&lt;h2 id="6-crystals-dilithium-ml-dsa-격자-기반-범용-디지털-서명">6. CRYSTALS-Dilithium (ML-DSA): 격자 기반 범용 디지털 서명
&lt;/h2>&lt;p>디지털 서명의 표준화에 있어서는, 같은 격자 암호 접근 방식 중에서도 다른 설계 사상을 가진 알고리즘들이 경쟁했습니다. 그중에서 범용적인 디지털 서명으로서 &lt;strong>FIPS 204 (ML-DSA)&lt;/strong> 로 선정된 것이 &lt;strong>CRYSTALS-Dilithium&lt;/strong>입니다.&lt;/p>
&lt;h3 id="61-fiat-shamir-with-aborts-패러다임">6.1. Fiat-Shamir with Aborts 패러다임
&lt;/h3>&lt;p>Dilithium은 Kyber와 마찬가지로 Module-LWE(및 Module-SIS 문제)에 기반한 디지털 서명 체계입니다. 설계의 기본 바탕에는 &amp;lsquo;&lt;strong>Fiat-Shamir with Aborts (중도 종료를 동반한 피아트-샤미르 변환)&lt;/strong>&amp;lsquo;라는 매우 중요한 패러다임이 사용되었습니다.&lt;/p>
&lt;p>피아트-샤미르 변환 자체는 대화형 영지식 증명 프로토콜을 비대화형 디지털 서명으로 변환하기 위한 표준적인 기법입니다. 증명자(서명자)가 약속(Commitment) $y$를 생성하고, $w = Ay$를 계산하여 해시 함수에 통과시킴으로써 임의의 챌린지(Challenge) $c$를 얻고 응답 $z = y + cs$를 계산합니다.&lt;/p>
&lt;p>하지만 격자 암호에서 이를 단순히 적용하면 응답 $z$의 분포가 비밀키 $s$의 값에 의존하여 왜곡되어 버리고, 다수의 서명을 관측한 공격자에게 비밀키 $s$의 정보가 조금씩 유출되어 버리는 치명적인 문제(부채널 방식의 수학적 유출)가 있었습니다.&lt;/p>
&lt;p>Dilithium의 설계팀(Lyubashevsky 등)은 서명의 계산 결과 $z$의 계수가 미리 설정된 안전한 임계값 범위 내에 들어가지 않을 경우 해당 서명 프로세스 전체를 파기(Abort)하고, 새로운 난수 $y$를 사용하여 처음부터 계산을 다시 하는 &amp;lsquo;&lt;strong>기각 샘플링(Rejection Sampling)&lt;/strong>&amp;lsquo;이라는 기법을 도입했습니다.&lt;/p>
&lt;p>이를 통해 최종적으로 출력되는 서명 $z$는 비밀키에 전혀 의존하지 않는 완전한 균등 분포가 되어, 정보 유출을 수학적으로 완전히 막는 데 성공했습니다.&lt;/p>
&lt;h3 id="62-dilithium의-이점과-구현의-용이성">6.2. Dilithium의 이점과 구현의 용이성
&lt;/h3>&lt;p>Dilithium 설계상의 큰 이점은 서명 생성 프로세스에서 복잡한 &amp;lsquo;가우스 분포로부터의 샘플링&amp;rsquo;이나 &amp;lsquo;부동소수점 연산&amp;rsquo;을 &lt;strong>전혀 사용하지 않는다&lt;/strong>는 점입니다. 균등 분포로부터의 샘플링과 단순한 정수 모듈로 연산, NTT 및 해시 함수(SHAKE)만으로 구현할 수 있기 때문에 임베디드 마이크로컨트롤러에서 클라우드 서버에 이르기까지 폭넓은 환경에서 안전하고 상수 시간(Constant-time)에 구현하기가 용이합니다. 이로 인해 타이밍 공격 등 물리적인 부채널 공격에 대해서도 강력한 내성을 가집니다.&lt;/p>
&lt;hr>
&lt;h2 id="7-falcon-fn-dsa-궁극적으로-콤팩트한-격자-서명">7. FALCON (FN-DSA): 궁극적으로 콤팩트한 격자 서명
&lt;/h2>&lt;p>NIST는 Dilithium과는 다른 특성을 가진 또 다른 격자 기반 서명으로서 &lt;strong>FALCON (Fast-Fourier Lattice-based Compact Signatures over NTRU)&lt;/strong> 을 표준화 후보로 선정했습니다(현재 FN-DSA로 초안 작성 중).&lt;/p>
&lt;h3 id="71-ntru-격자와-가우스-샘플링">7.1. NTRU 격자와 가우스 샘플링
&lt;/h3>&lt;p>FALCON의 가장 큰 특징은 LWE 문제가 아니라 1996년부터 존재하는 역사가 오래된 &lt;strong>NTRU (N-th degree Truncated polynomial Ring Units) 격자&lt;/strong>를 사용한다는 점입니다. 더 나아가 GPV (Gentry-Peikert-Vaikuntanathan) 프레임워크에 기반한 &amp;lsquo;&lt;strong>해시 앤 사인 (Hash-and-Sign)&lt;/strong>&amp;rsquo; 패러다임을 채택하고 있습니다.&lt;/p>
&lt;p>해시 앤 사인(Hash-and-Sign)에서는 메시지의 해시 값을 공간 내의 타깃 점으로 삼고, 그 점에 가장 가까운 격자 상의 점(최근접 벡터 문제의 근사해)을 찾는 것으로 서명을 합니다. 여기에는 비밀키인 &amp;lsquo;품질이 좋은 짧은 기저(Basis)&amp;lsquo;를 사용하여 이산 가우스 분포에 따라 점을 샘플링할 필요가 있습니다.&lt;/p>
&lt;p>FALCON은 이 무거운 계산을 &amp;lsquo;&lt;strong>고속 푸리에 직교화 (Fast Fourier Orthogonalization: FFO)&lt;/strong>&amp;lsquo;라는 기법을 사용하여 극적으로 고속화했습니다.&lt;/p>
&lt;h3 id="72-falcon의-장점과-단점">7.2. FALCON의 장점과 단점
&lt;/h3>&lt;p>FALCON의 압도적인 장점은 그 &lt;strong>서명 크기와 공개키 크기가 극히 작다(콤팩트하다)&lt;/strong> 는 것입니다. Dilithium3의 서명 크기가 약 3,309바이트인 것에 반해, FALCON-512의 서명 크기는 불과 약 666바이트입니다. 공개키 역시 897바이트로 매우 작아 통신 대역폭이 극단적으로 제한되는 환경이나 IoT 기기, 특정 네트워크 프로토콜에서는 구세주가 됩니다.&lt;/p>
&lt;p>그러나 중대한 단점이 존재합니다. 서명 생성 시에 복잡한 &lt;strong>부동소수점 연산(64-bit IEEE 754)&lt;/strong> 을 동반하는 이산 가우스 샘플링이 필수이기 때문에 타이밍 정보 유출을 방지하는 상수 시간 구현(Constant-time implementation)이 매우 어렵고 코드도 거대해집니다. 이 때문에 FALCON은 범용적인 이용(Dilithium)에 대비되는 특정 용도 지향의 강력한 특화형 알고리즘이라는 위치를 갖습니다.&lt;/p>
&lt;div class="mermaid">graph LR
A["디지털 서명의 요구사항"] --> B{"가장 우선시하는 제약은?"}
B -->|"구현의 단순함·범용성·상수 시간 구현의 용이성"| C["Dilithium (ML-DSA)"]
B -->|"통신 대역폭의 최소화·데이터 크기의 콤팩트함"| D["FALCON (FN-DSA)"]
C --> E["범용적인 TLS 인증서, 소프트웨어의 전자 서명"]
D --> F["패킷 크기 제한이 엄격한 프로토콜, 특수 환경"]&lt;/div>
&lt;hr>
&lt;h2 id="8-sphincs-slh-dsa-최강의-안전성을-자랑하는-해시-기반-서명">8. SPHINCS+ (SLH-DSA): 최강의 안전성을 자랑하는 해시 기반 서명
&lt;/h2>&lt;p>격자 암호의 안전성이 장래에 천재적인 수학자의 돌파구에 의해 무너진다는 최악의 시나리오(만약의 사태)에 대비하여, NIST는 격자 암호와는 전혀 다른 접근 방식을 가진 표준으로서 &lt;strong>FIPS 205 (SLH-DSA)&lt;/strong>, 즉 **SPHINCS+**를 책정했습니다.&lt;/p>
&lt;p>SPHINCS+는 &lt;strong>해시 기반 서명&lt;/strong>으로 분류됩니다. 그 안전성의 근거는 &amp;ldquo;사용하는 암호학적 해시 함수(SHA-2나 SHAKE256 등)가 충돌 저항성과 일방향성을 갖는다는 것&amp;quot;이라는 단 1점에만 의존하고 있습니다. LWE나 소인수분해와 같이 특정 대수 구조를 가진 수학적 문제에 의존하지 않기 때문에 장래에 어떤 강력한 양자 알고리즘이 등장하더라도 해시 함수의 출력 길이를 단순하게 늘리는 것만으로 대항할 수 있다는, 극히 확고한 안전성(가장 보수적인 보안)을 자랑합니다.&lt;/p>
&lt;h3 id="81-wots-와-fors에-의한-상태-비저장stateless-아키텍처">8.1. WOTS+ 와 FORS에 의한 상태 비저장(Stateless) 아키텍처
&lt;/h3>&lt;p>해시 기반 서명의 역사는 오래되어 1970년대의 램포트 서명(Lamport signature)이나 윈터니츠 일회용 서명(WOTS)으로 거슬러 올라갑니다. 이것들은 &amp;ldquo;단 1번만 안전하게 서명할 수 있다&amp;quot;는 일회용 키였습니다. 이를 여러 번 사용할 수 있도록 하기 위해 머클 트리(Merkle Tree)를 조합하여 무수한 일회용 키를 하나의 루트 해시로 관리하는 XMSS(eXtended Merkle Signature Scheme)나 LMS와 같은 알고리즘이 개발되었습니다.&lt;/p>
&lt;p>그러나 XMSS나 LMS에는 &amp;lsquo;&lt;strong>상태 저장형(Stateful)&lt;/strong>&amp;lsquo;이라는 중대한 결점이 있었습니다. 서명할 때마다 &amp;ldquo;몇 번째 일회용 키를 사용했는가&amp;quot;라는 인덱스 상태를 비휘발성 메모리에 엄밀하게 계속 기록해야 하며, 만약 가상 머신의 스냅샷 복원 등으로 상태가 되돌아가 동일한 일회용 키를 두 번 사용해 버리면 비밀키가 즉시 유출되어 시스템이 붕괴하고 맙니다.&lt;/p>
&lt;p>SPHINCS+는 이러한 상태 관리의 번거로움을 해결한 &amp;lsquo;&lt;strong>상태 비저장형(Stateless)&lt;/strong>&amp;rsquo; 해시 기반 서명입니다.
그 핵심 기술은 다음의 조합입니다.&lt;/p>
&lt;ol>
&lt;li>&lt;strong>WOTS+ (Winternitz One-Time Signature Plus)&lt;/strong>: 기본적인 일회용 서명.&lt;/li>
&lt;li>&lt;strong>FORS (Forest of Random Subsets)&lt;/strong>: 소수 회 서명(Few-Time Signature) 기술. 같은 키를 몇 번 정도는 재사용해도 안전성을 유지함.&lt;/li>
&lt;li>&lt;strong>Hyper-Tree (거대한 트리 구조)&lt;/strong>: 머클 트리를 다층적으로 겹겹이 쌓아 올린 거대한 구조.&lt;/li>
&lt;/ol>
&lt;p>SPHINCS+에서는 서명을 할 때 상태를 관리하는 대신, Hyper-Tree 밑바닥에 있는 방대한 수의 FORS 키 중에서 의사 난수를 사용하여 임의로 하나를 골라내어 서명합니다. 트리의 잎사귀 수가 천문학적으로 많기 때문에 같은 키를 우연히 두 번 고를 확률(충돌)이 무시할 수 있을 만큼 작아져 결과적으로 상태 비저장(Stateless)을 실현하고 있습니다.&lt;/p>
&lt;p>SPHINCS+의 유일하고도 가장 큰 약점은 &lt;strong>서명 크기가 극히 크다&lt;/strong>는 것입니다. 파라미터에 따라 다르지만 서명 크기는 17킬로바이트~49킬로바이트에 달하며, 서명 생성 속도도 격자 암호에 비해 압도적으로 느려집니다. 그 때문에 일상적인 웹 브라우징에서의 사용보다는 소프트웨어 업데이트 서명이나 루트 인증기관(CA)의 인증서 등 자주 서명을 하지 않으면서도 장기간의 절대적인 안전성이 강하게 요구되는 용도에서의 사용이 상정되어 있습니다.&lt;/p>
&lt;hr>
&lt;h2 id="9-코드-기반-암호-classic-mceliece라는-좋고-오래된-거인">9. 코드 기반 암호: Classic McEliece라는 좋고 오래된 거인
&lt;/h2>&lt;p>NIST 표준화 프로세스에서 Round 4의 최종 후보로서 현재도 계속 평가받고 있는 중요한 접근 방식이 &lt;strong>코드 기반 암호&lt;/strong>인 &lt;strong>Classic McEliece&lt;/strong>입니다.&lt;/p>
&lt;p>1978년 Robert McEliece가 제안한 이 알고리즘은 공개키 암호 역사 중에서도 RSA와 더불어 가장 오래된 것 중 하나입니다. &amp;lsquo;Goppa 코드(고파 부호)&amp;lsquo;라고 불리는 대수 기하 코드를 이용하여 메시지에 의도적으로 오류(노이즈 벡터)를 더해 암호화하고, 비밀키로서 Goppa 코드의 패리티 검사 행렬을 가진 자만이 강력한 오류 정정 능력을 사용해 오류를 제거하고 원래의 메시지를 복호화할 수 있다는 &amp;lsquo;&lt;strong>신드롬 복호화 문제 (Syndrome Decoding Problem)&lt;/strong>&amp;lsquo;에 기반하고 있습니다.&lt;/p>
$$ \vec{c} = \vec{m} G + \vec{e} $$
&lt;p>
($G$는 공개키인 스크램블된 생성 행렬, $\vec{e}$는 가중치 $t$의 오류 벡터)&lt;/p>
&lt;p>Classic McEliece의 놀라운 점은 &lt;strong>제안된 지 40년 이상 지났고 전 세계의 암호학자에 의한 치열한 해독 연구에 노출되어 왔음에도 불구하고, 그 본질적인 취약점이 한 번도 발견되지 않았다&lt;/strong>는 압도적인 실적에 있습니다. PQC 중에서 가장 &amp;lsquo;시간이 증명한 확고한 안전성&amp;rsquo;을 가지고 있습니다.&lt;/p>
&lt;p>게다가 암호문의 크기가 매우 작다(불과 100~200바이트 정도)는 이점이 있습니다. 하지만 &lt;strong>공개키 크기가 메가바이트(MB) 단위가 된다&lt;/strong>는 치명적인 결점이 존재합니다. 가장 낮은 보안 수준(AES-128 상당)에서도 공개키가 약 250KB, 높은 수준에서는 1MB를 넘습니다.&lt;/p>
&lt;p>이 때문에 TLS 핸드셰이크처럼 통신할 때마다 공개키를 네트워크 상에 전송하는 용도에는 전혀 적용할 수 없습니다. 하지만 VPN의 사전 공유 키 교환, 펌웨어에 공개키를 하드코딩하는 경우, 또는 위성 통신 등 공개키를 시스템에 사전에 배치할 수 있는 특수한 유스케이스에서는 그 확고한 안전성 덕분에 매우 유망한 선택지로 계속 검토되고 있습니다.&lt;/p>
&lt;hr>
&lt;h2 id="10-각-pqc-알고리즘의-성능-비교-및-트레이드오프">10. 각 PQC 알고리즘의 성능 비교 및 트레이드오프
&lt;/h2>&lt;p>지금까지 해설해 온 주요 알고리즘에 대해 일반적인 보안 수준(NIST Level 2&lt;del>3 상당, AES-128&lt;/del>192 레벨)에서의 성능 특성을 아래 표로 정리했습니다.&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th style="text-align:left">알고리즘 (표준명)&lt;/th>
&lt;th style="text-align:left">카테고리&lt;/th>
&lt;th style="text-align:left">수학적 기반&lt;/th>
&lt;th style="text-align:left">공개키 크기&lt;/th>
&lt;th style="text-align:left">비밀키 크기&lt;/th>
&lt;th style="text-align:left">암호문/서명 크기&lt;/th>
&lt;th style="text-align:left">처리 속도 경향&lt;/th>
&lt;th style="text-align:left">주요 특징 및 용도&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>Kyber768&lt;/strong>&lt;br>(ML-KEM)&lt;/td>
&lt;td style="text-align:left">KEM&lt;/td>
&lt;td style="text-align:left">Module-LWE&lt;/td>
&lt;td style="text-align:left">1,184 Bytes&lt;/td>
&lt;td style="text-align:left">2,400 Bytes&lt;/td>
&lt;td style="text-align:left">1,088 Bytes&lt;/td>
&lt;td style="text-align:left">매우 빠름&lt;/td>
&lt;td style="text-align:left">키 크기·속도의 밸런스가 최고. TLS 1.3 등 범용 KEM 표준.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>Dilithium3&lt;/strong>&lt;br>(ML-DSA)&lt;/td>
&lt;td style="text-align:left">서명&lt;/td>
&lt;td style="text-align:left">Module-LWE&lt;/td>
&lt;td style="text-align:left">1,952 Bytes&lt;/td>
&lt;td style="text-align:left">4,032 Bytes&lt;/td>
&lt;td style="text-align:left">3,309 Bytes&lt;/td>
&lt;td style="text-align:left">생성·검증 모두 빠름&lt;/td>
&lt;td style="text-align:left">구현이 단순. 범용적인 디지털 서명 표준.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>FALCON-512&lt;/strong>&lt;br>(FN-DSA)&lt;/td>
&lt;td style="text-align:left">서명&lt;/td>
&lt;td style="text-align:left">NTRU 격자&lt;/td>
&lt;td style="text-align:left">897 Bytes&lt;/td>
&lt;td style="text-align:left">1,281 Bytes&lt;/td>
&lt;td style="text-align:left">666 Bytes&lt;/td>
&lt;td style="text-align:left">서명 생성은 느린 편, 검증은 초고속&lt;/td>
&lt;td style="text-align:left">서명 크기가 극소. 단 부동소수점 연산이 필요. 임베디드·IoT용.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>SPHINCS+&lt;/strong>&lt;br>(SLH-DSA)&lt;/td>
&lt;td style="text-align:left">서명&lt;/td>
&lt;td style="text-align:left">해시 함수&lt;/td>
&lt;td style="text-align:left">32 Bytes&lt;/td>
&lt;td style="text-align:left">64 Bytes&lt;/td>
&lt;td style="text-align:left">약 17,000 Bytes&lt;/td>
&lt;td style="text-align:left">생성이 매우 느림&lt;/td>
&lt;td style="text-align:left">수학적 파탄 위험이 거의 제로. 루트 인증서 등 고보안 용도.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>Classic McEliece&lt;/strong>&lt;/td>
&lt;td style="text-align:left">KEM&lt;/td>
&lt;td style="text-align:left">Goppa 코드&lt;/td>
&lt;td style="text-align:left">&lt;strong>약 1.04 MB&lt;/strong>&lt;/td>
&lt;td style="text-align:left">13,568 Bytes&lt;/td>
&lt;td style="text-align:left">&lt;strong>188 Bytes&lt;/strong>&lt;/td>
&lt;td style="text-align:left">캡슐화는 빠름&lt;/td>
&lt;td style="text-align:left">40년의 안전성 실적. 공개키가 거대. 하드코딩 가능한 환경용.&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;h3 id="트레이드오프에-대한-이해">트레이드오프에 대한 이해
&lt;/h3>&lt;p>PQC의 세계에서는 &amp;ldquo;크기가 작고, 속도가 빠르며, 수학적 보장도 완벽한&amp;rdquo; 마법과 같은 단일 알고리즘은 존재하지 않습니다.&lt;/p>
&lt;ul>
&lt;li>&lt;strong>인터넷의 표준 (Kyber / Dilithium)&lt;/strong>: 성능 밸런스가 가장 좋으며, 현재의 RSA/ECC를 드롭인 리플레이스먼트(그대로 교체하는 것) 하기에 가장 적합합니다.&lt;/li>
&lt;li>&lt;strong>궁극의 보수성 (SPHINCS+)&lt;/strong>: 데이터 크기나 처리 속도를 희생해서라도 장래의 수학적 돌파구에 대한 절대적인 보험을 원할 경우에 선택됩니다.&lt;/li>
&lt;li>&lt;strong>특수 환경용 (FALCON / Classic McEliece)&lt;/strong>: 통신 대역폭이 극단적으로 좁거나 혹은 사전 배포가 가능한 등, 환경 제약에 맞춰 선택되는 특화형 무기입니다.&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h2 id="11-실용화를-향한-과제와-하이브리드-암호라는-현실적-해답">11. 실용화를 향한 과제와 &amp;lsquo;하이브리드 암호&amp;rsquo;라는 현실적 해답
&lt;/h2>&lt;p>NIST의 표준화가 완료되고 FIPS 규격이 정식으로 발행됨에 따라 전 세계 IT 인프라의 PQC 전환(&lt;strong>PQC 마이그레이션&lt;/strong>)이 본격적으로 시작되었습니다. Google의 Chrome 브라우저, Apple의 iMessage(PQ3 프로토콜), Cloudflare와 같은 네트워크 제공자들은 이미 프로토콜에 PQC 지원을 구현하여 실제 운용을 시작하고 있습니다.&lt;/p>
&lt;p>하지만 새로운 암호 알고리즘으로 갑자기 완전히 전환하는 데에는 매우 높은 위험이 따릅니다. 만약 Kyber와 같은 격자 암호에 대해 몇 년 뒤 어떤 천재 수학자가 치명적인 공격 기법(고전 컴퓨터로도 풀 수 있는 수학적 결함)을 발견할 경우, 그에 의존하고 있는 시스템 전체가 순식간에 발가벗겨지게 됩니다.&lt;/p>
&lt;p>이러한 불확실성 위험을 경감하기 위한 현실적이고 권장되는 접근 방식이 &amp;lsquo;&lt;strong>하이브리드 암호(Hybrid Cryptography)&lt;/strong>&amp;lsquo;입니다.&lt;/p>
&lt;p>하이브리드 암호에서는 다년간의 실적이 있는 현행 고전적 암호(예: X25519 등의 타원 곡선 암호)와 새로운 PQC(예: Kyber768)를 모두 동시에 사용하여 키 교환을 수행합니다. 각각의 알고리즘에서 개별적으로 대칭키 성분을 생성하고 마지막으로 안전한 키 도출 함수(KDF)를 이용하여 두 성분을 혼합해 최종적인 마스터 시크릿을 생성합니다.&lt;/p>
&lt;div class="mermaid">graph TD
A["클라이언트"] -->|① X25519의 공개키 + Kyber의 공개키 전송| B["서버"]
B -->|② X25519의 대칭키 + Kyber의 캡슐화 암호문 반환| A
A --> C{"마스터 시크릿 도출 (KDF)"}
B --> C
C -->|입력: (X25519의 대칭키) || (Kyber의 대칭키)| D["안전한 통신키 (AES-256 / ChaCha20)"]
D -->|"양자의 위협 &amp; 고전적인 취약성 양쪽에 내성"| E["안전한 하이브리드 암호 통신 (TLS 1.3)"]&lt;/div>
&lt;p>이를 통해 &amp;ldquo;만일 양자 컴퓨터가 실현되어 ECC가 깨지더라도 Kyber가 통신을 지키고&amp;rdquo;, 반대로 &amp;ldquo;만일 Kyber에 미지의 수학적 결함이 발견되더라도 ECC가 통신을 지킨다&amp;quot;는 견고한 이중 안전성을 실현할 수 있습니다. 대표적인 예로 IETF에서 표준화가 진행 중인 &lt;strong>X25519MLKEM768 (구 X25519Kyber768)&lt;/strong> 초안이 있으며, 현재 웹 브라우저와 최첨단 서버 간의 통신은 바로 이 하이브리드 방식을 이용하여 이루어지고 있습니다.&lt;/p>
&lt;p>또한 시스템 설계에 있어서 &amp;ldquo;특정 암호 알고리즘에 과도하게 의존하지 않고 알고리즘이 파탄 났을 때 신속하게 다른 알고리즘(예: Kyber에서 McEliece로, Dilithium에서 SPHINCS+로)으로 전환할 수 있는 아키텍처&amp;quot;를 구축하는 &lt;strong>Crypto Agility(암호 민첩성)&lt;/strong> 의 개념이 향후 시스템 개발에 있어 필수 요건이 됩니다.&lt;/p>
&lt;hr>
&lt;h2 id="12-맺음말-암호-기술의-새로운-지평선">12. 맺음말: 암호 기술의 새로운 지평선
&lt;/h2>&lt;p>양자 컴퓨터라는 인류의 꿈의 기술은 아이러니하게도 우리가 오랫동안 신뢰해 온 &amp;lsquo;소인수분해&amp;rsquo;나 &amp;lsquo;이산대수 문제&amp;rsquo;라는 수학적 방벽을 무너뜨리는 최대의 위협이 되었습니다. 그러나 전 세계의 암호학자들은 이에 굴하지 않고 격자 이론, 해시 함수 트리, 오류 정정 코드와 같은 보다 복잡하고 심오한 다차원 수학적 영역을 개척하여 양자 내성 암호(PQC)라는 새로운 방벽을 구축했습니다.&lt;/p>
&lt;p>NIST의 FIPS 203 (ML-KEM), FIPS 204 (ML-DSA), FIPS 205 (SLH-DSA) 표준화 완료는 끝이 아닙니다. 앞으로 수십 년간 이어질 PQC 마이그레이션이라는 장대한 여정의 첫걸음에 불과합니다. 소프트웨어 엔지니어나 시스템 아키텍트에게 있어서, 이 새로운 알고리즘들이 가져오는 &amp;lsquo;키 크기 증가&amp;rsquo;나 &amp;lsquo;계산 비용 변화&amp;rsquo;를 네트워크 프로토콜과 시스템에 어떻게 최적으로 적응시켜 나갈지가 앞으로의 큰 기술적 과제가 될 것입니다.&lt;/p>
&lt;p>양자 컴퓨터와 암호의 싸움은 인류의 수학적 탐구와 기술의 진화가 가장 치열하게 교차하는 흥미진진한 영역입니다. 본 기사를 통해 PQC의 배후에 있는 아름다운 수학 이론과 사이버 보안의 미래를 형성할 각 알고리즘의 놀라운 메커니즘에 대해 깊이 이해하셨기를 바랍니다.&lt;/p>
&lt;hr>
&lt;p>&lt;em>References:&lt;/em>&lt;/p>
&lt;ul>
&lt;li>&lt;em>NIST Post-Quantum Cryptography Standardization Program&lt;/em>&lt;/li>
&lt;li>&lt;em>FIPS 203: Module-Lattice-Based Key-Encapsulation Mechanism Standard&lt;/em>&lt;/li>
&lt;li>&lt;em>FIPS 204: Module-Lattice-Based Digital Signature Standard&lt;/em>&lt;/li>
&lt;li>&lt;em>FIPS 205: Stateless Hash-Based Digital Signature Standard&lt;/em>&lt;/li>
&lt;/ul></description></item><item><title>양자 컴퓨터가 실용화되는 날: 2026년의 현재 위치</title><link>http://kenji.blog/ko/p/quantum-computing-2026-current-status/</link><pubDate>Fri, 11 Sep 2026 06:00:00 +0900</pubDate><guid>http://kenji.blog/ko/p/quantum-computing-2026-current-status/</guid><description>&lt;img src="http://kenji.blog/p/quantum-computing-2026-current-status/img/eyecatch.jpg" alt="Featured image of post 양자 컴퓨터가 실용화되는 날: 2026년의 현재 위치" />&lt;h2 id="1-시작하며-2026년-양자-컴퓨터는-어디까지-왔는가">1. 시작하며: 2026년, 양자 컴퓨터는 어디까지 왔는가
&lt;/h2>&lt;p>2026년 현재, 양자 컴퓨팅은 과거의 &amp;lsquo;이론상의 꿈&amp;rsquo;에서 &amp;lsquo;공학적인 현실&amp;rsquo;로 결정적인 전환을 이루었습니다. 수년 전까지 주류였던 &lt;strong>NISQ(Noisy Intermediate-Scale Quantum)&lt;/strong> 디바이스의 한계가 명확해짐에 따라, 전 세계의 연구 기관과 거대 기술 기업들은 &amp;lsquo;오류 내성 양자 컴퓨팅(FTQC: Fault-Tolerant Quantum Computing)&amp;lsquo;의 실현으로 방향을 틀었습니다.&lt;/p>
&lt;p>이 글에서는 2026년의 최신 돌파구를 교차하며, 양자 컴퓨터의 현재 위치를 깊이 파고듭니다. 특히, 양자 오류 정정(표면 부호), 물리 큐비트와 논리 큐비트의 차이, 위상 양자 컴퓨팅의 진전, 그리고 초전도·이온 트랩 방식의 최전선에 대해 자세히 설명합니다.&lt;/p>
&lt;hr>
&lt;h2 id="2-양자-상태의-기초와-피델리티충실도">2. 양자 상태의 기초와 피델리티(충실도)
&lt;/h2>&lt;p>양자 컴퓨터의 기본 단위인 양자 비트(Qubit)는 고전적인 비트(0 또는 1)와는 달리, 0과 1의 중첩 상태(Superposition)를 취할 수 있습니다. 단일 큐비트의 상태는 힐베르트 공간 상의 벡터로서 다음과 같이 표현됩니다.&lt;/p>
$$
|\psi\rangle = \alpha|0\rangle + \beta|1\rangle
$$
&lt;p>여기서 $\alpha$와 $\beta$는 복소수인 확률 진폭이며, 다음의 정규화 조건을 만족합니다.&lt;/p>
$$
|\alpha|^2 + |\beta|^2 = 1
$$
&lt;p>양자 컴퓨팅의 성능을 측정하는 데 있어 매우 중요한 지표가 **피델리티(Fidelity)**입니다. 이상적인 양자 상태 $|\psi\rangle$와 노이즈에 의해 열화되어 혼합 상태가 된 실제 밀도 행렬 $\rho$ 간의 피델리티 $F$는 다음과 같이 정의됩니다.&lt;/p>
$$
F(\rho, |\psi\rangle) = \langle \psi | \rho | \psi \rangle
$$
&lt;p>2026년 현재, 2큐비트 게이트(예: CNOT 게이트나 CZ 게이트)의 피델리티는 초전도 방식에서 **99.99%**의 장벽(이른바 &amp;lsquo;4나인&amp;rsquo;)을 안정적으로 넘어서게 되었습니다. 이는 표면 부호에 의한 오류 정정 임계값(약 99%)을 크게 웃도는 수치이며, 상용화를 향한 가장 큰 돌파구 중 하나입니다.&lt;/p>
&lt;hr>
&lt;h2 id="3-nisq-시대의-한계와-ftqc로의-패러다임-전환">3. NISQ 시대의 한계와 FTQC로의 패러다임 전환
&lt;/h2>&lt;p>2010년대 후반부터 2020년대 전반에 걸쳐서는 오류 정정을 가지지 않는 수십~수백 큐비트의 디바이스인 NISQ(Noisy Intermediate-Scale Quantum)의 시대였습니다. 하지만, NISQ에는 명확한 한계가 있었습니다.&lt;/p>
&lt;p>회로의 깊이(Depth)가 증가함에 따라 오류가 지수 함수적으로 축적되어, 의미 있는 계산 결과를 얻는 것이 불가능해집니다. 회로의 깊이 $D$에서의 전체 성공 확률 $P_{success}$는 단일 게이트의 피델리티 $f$와 게이트 수 $N$에 대해 다음과 같이 감쇠합니다.&lt;/p>
$$
P_{success} \approx f^N
$$
&lt;p>만약 $f = 0.99$에서 1000개의 게이트를 적용한 경우, $0.99^{1000} \approx 4.3 \times 10^{-5}$가 되어 결과는 거의 랜덤 노이즈에 묻혀버리게 됩니다. 이로 인해 2026년에는 NISQ 알고리즘(VQE나 QAOA 등)의 직접적인 스케일업보다는 **논리 큐비트(Logical Qubit)**의 생성에 자원이 집중되고 있습니다.&lt;/p>
&lt;hr>
&lt;h2 id="4-양자-오류-정정과-논리-큐비트-표면-부호의-최전선">4. 양자 오류 정정과 논리 큐비트: 표면 부호의 최전선
&lt;/h2>&lt;p>양자 오류 정정(QEC: Quantum Error Correction)은 여러 &amp;lsquo;물리 큐비트&amp;rsquo;를 인코딩하여 하나의 &amp;lsquo;논리 큐비트&amp;rsquo;를 만들어내어, 오류를 감지하고 정정하는 기술입니다. 현재 가장 유망하게 여겨지는 것이 **표면 부호(Surface Code)**입니다.&lt;/p>
&lt;h3 id="41-표면-부호surface-code의-구조">4.1 표면 부호(Surface Code)의 구조
&lt;/h3>&lt;p>표면 부호에서는 큐비트를 2차원 격자 형태로 배치합니다. 데이터 큐비트(실제 정보를 유지)와 측정 큐비트(신드롬 측정용)가 체크무늬처럼 늘어섭니다.&lt;/p>
&lt;div class="mermaid">graph TD
A["데이터 큐비트 (D1)"] --- B["측정 큐비트 (M1)"]
B --- C["데이터 큐비트 (D2)"]
C --- D["측정 큐비트 (M2)"]
D --- E["데이터 큐비트 (D3)"]
B --- F["데이터 큐비트 (D4)"]
D --- G["데이터 큐비트 (D5)"]
style A fill:#e1f5fe,stroke:#039be5
style C fill:#e1f5fe,stroke:#039be5
style E fill:#e1f5fe,stroke:#039be5
style F fill:#e1f5fe,stroke:#039be5
style G fill:#e1f5fe,stroke:#039be5
style B fill:#fff3e0,stroke:#fb8c00
style D fill:#fff3e0,stroke:#fb8c00&lt;/div>
&lt;p>안정자(Stabilizer) 연산자 $S_x$와 $S_z$를 사용하여, 비트 반전(X 오류)과 위상 반전(Z 오류)을 끊임없이 감시합니다.&lt;/p>
$$
S_x = \prod_{i \in \text{star}} X_i, \quad S_z = \prod_{j \in \text{plaquette}} Z_j
$$
&lt;p>2026년의 중대한 진전은 &amp;lsquo;손익분기점(Break-even point)&amp;lsquo;을 완전히 돌파했다는 것입니다. 즉, 오류 정정을 수행하기 위한 여분의 회로가 일으키는 노이즈보다 오류 정정에 의해 제거되는 노이즈가 더 커지게 되어, 논리 큐비트의 수명이 물리 큐비트의 수명을 몇 자릿수나 웃돌게 되었습니다.&lt;/p>
&lt;h3 id="42-양자-오류-정정의-사이클">4.2 양자 오류 정정의 사이클
&lt;/h3>&lt;p>오류 정정은 지속적인 피드백 루프로 기능합니다.&lt;/p>
&lt;div class="mermaid">sequenceDiagram
participant D as "데이터 큐비트"
participant M as "보조/측정 큐비트"
participant C as "고전 컨트롤러"
loop "신드롬 추출 사이클 (약 1 마이크로초)"
D->>M: "얽힘 (CNOT/CZ)"
M->>C: "상태 측정 (신드롬)"
C->>C: "신드롬 디코딩 (예: 최소 가중치 완벽 매칭)"
C-->>D: "파울리 정정 적용 (필요시)"
end&lt;/div>
&lt;p>현재는 이러한 고전적인 디코딩 처리(신드롬 해석)를 FPGA나 전용 ASIC에서 나노초 단위로 실행하는 기술이 확립되어, 실시간 오류 정정이 실용화 단계에 접어들었습니다.&lt;/p>
&lt;hr>
&lt;h2 id="5-하드웨어-아키텍처의-진화-2026년판">5. 하드웨어 아키텍처의 진화 (2026년판)
&lt;/h2>&lt;p>2026년의 양자 하드웨어는 주로 &amp;lsquo;초전도 방식&amp;rsquo;, &amp;lsquo;이온 트랩 방식&amp;rsquo;, &amp;lsquo;위상(Topological) 방식&amp;rsquo;의 세 가지 축으로 진화하고 있습니다.&lt;/p>
&lt;h3 id="51-초전도-큐비트의-집적화">5.1 초전도 큐비트의 집적화
&lt;/h3>&lt;p>초전도 방식은 IBM이나 Google이 이끌고 있는 분야이며, 조셉슨 접합을 이용한 트랜즈몬(Transmon) 큐비트가 주류입니다. 2026년에는 단일 칩 상에 수천에서 일만 개의 물리 큐비트를 집적하는 메가 칩이 실현되었습니다.&lt;/p>
&lt;p>특기할 만한 점은 **모듈 간 양자 통신(Quantum Interconnects)**의 확립입니다. 마이크로파 광자를 이용한 칩 간의 양자 원격 이동(Quantum Teleportation)이 상용 수준에서 구현되어, 단일 희석 냉동기의 크기 제한을 우회할 수 있게 되었습니다.&lt;/p>
&lt;h3 id="52-이온-트랩의-2차원-스케일링과-광-인터커넥트">5.2 이온 트랩의 2차원 스케일링과 광 인터커넥트
&lt;/h3>&lt;p>이온 트랩 방식(Quantinuum이나 IonQ 등이 주도)에서는 진공 중에 부유하는 이온의 내부 에너지 상태를 큐비트로 사용합니다. 초전도 방식과 비교하여 T1/T2 결맞음(Coherence) 시간이 극히 길고, 전결합(All-to-All Connectivity)이 가능하다는 장점이 있습니다.&lt;/p>
&lt;p>2026년의 돌파구는 QCCD(Quantum Charge Coupled Device) 아키텍처의 2차원화와 광 인터커넥트(Photonic Interconnect)를 이용한 다중 트랩 간의 고속 얽힘 생성입니다. 이로 인해 이온 트랩의 약점이었던 &amp;lsquo;느린 게이트 속도&amp;rsquo;와 &amp;lsquo;확장성&amp;rsquo;이 극적으로 개선되었습니다.&lt;/p>
&lt;h3 id="53-위상-양자-컴퓨팅-애니온의-제어">5.3 위상 양자 컴퓨팅: 애니온의 제어
&lt;/h3>&lt;p>오랫동안 이론상의 존재로 여겨져 왔던 &lt;strong>위상 양자 컴퓨팅&lt;/strong>이 2026년에 마침내 실험적인 실증 단계에 들어섰습니다. Microsoft 등이 추진하는 이 방식은 &amp;lsquo;마요라나 제로 모드(Majorana Zero Modes)&amp;lsquo;라고 불리는 비가환 애니온(Non-Abelian Anyons)을 사용합니다.&lt;/p>
&lt;p>애니온 입자의 위치를 맞바꾸는 &amp;lsquo;브레이딩(Braiding, 땋기)&amp;lsquo;이라는 조작을 통해 양자 게이트를 실행합니다.&lt;/p>
$$
|\psi_{final}\rangle = B_{ij} |\psi_{initial}\rangle
$$
&lt;p>여기서 $B_{ij}$는 브레이딩 연산자입니다. 위상 방식은 정보의 저장이 입자의 국소적인 상태가 아니라 전체의 &amp;lsquo;매듭&amp;rsquo; 위상(Topology)에 의존하기 때문에, 환경 노이즈에 대해 본질적으로 내성(하드웨어 수준에서의 오류 내성)을 가지고 있습니다. 2026년에 세계 최초로 고충실도의 위상 논리 큐비트 생성이 확인되어, FTQC를 향한 강력한 지름길로 주목받고 있습니다.&lt;/p>
&lt;hr>
&lt;h2 id="6-실용화를-향한-로드맵과-전망">6. 실용화를 향한 로드맵과 전망
&lt;/h2>&lt;p>양자 컴퓨터가 &amp;lsquo;화학 계산&amp;rsquo;, &amp;lsquo;재료 과학&amp;rsquo;, &amp;lsquo;금융 모델링&amp;rsquo; 등에서 고전 컴퓨터(슈퍼 컴퓨터)를 압도하는 **양자 우위(Quantum Advantage)**를 진정으로 발휘하기 위해서는 수천 개의 논리 큐비트가 필요합니다.&lt;/p>
&lt;div class="mermaid">gantt
title "양자 컴퓨팅 로드맵 (2026년 개정)"
dateFormat YYYY
axisFormat %Y
section "NISQ 시대"
"노이즈 큐비트 (&lt;1000)" :done, 2018, 2024
section "초기 FTQC"
"손익분기점 실증" :done, 2024, 2026
"수백 개의 논리 큐비트" :active, 2026, 2028
section "본격적인 FTQC"
"1000개 이상의 논리 큐비트 (상용 앱)" : 2028, 2030
"범용 오류 내성 양자 컴퓨터" : 2030, 2035&lt;/div>
&lt;h3 id="61-현재-직면한-과제와-미래">6.1 현재 직면한 과제와 미래
&lt;/h3>&lt;p>2026년 시점에서의 최대 과제는 극저온을 유지하기 위한 거대한 크라이오스탯(희석 냉동기)의 냉각 능력과, 실온의 제어 장치와 극저온의 양자 칩을 연결하는 배선(I/O 병목 현상)입니다. 이에 대응하여 극저온 환경에서 동작하는 CMOS(Cryo-CMOS) 컨트롤러 칩의 개발이 빠른 속도로 진행되고 있습니다.&lt;/p>
&lt;h3 id="결론">결론
&lt;/h3>&lt;p>2026년은 양자 컴퓨터의 역사에 있어 &amp;lsquo;논리 큐비트 스케일업 원년&amp;rsquo;으로 기록될 것입니다. 오류 정정 알고리즘의 실증, 하드웨어의 모듈화, 그리고 위상 접근법의 급진전에 의해 &amp;lsquo;실용화되는 날&amp;rsquo;은 더 이상 먼 미래의 이야기가 아니라, 향후 몇 년 이내의 구체적인 이정표로 내다볼 수 있게 되었습니다. 양자 알고리즘 개발자나 기업들에게 있어, 지금이야말로 양자 네이티브한 문제 해결에 본격적으로 투자해야 할 적기라고 할 수 있습니다.&lt;/p>
&lt;hr>
&lt;p>&lt;em>이 글은 2026년 시점의 최신 양자 컴퓨팅 연구 논문 및 업계 동향을 바탕으로 작성되었습니다.&lt;/em>&lt;/p></description></item></channel></rss>