Qiskit 실습: Hello World - Qiskit Patterns
이 노트북에서는 Qiskit Patterns 워크플로를 따라가며, Qiskit의 Sampler 프리미티브를 사용합니다.
이 튜토리얼은 IBM Quantum Documentation: Hello World의 내용을 일부 포함합니다.
유용한 링크:
- IBM Quantum Platform에 접근하려면 IBM Cloud 계정을 생성하세요.
- 대학 이메일을 보유한 분: 무료 체험 기간 연장을 위한 기능 코드를 여기서 받으세요.
- 대학 이메일이 없는 분: 계정 활성화 안내. 신용카드를 등록하여 계정을 완전히 활성화하세요. 이 과정에서 신용카드에 요금이 청구되거나 등록 후 임의로 청구되지 않습니다. 활성화를 통해 체험 기간(30일) 이후에도 IBM Cloud 및 IBM Quantum 플랫폼의 무료 리소스를 계속 이용할 수 있습니다.
- 코딩 환경 설정을 위해 클라우드 기반 플랫폼을 사용합니다. QBraid 또는 Google Colab을 이용할 수 있습니다.
- 이 노트북 이후에는 양자 텔레포테이션 프로토콜을 살펴볼 예정입니다.
추가 링크 - Qiskit 커뮤니티 및 추가 학습 자료:
- Grok sphere
- IBM Quantum Composer
- IBM Quantum Learning
- Qiskit Global Summer School 2025 강의
- Qiskit v2.X 자격증
- Qiskit 어드보케이트 프로그램
- 양자 여름 인턴십
- Qiskit YouTube
Qiskit 설치
온라인 jupyter lab 환경(가이드 온라인 랩 환경 참조)을 사용하거나 Qiskit을 로컬에 설치할 수 있습니다.
Qiskit 설치 가이드 Qiskit SDK 및 Qiskit Runtime 클라이언트 설치를 따라 다음 단계를 완료하세요:
-
추가 시각화 패키지를 포함하여 Qiskit 설치:
pip install qiskit[visualization] -
qiskit-ibm-runtime 설치:
pip install qiskit-ibm-runtime -
jupyter 설치:
pip install jupyter환경에서 사용 중인 Python 버전이 최신 Qiskit 버전과 호환되도록 python>=3.10인지 확인하세요:
# Added by doQumentation — required packages for this notebook
!pip install -q IPython
from platform import python_version
print(python_version())
3.13.7
Python 업그레이드가 필요하고 방법을 모른다면, OS에 따라 Python을 업그레이드하는 방법에 대한 이 가이드를 참조하세요: Python 업데이트 방법
%pip install qiskit[visualization]
%pip install qiskit-ibm-runtime
%pip install
%pip install qiskit-aer
zsh:1: no matches found: qiskit[visualization]
Note: you may need to restart the kernel to use updated packages.
Requirement already satisfied: qiskit-ibm-runtime in /Users/astricornish/miniforge3/envs/um-qiskit/lib/python3.13/site-packages (0.43.0)
Requirement already satisfied: requests>=2.19 in /Users/astricornish/miniforge3/envs/um-qiskit/lib/python3.13/site-packages (from qiskit-ibm-runtime) (2.32.5)
Requirement already satisfied: requests-ntlm>=1.1.0 in /Users/astricornish/miniforge3/envs/um-qiskit/lib/python3.13/site-packages (from qiskit-ibm-runtime) (1.3.0)
Requirement already satisfied: numpy>=1.13 in /Users/astricornish/miniforge3/envs/um-qiskit/lib/python3.13/site-packages (from qiskit-ibm-runtime) (2.3.3)
Requirement already satisfied: urllib3>=1.21.1 in /Users/astricornish/miniforge3/envs/um-qiskit/lib/python3.13/site-packages (from qiskit-ibm-runtime) (2.5.0)
Requirement already satisfied: python-dateutil>=2.8.0 in /Users/astricornish/miniforge3/envs/um-qiskit/lib/python3.13/site-packages (from qiskit-ibm-runtime) (2.9.0.post0)
Requirement already satisfied: ibm-platform-services>=0.22.6 in /Users/astricornish/miniforge3/envs/um-qiskit/lib/python3.13/site-packages (from qiskit-ibm-runtime) (0.69.0)
Requirement already satisfied: pydantic>=2.5.0 in /Users/astricornish/miniforge3/envs/um-qiskit/lib/python3.13/site-packages (from qiskit-ibm-runtime) (2.12.2)
Requirement already satisfied: qiskit>=1.4.1 in /Users/astricornish/miniforge3/envs/um-qiskit/lib/python3.13/site-packages (from qiskit-ibm-runtime) (2.2.1)
Requirement already satisfied: packaging in /Users/astricornish/miniforge3/envs/um-qiskit/lib/python3.13/site-packages (from qiskit-ibm-runtime) (25.0)
Requirement already satisfied: ibm_cloud_sdk_core<4.0.0,>=3.24.2 in /Users/astricornish/miniforge3/envs/um-qiskit/lib/python3.13/site-packages (from ibm-platform-services>=0.22.6->qiskit-ibm-runtime) (3.24.2)
Requirement already satisfied: PyJWT<3.0.0,>=2.10.1 in /Users/astricornish/miniforge3/envs/um-qiskit/lib/python3.13/site-packages (from ibm_cloud_sdk_core<4.0.0,>=3.24.2->ibm-platform-services>=0.22.6->qiskit-ibm-runtime) (2.10.1)
Requirement already satisfied: six>=1.5 in /Users/astricornish/miniforge3/envs/um-qiskit/lib/python3.13/site-packages (from python-dateutil>=2.8.0->qiskit-ibm-runtime) (1.17.0)
Requirement already satisfied: charset_normalizer<4,>=2 in /Users/astricornish/miniforge3/envs/um-qiskit/lib/python3.13/site-packages (from requests>=2.19->qiskit-ibm-runtime) (3.4.4)
Requirement already satisfied: idna<4,>=2.5 in /Users/astricornish/miniforge3/envs/um-qiskit/lib/python3.13/site-packages (from requests>=2.19->qiskit-ibm-runtime) (3.11)
Requirement already satisfied: certifi>=2017.4.17 in /Users/astricornish/miniforge3/envs/um-qiskit/lib/python3.13/site-packages (from requests>=2.19->qiskit-ibm-runtime) (2025.10.5)
Requirement already satisfied: annotated-types>=0.6.0 in /Users/astricornish/miniforge3/envs/um-qiskit/lib/python3.13/site-packages (from pydantic>=2.5.0->qiskit-ibm-runtime) (0.7.0)
Requirement already satisfied: pydantic-core==2.41.4 in /Users/astricornish/miniforge3/envs/um-qiskit/lib/python3.13/site-packages (from pydantic>=2.5.0->qiskit-ibm-runtime) (2.41.4)
Requirement already satisfied: typing-extensions>=4.14.1 in /Users/astricornish/miniforge3/envs/um-qiskit/lib/python3.13/site-packages (from pydantic>=2.5.0->qiskit-ibm-runtime) (4.15.0)
Requirement already satisfied: typing-inspection>=0.4.2 in /Users/astricornish/miniforge3/envs/um-qiskit/lib/python3.13/site-packages (from pydantic>=2.5.0->qiskit-ibm-runtime) (0.4.2)
Requirement already satisfied: rustworkx>=0.15.0 in /Users/astricornish/miniforge3/envs/um-qiskit/lib/python3.13/site-packages (from qiskit>=1.4.1->qiskit-ibm-runtime) (0.17.1)
Requirement already satisfied: scipy>=1.5 in /Users/astricornish/miniforge3/envs/um-qiskit/lib/python3.13/site-packages (from qiskit>=1.4.1->qiskit-ibm-runtime) (1.16.2)
Requirement already satisfied: dill>=0.3 in /Users/astricornish/miniforge3/envs/um-qiskit/lib/python3.13/site-packages (from qiskit>=1.4.1->qiskit-ibm-runtime) (0.4.0)
Requirement already satisfied: stevedore>=3.0.0 in /Users/astricornish/miniforge3/envs/um-qiskit/lib/python3.13/site-packages (from qiskit>=1.4.1->qiskit-ibm-runtime) (5.5.0)
Requirement already satisfied: cryptography>=1.3 in /Users/astricornish/miniforge3/envs/um-qiskit/lib/python3.13/site-packages (from requests-ntlm>=1.1.0->qiskit-ibm-runtime) (46.0.2)
Requirement already satisfied: pyspnego>=0.4.0 in /Users/astricornish/miniforge3/envs/um-qiskit/lib/python3.13/site-packages (from requests-ntlm>=1.1.0->qiskit-ibm-runtime) (0.12.0)
Requirement already satisfied: cffi>=2.0.0 in /Users/astricornish/miniforge3/envs/um-qiskit/lib/python3.13/site-packages (from cryptography>=1.3->requests-ntlm>=1.1.0->qiskit-ibm-runtime) (2.0.0)
Requirement already satisfied: pycparser in /Users/astricornish/miniforge3/envs/um-qiskit/lib/python3.13/site-packages (from cffi>=2.0.0->cryptography>=1.3->requests-ntlm>=1.1.0->qiskit-ibm-runtime) (2.23)
Note: you may need to restart the kernel to use updated packages.
[31mERROR: You must give at least one requirement to install (see "pip help install")[0m[31m
[0mNote: you may need to restart the kernel to use updated packages.
Requirement already satisfied: qiskit-aer in /Users/astricornish/miniforge3/envs/um-qiskit/lib/python3.13/site-packages (0.17.2)
Requirement already satisfied: qiskit>=1.1.0 in /Users/astricornish/miniforge3/envs/um-qiskit/lib/python3.13/site-packages (from qiskit-aer) (2.2.1)
Requirement already satisfied: numpy>=1.16.3 in /Users/astricornish/miniforge3/envs/um-qiskit/lib/python3.13/site-packages (from qiskit-aer) (2.3.3)
Requirement already satisfied: scipy>=1.0 in /Users/astricornish/miniforge3/envs/um-qiskit/lib/python3.13/site-packages (from qiskit-aer) (1.16.2)
Requirement already satisfied: psutil>=5 in /Users/astricornish/miniforge3/envs/um-qiskit/lib/python3.13/site-packages (from qiskit-aer) (7.1.0)
Requirement already satisfied: python-dateutil>=2.8.0 in /Users/astricornish/miniforge3/envs/um-qiskit/lib/python3.13/site-packages (from qiskit-aer) (2.9.0.post0)
Requirement already satisfied: six>=1.5 in /Users/astricornish/miniforge3/envs/um-qiskit/lib/python3.13/site-packages (from python-dateutil>=2.8.0->qiskit-aer) (1.17.0)
Requirement already satisfied: rustworkx>=0.15.0 in /Users/astricornish/miniforge3/envs/um-qiskit/lib/python3.13/site-packages (from qiskit>=1.1.0->qiskit-aer) (0.17.1)
Requirement already satisfied: dill>=0.3 in /Users/astricornish/miniforge3/envs/um-qiskit/lib/python3.13/site-packages (from qiskit>=1.1.0->qiskit-aer) (0.4.0)
Requirement already satisfied: stevedore>=3.0.0 in /Users/astricornish/miniforge3/envs/um-qiskit/lib/python3.13/site-packages (from qiskit>=1.1.0->qiskit-aer) (5.5.0)
Requirement already satisfied: typing-extensions in /Users/astricornish/miniforge3/envs/um-qiskit/lib/python3.13/site-packages (from qiskit>=1.1.0->qiskit-aer) (4.15.0)
Note: you may need to restart the kernel to use updated packages.
필요한 임포트 작성
이 튜토리얼에 필요한 임포트를 작성합니다.
from qiskit import QuantumCircuit, QuantumRegister, ClassicalRegister
import qiskit_ibm_runtime
from qiskit.transpiler.preset_passmanagers import generate_preset_pass_manager
from qiskit_ibm_runtime import SamplerV2 as Sampler
from qiskit.quantum_info import SparsePauliOp
from qiskit.quantum_info import Statevector
from qiskit.visualization import plot_bloch_multivector, plot_state_qsphere
from IPython.display import display, Latex
IBM Quantum Platform 계정 설정
실제 하드웨어에서 양자 Circuit을 실행하려면 IBM Cloud 계정이 필요합니다.
이 가이드 IBM Cloud 계정 설정의 지침에 따라 다음 단계를 완료하세요:
- IBM Cloud 계정이 없는 경우 계정을 설정합니다.
- IBMid로 IBM Quantum Platform 계정에 로그인하거나 새로 만드세요.
- IBM Quantum Platform 대시보드에 접속하여 API 토큰을 생성하고 안전한 곳에 복사해 두세요. (아래 첫 번째 참조 이미지를 확인하세요.)
- 참조 이미지 다음에 오는 코드 셀에서
deleteThisAndPasteYourAPIKeyHere를 본인의 API 키로 교체하세요. - ☰ 메인 메뉴에서 Instances 페이지로 이동하여 인스턴스를 생성합니다. 네트워크 기관에 속하지 않은 경우 오픈 플랜을 선택하세요. (아래 두 번째 참조 이미지를 확인하세요.)
- 인스턴스가 생성되면 해당 CRN 코드를 복사하세요. (CRN은 _Cloud Resource Names_의 약자입니다) 인스턴스가 보이지 않으면 새로고침이 필요할 수 있습니다.
- 참조 이미지 다음에 오는 코드 셀에서
deleteThisAndPasteYourCRNHere를 본인의 CRN 코드로 교체하세요.
참고: API 키는 보안 비밀번호처럼 취급하세요. 안전한 환경과 신뢰할 수 없는 환경 모두에서 API 키를 사용하는 방법에 대한 자세한 내용은 IBM Cloud 계정 설정 가이드를 참조하세요.
#@title personals
your_api_key = "YOUR_API_KEY"
your_crn = "YOUR_CRN"
from qiskit_ibm_runtime import QiskitRuntimeService
# Save your API key to access real devices
your_api_key = your_api_key
your_crn = your_crn
QiskitRuntimeService.save_account(
channel="ibm_cloud",
token=your_api_key,
instance=your_crn,
set_as_default=True,
overwrite=True,
)
Qiskit 패턴 프레임워크를 사용하여 간단한 양자 알고리즘 생성 및 실행
Qiskit 패턴 개념 프레임워크는 양자 알고리즘의 구조라고 할 수 있습니다.
Qiskit 패턴을 사용하여 양자 프로그램을 작성하는 네 가지 단계는 다음과 같습니다:
-
문제를 양자 네이티브 형식으로 매핑합니다.
-
Circuit과 연산자를 최적화합니다.
-
Qiskit 기본 함수(primitive function)를 사용하여 실행합니다.
-
결과를 분석합니다.
Step 1. 문제를 양자 네이티브 형식으로 매핑하기
양자 프로그램에서 양자 Circuit은 양자 명령을 표현하는 네이티브 형식이며, 연산자는 측정할 관측 가능량을 나타냅니다. Circuit을 생성할 때는 일반적으로 새로운 QuantumCircuit 객체를 만든 후 순서대로 명령을 추가합니다.
데모: Qiskit에서 기본 양자 Circuit 구성하기
Qiskit으로 간단한 Circuit을 구성해 보겠습니다.
# Simple quantum circuit with two qubits and two classical bits
# Create quantum circuit with 2 qubits and 2 classical bits
qc = QuantumCircuit(2)
# Add gates to your circuit
qc.x(0)
qc.s(1)
# Draw the output using MatPlotLib
qc.draw(output='mpl')
# Quantum circuit with a Quantum Register named 'qr' that has two qubits, and a Classical Register named 'cr' with two classical bits
# Create a quantum register with 2 qubits, register label is 'qr'
qreg = QuantumRegister(2)
# Create a classical register with 2 qubits, register label is 'cr'
creg = ClassicalRegister(2)
# Create a quantum circuit with registers qreg and creg
qc = QuantumCircuit(qreg, creg)
# Add gates to your registers
qc.x(qreg[0])
# Draw the quantum circuit
qc.draw(output='mpl')
연습: Qiskit에서 기본 양자 Circuit 구성하기
Bell 상태 에 대한 Circuit을 만드세요.
# Create a new circuit with two qubits
qc = QuantumCircuit(2)
# Add a Hadamard gate to qubit 0
qc.h(0)
# Perform a controlled-X gate on qubit 1, controlled by qubit 0
qc.cx(0,1)
# Return a drawing of the circuit using MatPlotLib ("mpl").
qc.draw('mpl')
양자 Circuit의 초기 상태는 상태입니다.
최종 상태는 다음과 같습니다:
# Use Statevector to fetch the statevector of the circuit
sv = Statevector(qc)
sv.draw(output='latex')
Qiskit의 비트 번호 지정에 관한 참고 사항
Qiskit은 문자열에서 비트를 오른쪽에서 왼 쪽으로 번호를 매깁니다. Qiskit SDK는 LSb 0 비트 번호 지정 방식을 사용합니다. 개의 비트(또는 Qubit)를 문자열로 표시하거나 해석할 때, 비트 이 가장 왼쪽 비트이고 비트 이 가장 오른쪽 비트입니다. 이는 일반적으로 숫자를 가장 중요한 자리 수를 왼쪽에 두고 표기하며, Qiskit에서 비트 이 최상위 비트로 해석되기 때문입니다. 자세한 내용은 Qiskit SDK의 비트 순서 항목을 참조하세요.
#LSB ordering example
qc2 = QuantumCircuit(2)
qc2.x(1)
qc2.draw("mpl")
sv2 = Statevector(qc2)
sv2.draw(output='latex')
측정 Gate가 필요한가요?
양자 Circuit을 만들 때, 실행 후 반환될 데이터의 유형도 고려해야 합니다. Qiskit은 데이터를 반환하는 두 가지 방법을 제공합니다: 관측 가능량의 기댓값을 얻거나, 측정하고자 하는 Qubit 집합에 대한 확률 분포를 얻을 수 있습니다. Qiskit 기본 함수(primitives)를 사용하여 이 두 가지 방법 중 하나로 Circuit을 측정하도록 워크로드를 준비하세요.
Samplerprimitive - 측정하도록 선택한 Qubit 집합에 대한 확률 분포를 반환합니다. 예시:
Estimatorprimitive - 관측 가능량의 기댓값을 반환합니다. 예시:
오늘은 Sampler를 사용할 예정이므로, Circuit에 측정 Gate를 추가해야 합니다.
# Use measure_all, which adds a barrier, applies measurement gates on all qubits, creates a classical register called `meas`
qc.measure_all()
qc.draw('mpl')
Step 2. 대상 하드웨어에 맞게 Circuit 최적화하기
장치에서 Circuit을 실행할 때, Circuit에 포함된 명령 집합을 최적화하고 Circuit의 전체 깊이(대략 명령의 수)를 최소화하는 것이 중요합니다. 이를 통해 오류와 노이즈의 영향을 줄여 최선의 결과를 얻을 수 있습니다. 또한 Circuit의 명령은 Backend 장치의 명령 집합 아키텍처(ISA)를 따라야 하며 장치의 기본 Gate 및 Qubit 연결성을 고려해야 합니다.
다음 코드는 작업을 제출할 시뮬레이터를 인스턴스화하고 해당 Backend의 ISA에 맞게 Circuit과 관측 가능량을 변환합니다. 실제 장치는 나중에 사용할 것입니다.
# option:
from qiskit_ibm_runtime.fake_provider import FakeTorino
backend = FakeTorino()
print(
f"Name: {backend.name}\n"
f"Version: {backend.version}\n"
f"Native gate set: {backend.operation_names}\n"
)
#to view other properties you can use properties()
# refer to https://docs.quantum.ibm.com/guides/get-qpu-information
Name: fake_torino
Version: 2
Native gate set: ['for_loop', 'delay', 'cz', 'id', 'sx', 'measure', 'reset', 'switch_case', 'if_else', 'rz', 'x']
# Convert to an ISA circuit
pm = generate_preset_pass_manager(backend=backend, optimization_level=3)
isa_circuit_sampler = pm.run(qc)
isa_circuit_sampler.draw("mpl", idle_wires=False)

Step 3. Qiskit 기본 함수(primitives)를 사용하여 실행하기
양자 컴퓨터는 무작위 결과를 생성할 수 있으므로, 일반적으로 Circuit을 여러 번 실행하여 출력 샘플을 수집합니다. Estimator 클래스를 사용하여 관측 가능량의 기댓값을 추정할 수 있습니다. Sampler는 양자 컴퓨터로부터 데이터를 얻는 데 사용할 수 있습니다. 이 객체들은 PUB(primitive unified bloc)를 사용하여 선택한 Circuit, 관측 가능량 및 매개변수(해당하는 경우)를 실행하는 run() 메서드를 가지고 있습니다.
# Create a sampler instance using the selected backend
sampler = Sampler(backend)
# Run the sampler primitive on ISA circuit for specified number of shots (1024)
job_sampler = sampler.run([isa_circuit_sampler], shots=1024)
# Save the result of the job
result_sampler = job_sampler.result()
Step 4. 결과 후처리하기
이 단계에서는 결과를 후처리합니다. 추가 분석을 위해 이 결과를 다른 워크플로우에 전달하거나 주요 값과 데이터를 시각화할 수 있습니다. 일반적으로 이 단계는 문제에 따라 다릅니다.
Sampler의 경우, 지정한 shots 수만큼 양자 Circuit을 샘플링하여 얻은 확률 분포를plot_histogram으로 시각화합니다.
from qiskit.visualization import plot_histogram
counts = result_sampler[0].data.meas.get_counts()
# Note: meas is the default name of the classical register when using measure_all().
# If you specify a classical register, then use the name you assign
# Plot the result
plot_histogram(counts)

실제 장치에서 프로그램 실행하기
실제 장치에서 이 코드를 실행하려면 다음 코드 를 사용할 수 있습니다.
from qiskit_ibm_runtime import QiskitRuntimeService
# View the list of backends you have access to
service = QiskitRuntimeService()
service.backends()
management.get:WARNING:2025-11-03 14:24:36,838: Loading default saved account
[<IBMBackend('ibm_fez')>,
<IBMBackend('ibm_brisbane')>,
<IBMBackend('ibm_torino')>,
<IBMBackend('ibm_marrakesh')>]
# Get backend
backend_real = service.least_busy(simulator=False, operational=True)
#backend_real = service.backend(name="insert_backend_name") # use this if you want to choose a specific backend
sampler = Sampler(backend_real)
pm = generate_preset_pass_manager(backend=backend_real, optimization_level=3)
isa_circuit = pm.run(qc)
job = sampler.run([isa_circuit], shots=1024)
print(job.job_id)
<bound method BasePrimitiveJob.job_id of <RuntimeJobV2('d444lcg7i53s73e4n6tg', 'sampler')>>
result = job.result()
print(
f"Name: {backend_real.name}\n"
f"Version: {backend_real.version}\n"
f"Native gate set: {backend_real.operation_names}\n"
)
Name: ibm_fez
Version: 2
Native gate set: ['delay', 'cz', 'id', 'sx', 'measure', 'reset', 'if_else', 'rz', 'x']
counts = result[0].data.meas.get_counts()
plot_histogram(counts)

완료된 작업에서 결과 가져오기
아래 셀은 완료된 작업에서 결과를 가져오는 방법을 보여줍니다.
service = QiskitRuntimeService()
retrieved_job = service.job('d40mquhsg33c73dhhs00')
result = retrieved_job.result()
counts = result[0].data.meas.get_counts()
plot_histogram(counts)
management.get:WARNING:2025-11-03 14:24:55,135: Loading default saved account
