Lab 2. 단일 큐비트 게이트와 CNOT
실습 실행: Colab 노트북 링크를 추가한다.
학습 목표
- X, Z, H 게이트를 행렬로 이해한다
- H-Z-H 회로로 위상이 간섭을 통해 측정 결과에 드러나는 과정을 확인한다
- CNOT으로 두 큐비트를 얽어 Bell 상태를 만든다
핵심 개념
단일 큐비트 게이트
\[
X = \begin{pmatrix} 0 & 1 \\ 1 & 0 \end{pmatrix}, \quad
Z = \begin{pmatrix} 1 & 0 \\ 0 & -1 \end{pmatrix}, \quad
H = \frac{1}{\sqrt{2}}\begin{pmatrix} 1 & 1 \\ 1 & -1 \end{pmatrix}
\]
| 게이트 | 역할 | 예 |
|---|---|---|
| X | 비트 반전 | \(\vert 0\rangle \rightarrow \vert 1\rangle\) |
| Z | 위상 반전 | \(\vert 1\rangle \rightarrow -\vert 1\rangle\) |
| H | 중첩 생성 | \(\vert 0\rangle \rightarrow \vert +\rangle\) |
CNOT
제어 큐비트가 1일 때만 타깃 큐비트를 반전한다. H와 함께 쓰면 Bell 상태를 만든다.
\[
|\Phi^+\rangle = \frac{1}{\sqrt{2}}(|00\rangle + |11\rangle)
\]
환경 설정
import numpy as np
from qiskit import QuantumCircuit
from qiskit.quantum_info import Statevector
from qiskit.primitives import StatevectorSampler
위상과 간섭: H-H 대 H-Z-H
Z 게이트만으로는 측정 확률이 변하지 않는다. 그러나 앞뒤에 H를 두면 위상 차이가 간섭을 통해 측정 결과로 드러난다.
qc_hh = QuantumCircuit(1)
qc_hh.h(0)
qc_hh.h(0)
qc_hzh = QuantumCircuit(1)
qc_hzh.h(0)
qc_hzh.z(0)
qc_hzh.h(0)
print("H-H :", np.round(Statevector.from_instruction(qc_hh).probabilities(), 3)) # [1. 0.]
print("H-Z-H:", np.round(Statevector.from_instruction(qc_hzh).probabilities(), 3)) # [0. 1.]
해석
H-H는 \(|0\rangle\)으로 돌아오고, H-Z-H는 \(|1\rangle\)이 된다. 두 회로의 차이는 Z가 만든 위상 하나뿐이다. 중간 상태 \(|+\rangle\)과 \(|-\rangle\)은 측정 확률이 같지만, 두 번째 H에서 보강 간섭과 상쇄 간섭이 반대로 일어난다. 실제로 \(HZH = X\)이다.
Bell 상태
bell = QuantumCircuit(2)
bell.h(0)
bell.cx(0, 1)
bell.measure_all()
counts = StatevectorSampler().run([bell], shots=1000).result()[0].data.meas.get_counts()
print(counts) # 예: {'00': 503, '11': 497}
00과 11만 관측되고, 01과 10은 나오지 않는다. 개별 큐비트는 50:50으로 무작위이지만, 두 큐비트는 항상 같은 값을 가진다.
과제 1: 행렬 검증
NumPy로 \(H Z H\)를 직접 계산하여 \(X\)와 같은지 확인하라.
H = np.array([[1, 1], [1, -1]]) / np.sqrt(2)
Z = np.array([[1, 0], [0, -1]])
print(np.round(H @ Z @ H, 3))
과제 2: 다른 Bell 상태
Bell 회로의 CNOT 앞에 bell.x(1)을 추가하라. 어떤 결과가 관측되는가?