Lewati ke konten utama

Simulasi eksak dan berbising dengan Qiskit Aer primitives

Versi paket

Kode di halaman ini dikembangkan menggunakan persyaratan berikut. Kami menyarankan penggunaan versi ini atau yang lebih baru.

qiskit[all]~=2.3.0
qiskit-aer~=0.17

Simulasi eksak dengan Qiskit primitives menunjukkan cara menggunakan reference primitives yang disertakan dengan Qiskit untuk melakukan simulasi eksak dari rangkaian kuantum. Prosesor kuantum yang ada saat ini rentan terhadap kesalahan, atau noise, sehingga hasil simulasi eksak belum tentu mencerminkan hasil yang diharapkan saat menjalankan Circuit di hardware nyata. Meski reference primitives di Qiskit tidak mendukung pemodelan noise, Qiskit Aer menyertakan implementasi primitives yang mendukung pemodelan noise. Qiskit Aer adalah simulator Circuit kuantum berkinerja tinggi yang bisa kamu gunakan sebagai pengganti reference primitives untuk performa lebih baik dan fitur lebih banyak. Ini merupakan bagian dari Qiskit Ecosystem. Dalam artikel ini, kami menunjukkan penggunaan Qiskit Aer primitives untuk simulasi eksak dan berbising.

Catatan
  • qiskit-aer v0.14 atau lebih baru diperlukan.
  • Meski Qiskit Aer primitives mengimplementasikan antarmuka primitive, mereka tidak menyediakan opsi yang sama dengan Qiskit Runtime primitives. Resilience level, misalnya, tidak tersedia dengan Qiskit Aer primitives.
  • Lihat dokumentasi AerSimulator untuk detail tentang opsi metode simulasi yang didukung Aer.

Untuk menjelajahi simulasi eksak dan berbising, buat contoh Circuit pada delapan Qubit:

# Added by doQumentation β€” required packages for this notebook
!pip install -q qiskit qiskit-aer
from qiskit.circuit.library import efficient_su2

n_qubits = 8
circuit = efficient_su2(n_qubits)
circuit.draw("mpl")

Output of the previous code cell

Circuit ini mengandung parameter untuk mewakili sudut rotasi Gate RyR_y dan RzR_z. Saat mensimulasikan Circuit ini, kita perlu menentukan nilai eksplisit untuk parameter-parameter tersebut. Di sel berikutnya, kita tentukan beberapa nilai untuk parameter ini dan menggunakan Estimator primitive dari Qiskit Aer untuk menghitung nilai harapan eksak dari observable ZZβ‹―ZZZ \cdots Z.

from qiskit.quantum_info import SparsePauliOp
from qiskit.transpiler import generate_preset_pass_manager
from qiskit_aer import AerSimulator
from qiskit_aer.primitives import EstimatorV2 as Estimator

observable = SparsePauliOp("Z" * n_qubits)
params = [0.1] * circuit.num_parameters

exact_estimator = Estimator()
# The circuit needs to be transpiled to the AerSimulator target
pass_manager = generate_preset_pass_manager(3, AerSimulator())
isa_circuit = pass_manager.run(circuit)
pub = (isa_circuit, observable, params)
job = exact_estimator.run([pub])
result = job.result()
pub_result = result[0]
exact_value = float(pub_result.data.evs)
exact_value
0.8870140234256602

Sekarang, mari inisialisasi model noise yang menyertakan depolarizing error sebesar 2% pada setiap Gate CX. Dalam praktiknya, kesalahan yang muncul dari Gate dua Qubit, yaitu Gate CX di sini, merupakan sumber kesalahan utama saat menjalankan Circuit. Lihat Membangun model noise untuk gambaran umum pembuatan model noise di Qiskit Aer.

Di sel berikutnya, kita membangun Estimator yang menggabungkan model noise ini dan menggunakannya untuk menghitung nilai harapan dari observable.

from qiskit_aer.noise import NoiseModel, depolarizing_error

noise_model = NoiseModel()
cx_depolarizing_prob = 0.02
noise_model.add_all_qubit_quantum_error(
depolarizing_error(cx_depolarizing_prob, 2), ["cx"]
)

noisy_estimator = Estimator(
options=dict(backend_options=dict(noise_model=noise_model))
)
job = noisy_estimator.run([pub])
result = job.result()
pub_result = result[0]
noisy_value = float(pub_result.data.evs)
noisy_value
0.7247404214143528

Seperti yang kamu lihat, nilai harapan dengan adanya noise cukup jauh dari nilai yang benar. Dalam praktiknya, kamu bisa menggunakan berbagai teknik mitigasi kesalahan untuk melawan efek noise, namun pembahasan teknik-teknik ini berada di luar cakupan artikel ini.

Untuk mendapat gambaran kasar tentang bagaimana noise mempengaruhi hasil akhir, perhatikan model noise kita yang menambahkan depolarizing error sebesar 2% ke setiap Gate CX. Depolarizing error dengan probabilitas pp didefinisikan sebagai saluran kuantum EE yang memiliki aksi berikut pada matriks densitas ρ\rho:

E(ρ)=(1βˆ’p)ρ+pI2nE(\rho) = (1 - p) \rho + p\frac{I}{2^n}

di mana nn adalah jumlah Qubit, dalam hal ini 2. Artinya, dengan probabilitas pp, keadaan digantikan dengan keadaan tercampur sempurna, dan keadaan dipertahankan dengan probabilitas 1βˆ’p1 - p. Setelah mm aplikasi depolarizing channel, probabilitas keadaan yang dipertahankan adalah (1βˆ’p)m(1 - p)^m. Oleh karena itu, kita mengharapkan probabilitas mempertahankan keadaan yang benar di akhir simulasi turun secara eksponensial seiring bertambahnya jumlah Gate CX dalam Circuit kita.

Mari hitung jumlah Gate CX dalam Circuit kita dan hitung (1βˆ’p)m(1 - p)^m. Kita panggil count_ops untuk mendapatkan kamus yang memetakan nama Gate ke jumlahnya, lalu ambil entri untuk Gate CX.

cx_count = circuit.count_ops()["cx"]
(1 - cx_depolarizing_prob) ** cx_count
0.6542558123199923

Nilai ini, 65%, memberikan perkiraan kasar tentang probabilitas bahwa keadaan akhir kita benar. Ini adalah perkiraan yang konservatif karena tidak memperhitungkan keadaan awal simulasi.

Sel kode berikut menunjukkan cara menggunakan Sampler primitive dari Qiskit Aer untuk mengambil sampel dari Circuit berbising. Kita perlu menambahkan pengukuran ke Circuit sebelum menjalankannya dengan Sampler primitive.

from qiskit_aer.primitives import SamplerV2 as Sampler

measured_circuit = circuit.copy()
measured_circuit.measure_all()

noisy_sampler = Sampler(
options=dict(backend_options=dict(noise_model=noise_model))
)
# The circuit needs to be transpiled to the AerSimulator target
pass_manager = generate_preset_pass_manager(3, AerSimulator())
isa_circuit = pass_manager.run(measured_circuit)
pub = (isa_circuit, params, 100)
job = noisy_sampler.run([pub])
result = job.result()
pub_result = result[0]
pub_result.data.meas.get_counts()
{'00100000': 1,
'00000000': 65,
'10101000': 1,
'10000000': 5,
'00001000': 1,
'00000110': 2,
'11110010': 1,
'00000011': 3,
'01010000': 3,
'11000000': 3,
'01111000': 1,
'01000000': 2,
'00000010': 1,
'01100000': 1,
'00011000': 1,
'00111100': 1,
'00010100': 1,
'00001111': 1,
'00110000': 1,
'01100101': 1,
'00000100': 1,
'10100000': 1,
'00000001': 1,
'11010000': 1}

Langkah selanjutnya​

Rekomendasi
Source: IBM Quantum docs β€” updated 27 Apr 2026
English version on doQumentation β€” updated 7 Mei 2026
This translation based on the English version of 11 Mar 2026