Lewati ke konten utama

Langsung Praktik dengan Qiskit: Hello World - Qiskit Patterns

Di notebook ini kamu akan mempelajari alur kerja Qiskit Patterns, dan menggunakan Sampler primitive dari Qiskit.

Tutorial ini sebagian menggunakan konten dari IBM Quantum Documentation: Hello World.

Link berguna:

  1. Silakan buat akun IBM Cloud untuk mengakses IBM Quantum Platform.
  2. Kita akan menggunakan platform berbasis cloud untuk menyiapkan lingkungan coding. Kamu bisa menggunakan QBraid atau Google Colab.
  3. Setelah notebook ini, kita akan melihat protokol Quantum Teleportation.

Link tambahan - komunitas Qiskit dan sumber belajar lebih lanjut:

Install Qiskit​

Kamu bisa menggunakan lingkungan jupyter lab online (lihat panduan Lingkungan lab online) atau menginstal Qiskit secara lokal.

Ikuti panduan instalasi Qiskit Install the Qiskit SDK and the Qiskit Runtime client untuk menyelesaikan langkah-langkah berikut:

  • Install Qiskit termasuk paket visualisasi tambahan: pip install qiskit[visualization]

  • Install qiskit-ibm-runtime: pip install qiskit-ibm-runtime

  • Install jupyter: pip install jupyter

Pastikan versi Python yang kamu gunakan di lingkunganmu adalah python>=3.10, agar kompatibel dengan versi Qiskit terbaru:

# Added by doQumentation β€” required packages for this notebook
!pip install -q IPython
from platform import python_version

print(python_version())
3.13.7

Jika kamu perlu mengupgrade Python dan tidak tahu caranya, silakan lihat panduan ini tentang cara upgrade Python tergantung OS kamu: How to update 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.

Lakukan impor yang diperlukan​

Ayo lakukan impor yang diperlukan untuk tutorial ini.

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

Siapkan akun IBM Quantum Platform kamu​

Untuk menjalankan quantum Circuit di hardware nyata, kamu perlu akun IBM Cloud.

Ikuti instruksi dalam panduan ini Siapkan akun IBM Cloud kamu untuk menyelesaikan langkah-langkah berikut:

  1. Buat akun IBM Cloud jika kamu belum punya.
  2. Login atau buat akun IBM Quantum Platform dengan IBMid.
  3. Akses dashboard IBM Quantum Platform kamu, buat API token kamu, dan salin ke lokasi yang aman. (Lihat gambar referensi pertama di bawah.)
  4. Di sel kode setelah gambar referensi, ganti deleteThisAndPasteYourAPIKeyHere dengan API key kamu.
  5. Pergi ke halaman Instances dari menu utama ☰ dan buat instance kamu. Jika kamu bukan bagian dari institusi Network, pilih open plan. (Lihat gambar referensi kedua di bawah.)
  6. Setelah instance dibuat, salin kode CRN-nya. (CRN singkatan dari Cloud Resource Names) Kamu mungkin perlu menyegarkan halaman untuk melihat instance.
  7. Di sel kode setelah gambar referensi, ganti deleteThisAndPasteYourCRNHere dengan kode CRN kamu.

Catatan: Perlakukan API key kamu seperti password yang aman. Lihat panduan Siapkan akun IBM Cloud kamu untuk informasi lebih lanjut tentang menggunakan API key di lingkungan aman maupun tidak aman.

#@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,
)

Buat dan jalankan algoritma quantum sederhana menggunakan kerangka kerja Qiskit pattern​

Kerangka konseptual Qiskit pattern bisa dianggap sebagai anatomi dari sebuah algoritma quantum.

Empat langkah untuk menulis program quantum menggunakan Qiskit patterns adalah:

  1. Petakan masalah ke format native quantum.

  2. Optimalkan Circuit dan operator.

  3. Jalankan menggunakan fungsi primitive Qiskit.

  4. Analisis hasilnya.

Langkah 1. Petakan masalah ke format native quantum​

Dalam program quantum, quantum Circuit adalah format native untuk merepresentasikan instruksi quantum, dan operator merepresentasikan observable yang akan diukur. Saat membuat Circuit, biasanya kamu membuat objek QuantumCircuit baru, lalu menambahkan instruksi ke dalamnya secara berurutan.

Demonstrasi: Membangun quantum Circuit dasar di Qiskit​

Ayo coba membangun beberapa Circuit sederhana dengan Qiskit.

# 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

Latihan: Membangun quantum Circuit dasar di Qiskit​

Buat Circuit untuk Bell state ∣00⟩+∣11⟩2\frac{|00\rangle + |11\rangle}{\sqrt{2}}

# 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

State awal dari quantum Circuit adalah state ∣00⟩\ket{00}.

State akhirnya adalah:

# 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

Catatan tentang penomoran bit di Qiskit

Qiskit menomori bit dalam sebuah string dari kanan ke kiri. Qiskit SDK menggunakan penomoran bit LSb 0. Saat menampilkan atau menginterpretasikan daftar nn bit (atau Qubit) sebagai string, bit nβˆ’1nβˆ’1 adalah bit paling kiri, dan bit 00 adalah bit paling kanan. Ini karena kita biasanya menulis angka dengan digit paling signifikan di sebelah kiri, dan di Qiskit, bit nβˆ’1nβˆ’1 diinterpretasikan sebagai bit paling signifikan. Untuk detail lebih lanjut, lihat topik Bit-ordering in the 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

Apakah kita perlu Gate pengukuran?

Saat membuat quantum Circuit, kamu juga harus mempertimbangkan jenis data apa yang ingin dikembalikan setelah eksekusi. Qiskit menyediakan dua cara untuk mengembalikan data: kamu bisa mendapatkan nilai ekspektasi dari sebuah observable, atau kamu bisa mendapatkan distribusi probabilitas untuk sekumpulan Qubit yang kamu pilih untuk diukur. Persiapkan beban kerja kamu untuk mengukur Circuit dengan salah satu dari dua cara ini menggunakan Qiskit primitives.

  • Sampler primitive - mengembalikan distribusi probabilitas untuk sekumpulan Qubit yang kamu pilih untuk diukur. Contoh:

  • Estimator primitive - mengembalikan nilai ekspektasi dari sebuah observable. Contoh:

Kita akan menggunakan Sampler hari ini, jadi kita perlu menambahkan Gate pengukuran ke Circuit kita.

# 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. Optimalkan Circuit untuk Hardware Target​

Saat menjalankan circuit di perangkat, penting untuk mengoptimalkan sekumpulan instruksi yang ada di dalam circuit dan meminimalkan kedalaman keseluruhan (secara kasar, jumlah instruksi) dari circuit tersebut. Ini memastikan kamu mendapatkan hasil terbaik dengan mengurangi efek kesalahan dan noise. Selain itu, instruksi dalam circuit harus sesuai dengan Instruction Set Architecture (ISA) perangkat Backend dan harus mempertimbangkan gate basis serta konektivitas Qubit perangkat tersebut.

Kode berikut membuat instance simulator untuk mengirimkan job, dan mengubah Circuit serta observable agar sesuai dengan ISA Backend tersebut. Perlu diketahui bahwa kita akan menggunakan perangkat nyata nanti.

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

Diagram Circuit Quantum

Step 3. Eksekusi Menggunakan Qiskit Primitives​

Komputer quantum bisa menghasilkan hasil yang acak, jadi biasanya kamu mengumpulkan sampel dari output dengan menjalankan circuit berkali-kali. Kamu bisa memperkirakan nilai observable menggunakan class Estimator. Sampler bisa dipakai untuk mendapatkan data dari komputer quantum. Objek-objek ini memiliki metode run() yang menjalankan pilihan Circuit, observable, dan parameter (jika ada), menggunakan primitive unified bloc (PUB).

# 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. Proses Hasil (Post-process)​

Langkah ini melibatkan pemrosesan hasil yang kamu dapatkan. Kamu bisa memasukkan hasil ini ke dalam alur kerja lain untuk analisis lebih lanjut, atau menyiapkan plot dari nilai dan data utama. Secara umum, langkah ini spesifik untuk masalahmu.

  • Untuk Sampler, kita membuat plot distribusi probabilitas yang diperoleh dengan mengambil sampel dari circuit quantum sebanyak shots yang kamu tentukan menggunakan 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)

Output kode

Menjalankan Program di Perangkat Nyata

Kalau kamu ingin menjalankan kode ini di perangkat nyata, kamu bisa menggunakan kode berikut.

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)

Output kode

Mengambil Hasil dari Job yang Sudah Selesai​

Cell di bawah ini menunjukkan cara mengambil hasil dari job yang sudah selesai.

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

Output kode