
2024년까지 머신러닝 코드 실행 시까지 구글 Colab 의 편집 기능에 변함이 없었으나, 최근 클라우드 상에서 양자 컴퓨팅 Qiskit 실습을 위해 Colab을 열어 본 결과 좀 더 편리하게 편집 기능이 바뀌어 있었다. 적응에 30분 정도 걸렸다. Bell State 코드를 실행시켜 보지 전에 반드시 큐비트 초기화 및 양자 상태 측정을 위한 큐비트 붕괴에 의한 초기값 조사 코드를 읽어보고 실행시켜 보자.
자! 본론으로 들어가자!
여기 저기서 양자 컴퓨터 코딩에 관해 기웃거렸는데 하나같이 제대로 작동하는 사례나 머리가 확 뚫리는 설명이 없었다. 지금 가장 많이 사용하는 플랫폼이 바로 IBM 이 제공하는 Qiskit 인데 한 5년 되어 버전이 1.x에서 2.x 로 넘어가 다소 혼란이 있는 듯하다. 그러한 혼란을 피하기 위해 여기서는 Qiskit 2.x 버전으로만 다루기로 한다.
인공지능 Gemini 에게 묻는다.
Prompt: 양자컴퓨터 코딩에서 가장 간단한 예제는 어떤 것인가요?
Gemini 는 질문에 대해서 다음과 같이 Bell State 예제라고 답하였다.
양자컴퓨터 코딩을 처음 접할 때 가장 대표적이고 간단한 예제는 '벨 상태(Bell State)' 생성이다. 클래식 컴퓨터의 "Hello World"가 화면에 글자를 출력하는 것이라면, 양자컴퓨터의 "Hello World"는 단순한 글자 출력이 아닌 2개의 핵심 기능인 중첩(Superposition)과 얽힘(Entanglement)이라는 양자 역학적 특성을 보여주는 사례이다. 코드 구조 자체는 대다히 간단하지만 지금까지 블로그 목차 순서대로 읽어 왔다면 중첩뿐만 아니라 얽힘 개념을 제대로 이해하고 있는지 생각해 봐야 할 시점이다. 아인슈타인 박사 조차도 자신의 실험실 그룹에서 발견해낸 얽힘이란 개념에 관해서 과연 자신의 상대론에서 주장했던 빛의 속도보다 빠른 정보전달이 가능한가 되뇌였던 주제이다.
벨 상태(Bell State) 예제란?
중첩 상태의 큐비트(Qubit) 두 개가 서로 긴밀히 연결되어 있어, 한쪽의 상태가 결정되면 다른 쪽의 상태도 즉시 결정되도록 만드는 얽힘을 보여주는 코드로서 이는 양자역학의 2대 원리인 중첩과 얽힘 현상을 보여주는 코드이다.
초전도체 물리학에서 Transmon을 병렬로 연결할 경우 |0> 과 |1> 2개로 이루어진 큐비트를 AND 개념을 적용하여 |00>, |01>, |10> 및 |11>의 4개로 구성되는 벨 상태 양자상태들을 다룰 수 있게 된다. 특히 (c)에서처럼 SRLC(Shunted RLC)형태의 회로로 구성할 경우 특정한 마이크파 웨이브의 주파수들에 대해 공진 가능하도록 조작하여 벨 상태에서 에너지 간격이 불균등한 4 에너지 레벨 중첩 상태로 만들 수 있을 것이다.

중첩이란 서로 독립적인 확률적 이벤트 에를 들면 0 과 1 혹은 물리학적으로 양자 파동함수의 고유 에너지 상태에 해당하는 벡터 |0> 과 |1> 이 애매하게 양자역학적으로 섞여 있는 상태를 의미한다.
∙큐비트 준비: |0> 상태인 두 개의 큐비트를 준비한다.
∙중첩 시키기 (H 게이트): 첫 번째 큐비트에 '아다마르(Hadamard) 게이트'를 적용해 0 과 1이 반반 섞인 중첩상태로 만든다. 즉 양자 논리게이트 (quantum logic gate) 회로에서 적절한 주파수의 마이크로파 펄스를 사용하여 중첩 상태를 생성한다.

∙얽힘 만들기 (CNOT 게이트): 'CNOT 게이트'를 사용해 첫 번째 큐비트의 상태에 따라 두 번째 큐비트의 상태가 변하도록 연결한다. CNOT 양지 논리 게이트는 첫번째 큐비트가 |0> 양자상태이면 두번째 큐비트에 아무런 영향도 미치지 않지만 첫번째 큐비트가 |1> 양자상태이면 두번째 큐비트 상태가 |0>↔|1> 와 같이 반전된다.
!pip install qiskit # 2025년 12월 Xmas 현재 버전이 2.x 이다.
# 과거 버전에 집착할 필요가 없다.
import qiskit # qiskit 라이브러리를 부른다.
qiskit.version.get_version_info() # 라이브러리 버전을 확인한다.

!pip install pylatexenc # "양자 회로를 고해상도로 그리기 위한 통역사" 역할
# LATEX로 표현된 양자 게이트를 파이선 환경의 그래픽으로 변환
from qiskit import QuantumCircuit
#StatevectorSampler는 컴퓨터 내 시뮬레이터로서 결과를 측정하는 가장 표준적인 방법임
from qiskit.primitives import StatevectorSampler
qc = QuantumCircuit(2, 2) # Bell state 회로 구성
# 큐비트 2개, 측정 후 저장용 일반 메모리 2개
qc.h(0) # ‘0’ 또는 |0> 양자 상태를 Hadamar 변환을 적용하여 중첩 상태를 만든다.
qc.cx(0, 1) # 두 큐비트를 CNOT 게이트를 사용하여 얽어맨다.
# 0 번은 control 용이며 1번은 target 이다.
qc.measure_all() # 양자 중첩 얽힘 상태의 [0,1] 큐비트를 붕괴시켜 측정하여
# 측정 후 레지스터에 해당하는 메모리 [0,1] 2개에 저장
qc.draw() # 회로 작도, Default 가 qc.draw(‘mpl“) 즉 matplotlib 이다.

# 양자 컴퓨터 하드웨어를 직접 사용하지 않고 내 컴퓨터내에서 양자회로를 1024 번 처리하여 결과를 통계 처리한다.
sampler = StatevectorSampler()
job = sampler.run([qc], shots=1024)
result = job.result()[0]
counts = result.data.meas.get_counts()
print(f"측정 결과: {counts}")
측정 결과: {'00': 522, '11': 502}
from qiskit.visualization import plot_histogram
plot_histogram(counts)

처음 해보면 코드는 실행이 되는데 뜻을 모를 것이다. 뜻을 알려면 양자 컴퓨팅 물리학과 양자 컴퓨팅 알고리듬 분야의 공부가 필요하지 않나 싶다.
코드 실행 해본 후 의문점이 있으면 댓글에 남기셔도 무방합니다. 정답 제공은 어려울 수도 있으나 함께 고민하는 기회가 될 수도 있을 것입니다.
첨부: Bellstate.ipynb
'Python' 카테고리의 다른 글
| 파이선 코딩 초보자를 위한 Colab 양자 컴퓨팅: 큐비트 초기화 (0) | 2025.12.24 |
|---|---|
| 파이선 코딩 초보자를 위한 Colab 양자 컴퓨팅: 큐비트 초기값 조사 (0) | 2025.12.24 |
| 쌍극좌표계 작도 (0) | 2025.03.18 |
| 리눅스 폴더 구조와 구글 마운팅 (0) | 2022.08.15 |
| Jupyter Notebook Tutorial: 파이선 코딩 응용실습 (0) | 2022.07.26 |