본문 바로가기

Quantum Computing

Qiskit을 이용한 양자 컴퓨팅 예제 (5) - 이진 연산자: CNOT, CZ 게이트

반응형

이번 포스팅에서는 CNOT 게이트 (Controlled-NOT Gate)와 CZ 게이트 (Controlled-Z Gate)에 대해 알아보겠습니다.
 

CNOT 게이트

CNOT 게이트는 두 개의 큐비트 상태에 대해 적용되는 연산자입니다. 첫번째 큐비트는 제어 큐비트(Control qubit), 두 번째 큐비트는 타겟 큐비트(Target qubit)로 정의됩니다. 이에 대해 CNOT 게이트는 제어 큐비트의 상태에 따라 타겟 큐비트에 연산을 수행할지 여부를 결정합니다.  

  • 제어 큐비트가 $|0\rangle$ 상태일 경우, 타겟 큐비트에는 아무런 연산도 적용되지 않습니다.
  • 제어 큐비트가 $|1\rangle$ 상태일 경우, 타겟 큐비트에는 NOT 연산자(즉, X 게이트)를 적용하여 상태를 반전시킵니다.

이러한 CNOT 게이트는 행렬로 아래와 같이 표현이 가능합니다:
\begin{eqnarray} {\rm CNOT} = \begin{pmatrix} 1 & 0 & 0 & 0 \\ 0 & 1 & 0 & 0 \\ 0 & 0 & 0 & 1 \\ 0 & 0 & 1 & 0 \end{pmatrix}\end{eqnarray}
 
예시: 가령 $|10\rangle$ 상태에 CNOT 게이트를 적용해 보겠습니다:
\begin{eqnarray} {\rm CNOT} | 1 0 \rangle = \begin{pmatrix} 1 & 0 & 0 & 0 \\ 0 & 1 & 0 & 0 \\ 0 & 0 & 0 & 1 \\ 0 & 0 & 1 & 0 \end{pmatrix} \begin{pmatrix} 0 \\ 0 \\ 1 \\ 0 \end{pmatrix} = \begin{pmatrix} 0 \\ 0 \\ 0 \\ 1\end{pmatrix} = | 1 1 \rangle. \end{eqnarray}
 
즉, 이 결과에서 제어 큐비트가 $|1\rangle$이므로, 타겟 큐비트인 두번째 큐비트는 $|0\rangle$에서 $|1\rangle$ 상태로 바뀌었습니다. 
 
정리하자면, 두 개 큐비트가 가질 수 있는 4가지 상태들에 대해서 CNOT 게이트는 아래와 같이 결과를 줍니다:
\begin{eqnarray} |00 \rangle \rightarrow | 0 0 \rangle, \ \ \  |0 1 \rangle \rightarrow | 0  1 \rangle, \ \ \ | 1 0 \rangle \rightarrow | 1 1 \rangle, \ \ \ | 1 1 \rangle \rightarrow |1 0 \rangle \end{eqnarray}
 

Qiskit 예제

Qiskit을 이용해 CNOT 게이트를 구현해 보겠습니다. 우선 아래의 명령어를 통해, 두 개의 양자 큐비트를 생성하겠습니다:

qc = QuantumCircuit(2)

 
이렇게 생성된 양자 상태는 $|0 0 \rangle$일 것입니다. CNOT 연산자 예제를 위해, 0번째 큐비트에 X 연산자를 적용해 $|1\rangle$ 상태로 변경하겠습니다:

qc.x(0)

 
이렇게 하면, 위에서 준비한 상태는 $| 1 0 \rangle$이 될 것이고, 여기에 CNOT 게이트를 적용하면, $|1 1 \rangle$ 상태가 되어야 함을 예상할 수 있습니다. 준비한 큐비트에 CNOT 게이트를 적용해 보겠습니다:

qc.cx(0, 1)

 
이 명령어는 0번 큐비트를 제어 큐비트로, 1번 큐비트를 타겟 큐비트로 하여 CNOT 게이트를 적용하겠다는 뜻입니다. (만약 qc.cx(1, 0)을 적용하면, 1번 큐비트($|0\rangle$)를 제어 큐비트로, 0번 큐비트($|1\rangle$)를 타겟 큐비트로 정의한다는 뜻이기 때문에, 아무런 변화가 일어나지 않습니다.)
 
출력된 결과를 시각화하면 아래와 같이 $|11 \rangle$ 상태가 된 것을 확인할 수 있습니다:

$❘01\rangle$ 상태에 CNOT 게이트를 적용하여 $❘11 \rangle$ 상태를 만들어낸 결과.

위에서 예제에 대한 양자 회로도는 아래와 같습니다:

CNOT 게이트가 포함된 양자 회로도.

 
시각화가 포함된 전체 코드는 아래와 같습니다:

from qiskit import QuantumCircuit, transpile
from qiskit.visualization import plot_bloch_multivector, plot_histogram
from qiskit_aer import AerSimulator
import matplotlib.pyplot as plt

# 1. 양자 회로 생성
qc = QuantumCircuit(2)  # 2개의 큐비트 생성

# 2. 0번째 큐비트에 Pauli-X 게이트 적용
qc.x(0)

# 3. SWAP 연산자 적용: 
qc.swap(0,1)

# 상태 벡터 저장
qc.save_statevector()

# 시뮬레이터 초기화
simulator = AerSimulator()

# 회로 컴파일 및 실행
compiled_circuit = transpile(qc, simulator)
result = simulator.run(compiled_circuit).result()

# 상태 벡터 확인
statevector = result.get_statevector()
print("Statevector:", statevector)

# 상태 시각화
bloch_sphere = plot_bloch_multivector(statevector)  # Matplotlib 객체 반환
bloch_sphere.savefig("bloch_sphere.png", dpi=300)  # PNG로 저장

# Matplotlib 스타일로 회로 플롯
fig = qc.draw(output="mpl")  # Matplotlib 객체 반환
fig.savefig("quantum_circuit.png", dpi=300)  # PNG로 저장

 
 

CZ 게이트

CNOT 게이트를 이해했다면, CZ (Controlled Z) 게이트 역시 쉽게 이해할 수 있습니다. 

  • 제어 큐비트가 $|0\rangle$ 상태일 경우, 타겟 큐비트에는 아무런 연산도 적용되지 않습니다.
  • 제어 큐비트가 |$1\rangle$ 상태일 경우, 타겟 큐비트에는 Z 게이트를 적용하여 위상을 변화시킵니다. 

즉, CNOT 게이트가 제어 큐비트를 통해 타겟 큐비트의 상태를 반전시키는 역할을 한다면, CZ 게이트는 제어 큐비트를 통해 타겟 큐비트의 위상을 변화시키는 역할을 합니다. 
 
Qiskti에서의 명령어는 "cz"라는 명령어로 CZ 게이트를 적용할 수 있습니다. 위에 예제에 대해서, 0번 큐비트를 제어 큐비트로, 1번 큐비트를 타겟 큐비트로 하는 CZ 게이트의 명령어는 아래와 같습니다.

qc.cz(0,1)

 
이에 대한 회로도는 아래와 같습니다. (위에 예제에서 CNOT 게이트를 CZ 게이트로 교체한 그림입니다.)

CZ 게이트가 적용된 양자 회로도의 모습.

 

반응형