주 콘텐츠로 건너뛰기
이 프로젝트는 베타 단계입니다. 버그를 발견하셨나요? GitHub 이슈 만들기. 질문이나 아이디어가 있으신가요? Discussions에서 질문하기 — 피드백을 기다립니다!
이 페이지의 번역 품질은 어떻습니까?

Qiskit 실습: Hello World - Qiskit Patterns

이 노트북에서는 Qiskit Patterns 워크플로우를 따라가며 Qiskit의 Sampler 프리미티브를 사용해요.

이 튜토리얼은 IBM Quantum Documentation: Hello World의 내용을 일부 포함합니다.

유용한 링크:

  1. IBM Quantum Platform에 접근하려면 IBM Cloud 계정을 생성하세요.
    • 대학 이메일을 보유한 분: 무료 체험 기간 연장을 위한 feature code를 여기서 받으세요.
    • 대학 이메일이 없는 분: 계정 활성화 안내. 신용카드를 등록하여 계정을 완전히 활성화하세요. 이 과정에서 신용카드에 요금이 청구되지 않으며, 등록 후 임의로 청구되지도 않아요. 활성화를 통해 체험 기간(30일) 이후에도 IBM Cloud 및 IBM Quantum 플랫폼의 무료 리소스를 계속 이용할 수 있어요.
  2. 코딩 환경 설정을 위해 클라우드 기반 플랫폼을 사용해요. QBraid 또는 Google Colab을 이용할 수 있어요.
  3. 이 노트북 이후에는 양자 텔레포테이션 프로토콜을 살펴볼 예정이에요.

추가 링크 - Qiskit 커뮤니티 및 추가 학습 자료:

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 — installs the packages this notebook needs if they are missing
import importlib.util

_needed = {"IPython": "IPython"}
_missing = [pip for module, pip in _needed.items()
if importlib.util.find_spec(module) is None]
# One at a time, so a package that fails to install does not block the others
for _pip in _missing:
%pip install -q {_pip}
if not _missing:
print("\u2713 All required packages are installed")
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.
ERROR: You must give at least one requirement to install (see "pip help install")
Note: 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 계정 설정의 지침에 따라 다음 단계를 완료하세요:

  1. IBM Cloud 계정이 없는 경우 계정을 설정합니다.

  2. IBMid로 IBM Quantum Platform 계정에 로그인하거나 새로 만드세요.

  3. IBM Quantum Platform 대시보드에 접속하여 API 토큰을 생성하고 안전한 곳에 복사해 두세요. (아래 첫 번째 참조 이미지를 확인하세요.)

  4. 참조 이미지 다음에 오는 코드 셀에서 deleteThisAndPasteYourAPIKeyHere를 본인의 API 키로 교체하세요.

  5. ☰ 메인 메뉴에서 Instances 페이지로 이동하여 인스턴스를 생성합니다. 네트워크 기관에 속하지 않은 경우 오픈 플랜을 선택하세요. (아래 두 번째 참조 이미지를 확인하세요.)

  6. 인스턴스가 생성되면 해당 CRN 코드를 복사하세요. (CRN은 _Cloud Resource Names_의 약자입니다) 인스턴스가 보이지 않으면 새로고침이 필요할 수 있습니다.

  7. 참조 이미지 다음에 오는 코드 셀에서 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 패턴을 사용하여 양자 프로그램을 작성하는 네 가지 단계는 다음과 같습니다:

  1. 문제를 양자 네이티브 형식으로 매핑합니다.

  2. Circuit과 연산자를 최적화합니다.

  3. Qiskit 프리미티브를 사용하여 실행합니다.

  4. 결과를 분석합니다.

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 diagram

# 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')

Quantum circuit diagram

연습: Qiskit에서 기본 양자 Circuit 구성하기 ​

Bell 상태 ∣00⟩+∣11⟩2\frac{|00\rangle + |11\rangle}{\sqrt{2}}에 대한 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')

Quantum circuit diagram

양자 Circuit의 초기 상태는 ∣00⟩\ket{00} 상태입니다.

최종 상태는 다음과 같습니다:

# Use Statevector to fetch the statevector of the circuit
sv = Statevector(qc)
sv.draw(output='latex')

22∣00⟩+22∣11⟩\frac{\sqrt{2}}{2} |00\rangle+\frac{\sqrt{2}}{2} |11\rangle

Qiskit의 비트 번호 지정에 관한 참고 사항

Qiskit은 문자열에서 비트를 오른쪽에서 왼쪽으로 번호를 매겨요. Qiskit SDK는 LSb 0 비트 번호 지정 방식을 사용해요. nn개의 비트(또는 qubit)를 문자열로 표시하거나 해석할 때, 비트 n−1n-1이 가장 왼쪽 비트이고 비트 00이 가장 오른쪽 비트예요. 이는 보통 숫자를 표기할 때 최상위 자릿수를 왼쪽에 두기 때문이며, Qiskit에서도 비트 n−1n-1을 최상위 비트로 해석하기 때문이에요. 자세한 내용은 Qiskit SDK의 비트 순서 항목을 참조하세요.

#LSB ordering example
qc2 = QuantumCircuit(2)
qc2.x(1)

qc2.draw("mpl")

Quantum circuit diagram

sv2 = Statevector(qc2)
sv2.draw(output='latex')

∣10⟩ |10\rangle

측정 Gate가 필요한가요?

양자 Circuit을 만들 때, 실행 후 반환될 데이터의 유형도 고려해야 합니다. Qiskit은 데이터를 반환하는 두 가지 방법을 제공합니다: 관측 가능량의 기댓값을 얻거나, 측정하고자 하는 qubit 집합에 대한 확률 분포를 얻을 수 있습니다. Qiskit 프리미티브를 사용하여 이 두 가지 방법 중 하나로 Circuit을 측정하도록 워크로드를 준비하세요.

  • Sampler 프리미티브 - 측정하도록 선택한 qubit 집합에 대한 확률 분포를 반환합니다. 예시:
  • Estimator 프리미티브 - 관측 가능량의 기댓값을 반환합니다. 예시:

오늘은 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')

Quantum circuit diagram

Step 2. 대상 하드웨어에 맞게 Circuit 최적화하기​

장치에서 Circuit을 실행할 때, Circuit에 포함된 명령 집합을 최적화하고 Circuit의 전체 깊이(대략 명령의 수)를 최소화하는 것이 중요합니다. 이를 통해 오류와 노이즈의 영향을 줄여 최선의 결과를 얻을 수 있습니다. 또한 Circuit의 명령은 Backend 장치의 명령 집합 아키텍처(ISA)를 따라야 하며 장치의 기저 Gate(basis 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)

Quantum circuit diagram

Step 3. Qiskit 프리미티브를 사용하여 실행하기​

양자 컴퓨터는 무작위 결과를 생성할 수 있으므로, 일반적으로 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)

Code output

실제 장치에서 프로그램 실행하기

실제 장치에서 이 코드를 실행하려면 다음 코드를 사용할 수 있어요.

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)

Code output

완료된 작업에서 결과 가져오기​

아래 셀은 완료된 작업에서 결과를 가져오는 방법을 보여줍니다.

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

Code output