양자컴퓨팅 알고리듬

Grover Algorithm 3큐비트 8개의 양자 상태 |000>에서 |111> 까지 예제

coding art 2026. 2. 3. 20:06
728x90

2개의 큐비트로 구성된 Transmon 에서 보았듯이 3개의 큐비트 시스템에서는 |000>, |001>, |010>,...|111> 처럼 8개중 3개로 구성된 질릴 정도의 텐서 곱 연산이 필요하므로 Transmon 에서의 알고리듬을 곱씹어 보되 정 필요하면 Gemini 에게 특정 명령 전후 큐비트 상태를 물어 모니터링 할 것을 추천한다.

 

Colab에서 Gemini가 짜준 아래의 코드를 실행해 보자. 8개의 객체 중 |111>을 검색하자. 코드 구조가 2 큐비트 시스템과 유사하므로 한번만 부호를 반전시켜 확률 진폭을 계산해 보면. 1024 회 실행 횟수에서 |111> 의 확률 값이 가장 높다는 것을 알 수 있다.

 

!pip install qiskit

!pip install qiskit-aer matplotlib

!pip install pylatexenc # histogram plot

 

from qiskit import QuantumCircuit

from qiskit_aer import Aer

from qiskit.visualization import plot_histogram

import numpy as np

# 3-큐비트 회로 생성

qc = QuantumCircuit(3)

# [단계 1] 초기 중첩 생성

qc.h([0, 1, 2])

qc.barrier()

# [단계 2] 오라클 (정답: |111>)

# 모든 큐비트가 1일 때 부호만 뒤집음 (MCZ 구현)

qc.h(2)

qc.mcx([0, 1], 2) # 0, 1번이 1일 때 2번을 반전(H와 함께 작용하여 Z효과)

qc.h(2)

qc.barrier()

# [단계 3] 확산 연산자 (Diffusion Operator)

qc.h([0, 1, 2])

qc.x([0, 1, 2])

# 3-큐비트용 MCZ (0, 1번이 1일 때 2번 위상 반전)

qc.h(2)

qc.mcx([0, 1], 2)

qc.h(2)

qc.x([0, 1, 2])

qc.h([0, 1, 2])

qc.barrier()

# 모든 큐비트 측정

qc.measure_all()

# 시뮬레이터 실행

backend = Aer.get_backend('qasm_simulator')

# 3개 큐비트에서는 1~2회 반복이 적당하지만, 여기서는 1회만 수행

result = backend.run(qc, shots=1024).result()

counts = result.get_counts()

print("측정 결과:", counts)

 

 

 

결과에서 확률 진폭 값을 관찰해 보면 |111> 이 80% 이며 나머지는 3.5% 이하로 축소되었음을 알 수 있다.

 

3-큐비트 구현의 주요 차이점을 살펴 보자.

 

MCZ 게이트 구현: Qiskit에는 mcz가 기본 게이트로 없을 때가 많아, qc.h(2) -> qc.mcx([0, 1], 2) -> qc.h(2) 조합을 사용한다. 이는 Z 게이트가 $H-X-H$와 같다는 원리를 이용해 Multi-Controlled XMulti-Controlled Z로 변환한 것이다.

 

반복 횟수 (Iterations): 2-큐비트에서는 1번만 돌려도 100% 정답이 나오지만, 3-큐비트(8개 항)에서는 수학적으로 약 2회 반복할 때 확률이 가장 극대화된다. 위 코드는 1회만 실행하므로 정답 확률이 약 80% 정도로 나온다.

 

오라클 범용성: 만약 정답이 |101|이라면, 0인 자리인 1번 큐비트 앞뒤에 qc.x(1)를 추가하여 |111|인 것처럼 속여서 계산하면 된다.

 

이 코드를 수정하여 2회 실행하려면 아래 부분을 추가로 셀에 넣어 실행하면 된다. 1회 실행에서 ac.measure_all() 에 의한 측정 이하 코드를 # 로 밀어 버린 후 맨 마지막에 넣어 주도록 한다.

 

 

가시적인 결과를 보도록 하자. 95.5%로 확률 진폭 값이 증가 되었으며 나머지는 모두 1.0& 이하로 진폭이 축소되었음을 알 수 있다.

 

첨부된 코드를 다운로드 받아 NDRIVE 에 업로드하여 실행해 보도록 하자.

grover3q111.ipynb
0.05MB