콘텐츠로 이동

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)을 추가하라. 어떤 결과가 관측되는가?