Menjelajahi ketidakpastian
Untuk modul Qiskit in Classrooms ini, siswa harus memiliki lingkungan Python yang berfungsi dengan paket-paket berikut terinstal:
qiskitv2.1.0 atau lebih baruqiskit-ibm-runtimev0.40.1 atau lebih baruqiskit-aerv0.17.0 atau lebih baruqiskit.visualizationnumpypylatexenc
Untuk mengatur dan menginstal paket-paket di atas, lihat panduan Install Qiskit. Untuk menjalankan job di komputer kuantum nyata, siswa perlu membuat akun di IBM Quantum® dengan mengikuti langkah-langkah di panduan Set up your IBM Cloud account.
Modul ini telah diuji dan menggunakan 8 menit waktu QPU. Ini hanya perkiraan. Penggunaan aktual kamu mungkin berbeda. Dua perhitungan yang memakan waktu ditandai demikian dalam komentar header dan bisa dijalankan di simulator jika siswa kekurangan waktu QPU. Dengan penghilangan keduanya, modul hanya memerlukan sekitar ~30 detik waktu QPU.
# Added by doQumentation — required packages for this notebook
!pip install -q matplotlib numpy qiskit qiskit-aer qiskit-ibm-runtime
# Uncomment and modify this line as needed to install dependencies
#!pip install 'qiskit>=2.1.0' 'qiskit-ibm-runtime>=0.40.1' 'qiskit-aer>=0.17.0' 'numpy' 'pylatexenc'
Tonton panduan modul oleh Dr. Katie McCormick di bawah ini, atau klik di sini untuk menontonnya di YouTube.
Pendahuluan
Kamu mungkin pernah mendengar tentang prinsip ketidakpastian, bahkan di luar pelajaran fisika. Pernyataan sehari-hari yang umum dari ketidakpastian adalah "Dengan melihat sesuatu, kamu mempengaruhinya." Itu memang benar. Tapi cara yang lebih fisikal untuk menggambarkan ketidakpastian adalah bahwa ada besaran fisik tertentu yang memiliki ketidaksesuaian yang mencegah keduanya diketahui secara bersamaan dengan akurasi sembarang. Banyak siswa pertama kali menemui pasangan variabel yang tidak kompatibel dan , yang berarti posisi sepanjang satu sumbu yang disebut sumbu-, dan momentum linier sepanjang arah tersebut, masing-masing. Untuk variabel-variabel tersebut, batasan ketidakpastian ditulis Di sini, disebut "ketidakpastian dalam ", yang memiliki definisi yang sama dengan deviasi standar dalam statistik, dan dapat didefinisikan sebagai didefinisikan dengan cara yang sama. Di sini, kita tidak akan menurunkan hubungan ketidakpastian ini; kita akan menunjukkan bahwa hal ini konsisten dengan pemahaman kita tentang gelombang klasik. Artinya, gelombang dengan benar-benar satu frekuensi sempurna dan panjang gelombang akan terus berlanjut selamanya sebagai sinusoid sempurna. Secara mekanika kuantum, ini akan berhubungan dengan mengetahui momentum secara sempurna sesuai hipotesis de Broglie: . Tapi untuk mengetahui partikel seperti gelombang itu berada, gelombang yang menggambarkannya harus menjadi lebih tajam dalam ruang, seperti Gaussian yang sangat sempit, misalnya. Kita tahu bahwa kita bisa mengungkapkan fungsi kontinu apa pun, termasuk fungsi gelombang yang berpuncak tajam seperti itu, sebagai deret Fourier dari fungsi sinusoidal dengan panjang gelombang yang berbeda. Namun saat fungsi gelombang menjadi lebih berpuncak tajam (dan posisi lebih diketahui), kita akan membutuhkan lebih banyak suku dalam deret Fourier, yang berarti campuran lebih banyak panjang gelombang (dan dengan demikian, secara mekanika kuantum, lebih banyak nilai momentum).
Lebih sederhana: sebuah keadaan dengan momentum yang terdefinisi dengan baik (sinusoid sempurna dalam ruang) memiliki posisi yang sangat tidak pasti. Sebuah keadaan dengan posisi yang terdefinisi dengan baik (seperti distribusi delta Dirac) memiliki momentum yang sangat tidak pasti.
Ada variabel lain yang menunjukkan ketidaksesuaian seperti itu. Misalnya, spin partikel mungkin memiliki proyeksi yang terdefinisi dengan baik sepanjang satu sumbu, tetapi kemudian kita tidak tahu apa-apa tentang proyeksi pada sumbu yang tegak lurus. Misalnya keadaan (untuk Qubit atau partikel spin-1/2) memiliki proyeksi pasti sepanjang sumbu (bernilai 1 dalam konteks Qubit, dan dalam konteks partikel spin-1/2). Tetapi keadaan ini dapat ditulis sebagai superposisi dari dua keadaan yang masing-masing memiliki proyeksi terdefinisi dengan baik pada sumbu : atau ekuivalennya memiliki proyeksi terdefinisi dengan baik pada , begitu pula . Jadi jika kita menentukan proyeksi sebuah keadaan sepanjang sumbu , kita tidak tahu proyeksi sepanjang sumbu . Dan jika kita menentukan proyeksi pada sumbu , kita tidak tahu proyeksi sepanjang . Ada perbedaan kecil saat membahas ini dalam konteks spin dan dalam Qubit. Tapi secara umum, eigenstate dari matriks Pauli memiliki hubungan yang menarik yang dapat kita jelajahi. Sepanjang pelajaran ini, kita akan memeriksa secara eksperimental intuisi kita tentang ketidakpastian dalam variabel-variabel yang tidak kompatibel ini, dan memverifikasi bahwa hubungan ketidakpastian berlaku pada komputer kuantum IBM®.
Pemeriksaan sederhana intuisi
Dalam eksperimen pertama ini dan sepanjang modul, kita akan menggunakan kerangka kerja untuk komputasi kuantum yang dikenal sebagai "Qiskit patterns", yang memecah alur kerja menjadi langkah-langkah berikut:
- Langkah 1: Petakan input klasik ke masalah kuantum
- Langkah 2: Optimalkan masalah untuk eksekusi kuantum
- Langkah 3: Jalankan menggunakan Qiskit Runtime Primitives
- Langkah 4: Post-processing dan analisis klasik
Kita umumnya akan mengikuti langkah-langkah ini, meski kita mungkin tidak selalu secara eksplisit memberi labelnya.
Mari mulai dengan memuat beberapa paket yang diperlukan termasuk Runtime primitives. Kita juga akan memilih komputer kuantum yang paling tidak sibuk yang tersedia untuk kita.
Ada kode di bawah ini untuk menyimpan kredensial kamu pada penggunaan pertama. Pastikan untuk menghapus informasi ini dari notebook setelah menyimpannya ke lingkunganmu, agar kredensialmu tidak dibagikan secara tidak sengaja saat kamu berbagi notebook. Lihat Set up your IBM Cloud account dan Initialize the service in an untrusted environment untuk panduan lebih lanjut.
from numpy import pi
# Load the Qiskit Runtime service
from qiskit_ibm_runtime import QiskitRuntimeService
# Syntax for first saving your token. Delete these lines after saving your credentials.
# QiskitRuntimeService.save_account(channel='ibm_quantum_platform', instance = '<YOUR_IBM_INSTANCE_CRN>', token='<YOUR-API_KEY>', overwrite=True, set_as_default=True)
# service = QiskitRuntimeService(channel='ibm_quantum_platform')
# Load saved credentials
service = QiskitRuntimeService()
# Load the Runtime primitive and session
from qiskit_ibm_runtime import (
Batch,
SamplerV2 as Sampler,
EstimatorV2 as Estimator,
)
# Use the least busy backend
backend = service.least_busy(min_num_qubits=127)
print(backend.name)
ibm_sherbrooke
Jika seorang siswa menghabiskan waktu komputasi kuantum yang tersedia selama pelajaran, baris-baris di bawah ini bisa di-uncomment dan digunakan untuk menyiapkan simulator yang sebagian meniru perilaku noise dari komputer kuantum yang dipilih di atas.
# Import an estimator, this time from qiskit (we will import from Runtime for real hardware)
from qiskit_aer.primitives import SamplerV2, EstimatorV2
from qiskit_aer.noise import NoiseModel
# Generate the noise model from the backend properties
noise_model = NoiseModel.from_backend(backend)
noisy_sampler = SamplerV2(options={"backend_options": {"noise_model": noise_model}})
noisy_estimator = EstimatorV2(options={"backend_options": {"noise_model": noise_model}})
Kamu mungkin ingat bahwa eigenstate dari satu operator, Z, bukan eigenstate dari operator lain X. Kita akan mengamati hal itu sekarang, secara eksperimental dengan melakukan pengukuran sepanjang sumbu dan . Untuk pengukuran sepanjang , kita cukup menggunakan qc.measure(), karena komputer kuantum IBM dirancang untuk mengukur sepanjang . Tapi untuk mengukur sepanjang , kita harus merotasi sistem untuk secara efektif memindahkan sumbu ke orientasi yang kita ukur. Ini dilakukan dengan Hadamard Gate. Ada langkah serupa yang diperlukan untuk pengukuran sepanjang . Langkah-langkah yang diperlukan dikumpulkan di sini untuk kemudahan:
- Untuk mengukur sepanjang :
qc.measure() - Untuk mengukur sepanjang :
qc.h()laluqc.measure() - Untuk mengukur sepanjang :
qc.sdg(),qc.h(),qc.slaluqc.measure()
Langkah 1: Petakan input klasik ke masalah kuantum
Dalam hal ini, langkah pemetaan hanyalah mengungkapkan pengukuran dan rotasi yang dijelaskan di atas dalam Circuit kuantum:
# Step 1: Map
# Import some general packages
from qiskit import ClassicalRegister, QuantumCircuit, QuantumRegister
# Define registers
qr = QuantumRegister(1, "q")
cr = ClassicalRegister(2, "c")
qc = QuantumCircuit(qr, cr)
# Add a first measurement
qc.measure(qr, cr[0])
qc.barrier()
# Change basis so that measurements made on quantum computer which normally tell us about z, now tell us about x.
qc.h(qr)
# Add a second measurement
qc.measure(qr, cr[1])
qc.draw("mpl")
Langkah 2: Optimalkan masalah untuk eksekusi kuantum
Langkah ini mengambil operasi yang ingin kita lakukan dan mengungkapkannya dalam hal fungsionalitas komputer kuantum tertentu. Ini juga memetakan masalah kita ke tata letak komputer kuantum.
# Step 2: Transpile
from qiskit.transpiler.preset_passmanagers import generate_preset_pass_manager
target = backend.target
pm = generate_preset_pass_manager(target=target, optimization_level=3)
qc_isa = pm.run(qc)
Langkah 3: Jalankan menggunakan Qiskit Runtime primitives
Kita bisa menggunakan Sampler untuk mengumpulkan statistik pengukuran. Kita akan membuat primitif Sampler untuk dijalankan di komputer kuantum nyata menggunakan mode = backend. Ada mode lain untuk alur kerja lain, dan kita akan menggunakan salah satunya di bawah ini. Sampler akan digunakan dengan memanggil metode run() dengan daftar "PUB" (Primitive Unified Blocs). Setiap PUB berisi hingga tiga nilai yang, bersama-sama, mendefinisikan unit komputasi pekerjaan bagi Estimator untuk diselesaikan: Circuit, observables, parameter. Kamu juga bisa memberikan daftar Circuit, daftar observables, dan daftar parameter. Untuk informasi lebih lanjut, baca Overview of PUBs.
Kita ingin menjalankan di komputer kuantum nyata, agar kita menjalankan eksperimen fisika kuantum yang sesungguhnya. Jika kamu menghabiskan waktu yang dijatahkan di komputer kuantum nyata, kamu bisa mengomentari kode di bawah ini untuk komputer kuantum, dan uncomment kode untuk menjalankan di simulator.
# Step 3: Run the job on a real quantum computer
sampler = Sampler(mode=backend)
pubs = [qc_isa]
job = sampler.run(pubs)
res = job.result()
counts = res[0].data.c.get_counts()
# Run the job on the Aer simulator with noise model from real backend
# job = noisy_sampler.run([qc_isa])
# res=job.result()
# counts=res[0].data.c.get_counts()
Langkah 4: Post-processing
Ini adalah kasus post-processing yang sangat sederhana, di mana kita hanya memvisualisasikan counts.
Perlu dicatat bahwa Qiskit mengurutkan Qubit, pengukuran, dan hal-hal lain dengan mencantumkan item bernomor terendah terakhir / di sebelah kanan, sebuah konvensi yang disebut sebagai "little-endian". Ini berarti kolom di bawah yang berlabel "10" mengacu pada counts di mana pengukuran pertama menghasilkan "0", dan pengukuran kedua menghasilkan "1".
# Step 4: Post-process
from qiskit.visualization import plot_histogram
plot_histogram(counts)
Jika konvensi ini tidak cocok untukmu, kamu bisa menggunakan marginal_counts untuk memvisualisasikan hasil setiap pengukuran secara terpisah:
from qiskit.result import marginal_counts
plot_histogram(
marginal_counts(counts, indices=[0]), title="Counts after first measurement"
)
plot_histogram(
marginal_counts(counts, indices=[1]), title="Counts after second measurement"
)
Secara default, keadaan dalam Qiskit diinisialisasi ke keadaan . Jadi tidak mengejutkan bahwa hampir semua pengukuran pertama menghasilkan . Namun perhatikan bahwa ada hampir pembagian yang merata pada pengukuran kedua (yang memberi informasi tentang proyeksi keadaan pada ). Sepertinya keadaan yang memberi kita hasil pengukuran yang sangat dapat diprediksi sepanjang memberi kita hasil yang sangat tidak dapat diprediksi untuk pengukuran sepanjang . Mari kita jelajahi ini.
Apa yang terjadi jika kita melakukan pengukuran dalam urutan yang berlawanan? Kita bisa mulai dengan menggunakan Hadamard Gate untuk mendapatkan statistik tentang probabilitas diukur dalam . Kemudian untuk pengukuran kedua, kita akan kembali ke basis menggunakan Hadamard Gate kedua.
# Step 1:
# Define registers
qr = QuantumRegister(1, "q")
cr = ClassicalRegister(2, "c")
qc = QuantumCircuit(qr, cr)
# Change basis to measure along x.
qc.h(qr)
qc.measure(qr, cr[0])
qc.barrier()
# Change our basis back to z and make a second measurement
qc.h(qr)
qc.measure(qr, cr[1])
qc.draw("mpl")
# Step 2: Transpile the circuit for running on a quantum computer
pm = generate_preset_pass_manager(target=target, optimization_level=3)
qc_isa = pm.run(qc)
# Step 3: Run the job on a real quantum computer
sampler = Sampler(mode=backend)
pubs = [qc_isa]
job = sampler.run(pubs)
res = job.result()
counts = res[0].data.c.get_counts()
# Run the job on the Aer simulator with noise model from real backend
# job = noisy_sampler.run([qc_isa])
# res=job.result()
# counts=res[0].data.c.get_counts()
# Step 4: Post-process
from qiskit.visualization import plot_histogram
plot_histogram(counts)
Di sini, sepertinya kita memiliki ketidakprediktabilan yang lebih rendah! Sebelumnya, kita setidaknya tahu hasil apa yang akan terjadi dari pengukuran pertama, sekarang kita memiliki distribusi yang cukup merata di semua kemungkinan keadaan. Tidak terlalu sulit untuk melihat mengapa ini terjadi. Kita mulai dari , yang merupakan campuran 50-50 dari dan , sesuai dengan Jadi jelas harus ada probabilitas yang sama untuk mendapatkan keadaan + atau - (dipetakan ke 0 dan 1 dalam grafik) untuk pengukuran pertama. Pengukuran sepanjang meruntuhkan keadaan menjadi baik eigenstate atau eigenstate . Setiap keadaan itu adalah campuran 50-50 dari dan , sesuai dengan Jadi begitu sistem berada dalam eigenstate , jelas pengukuran sepanjang akan menghasilkan dan , dan melakukannya dengan probabilitas yang kurang lebih sama. Jadi contoh pertama kita menunjukkan bahwa beberapa keadaan akan memiliki hasil yang sangat dapat diprediksi untuk beberapa pengukuran, tetapi hasil yang tidak dapat diprediksi untuk pengukuran lain. Contoh saat ini menunjukkan bahwa kita bisa lebih buruk dari itu. Ada keadaan yang dapat memberi kita hasil yang tidak dapat diprediksi untuk kedua pengukuran, bahkan jika yang kita lakukan hanyalah menukar urutan pengukuran. Mari kita selidiki seberapa pasti atau tidak pasti suatu besaran untuk keadaan tertentu.
Menghitung ketidakpastian
Kita bisa mengkuantifikasi ini menggunakan ketidakpastian, atau varians. "Ketidakpastian" sering didefinisikan sebagai akar kuadrat dari "varians" suatu distribusi. Artinya, ketidakpastian untuk beberapa observabel dilambangkan dan diberikan oleh
Untuk kasus matriks Pauli, di mana , ini menjadi
Mari kita terapkan ini ke contoh konkret. Mari mulai dengan keadaan dan kita tentukan ketidakpastian dari observabel dalam keadaan tersebut.
Periksa pemahamanmu
Baca pertanyaan di bawah, pikirkan jawabanmu, lalu klik segitiga untuk mengungkap solusinya.
Hitung ketidakpastian dalam keadaan , secara manual.
Jawaban:
Dalam keadaan yang diberikan, ini menghasilkan:
Kita bisa membuat keadaan awal sembarang menggunakan qc.initialize(). Perlu dicatat bahwa sintaks untuk unit imajiner di sini adalah .
# Step 1: Map the problem into a quantum circuit
from qiskit.quantum_info import SparsePauliOp
import numpy as np
obs = SparsePauliOp("X")
# Define registers
qr = QuantumRegister(1, "q")
cr = ClassicalRegister(1, "c")
qc = QuantumCircuit(qr, cr)
# Initialize the state
qc.initialize([1, 1j] / np.sqrt(2))
# Step 2: Transpile the circuit
pm = generate_preset_pass_manager(target=target, optimization_level=3)
qc_isa = pm.run(qc)
obs_isa = obs.apply_layout(layout=qc_isa.layout)
# Step 3: Run the circuit on a real quantum computer
estimator = Estimator(mode=backend)
pubs = [(qc_isa, obs_isa)]
job = estimator.run([[qc_isa, obs_isa]])
res = job.result()
# Run the job on the Aer simulator with noise model from real backend
# job = noisy_estimator.run([[qc_isa,obs_isa]])
# res=job.result()
# Step 4: Return the result in classical form, and analyze.
print(res[0].data.evs)
-0.02408454165642664
Sesuai persamaan kita di atas, Mari tetap dengan keadaan yang sama, tapi sekarang cari nilai ekspektasi :
# Step 1: Map the problem into a quantum circuit
obs = SparsePauliOp("Z")
# Define registers
qr = QuantumRegister(1, "q")
cr = ClassicalRegister(1, "c")
qc = QuantumCircuit(qr, cr)
# Initialize the state to |+>_y
qc.initialize([1, 1j] / np.sqrt(2))
# Step 2: Transpile the circuit
pm = generate_preset_pass_manager(target=target, optimization_level=3)
qc_isa = pm.run(qc)
obs_isa = obs.apply_layout(layout=qc_isa.layout)
# Step 3: Run the circuit on a real quantum computer
estimator = Estimator(mode=backend)
pubs = [(qc_isa, obs_isa)]
job = estimator.run(pubs)
res = job.result()
# Run the job on the Aer simulator with noise model from real backend
# job = noisy_estimator.run([[qc_isa,obs_isa]])
# res=job.result()
# Step 4: Return the result in classical form, and analyze.
print(res[0].data.evs)
0.04958271968581247
Kita bisa melakukan matematika yang sama seperti sebelumnya, tapi kita akan melihat bahwa variansnya lagi-lagi sangat mendekati 1.0. Kita bisa menyimpulkan bahwa . Memang ini kira-kira benar untuk keadaan yang kita pilih. Tapi bisakah kita melakukan lebih baik? Atau lebih buruk?
Ingat bahwa ada hubungan ketidakpastian antara posisi sepanjang satu arah, dan momentum sepanjang arah yang sama, Untuk variabel-variabel tersebut, tapi bentuk yang paling familiar mungkin adalah Jika ini semua yang kita ingat, kita mungkin tergoda untuk berpikir bahwa dan juga bisa memiliki batas fundamental pada ketidakpastian. Mungkin tidak mungkin bagi produk untuk mencapai nol? Mari coba keadaan lain dan lihat apakah ini berlaku. Kali ini, kita akan menggunakan Mari lihat apa yang terjadi. Perhatikan bahwa dalam kode di bawah ini, Estimator dapat menerima dua set Circuit dan observables dalam pengiriman job yang sama.
# Step 1: Map the problem into a quantum circuit
obs1 = SparsePauliOp("X")
obs2 = SparsePauliOp("Z")
# Define registers
qr = QuantumRegister(1, "q")
cr = ClassicalRegister(1, "c")
qc = QuantumCircuit(qr, cr)
# Initialize the state
qc.initialize([1, 1] / np.sqrt(2))
# Step 2: Transpile the circuit
pm = generate_preset_pass_manager(target=target, optimization_level=3)
qc_isa = pm.run(qc)
obs1_isa = obs1.apply_layout(layout=qc_isa.layout)
obs2_isa = obs2.apply_layout(layout=qc_isa.layout)
# Step 3: Run the circuit on a real quantum computer
with Batch(backend=backend) as batch:
estimator = Estimator(mode=batch)
pubs = [(qc_isa, obs1_isa), (qc_isa, obs2_isa)]
job = estimator.run(pubs)
res = job.result()
batch.close()
# Run the job on the Aer simulator with noise model from real backend
# job = noisy_estimator.run([[qc,obs1],[qc,obs2]])
# res=job.result()
# Step 4: Return the result in classical form, and analyze.
print("The expectation value of the first observable is: ", res[0].data.evs)
print("The expectation value of the second observable is: ", res[1].data.evs)
The expectation value of the first observable is: 1.0011036174126302
The expectation value of the second observable is: 0.0029429797670141016
Nilai ekspektasi seharusnya mendekati 1.0, tapi tidak boleh melebihi 1.0. Jangan khawatir jika melebihi 1.0 dengan jumlah yang sangat kecil. Ini bisa dikaitkan dengan faktor seperti noise dan/atau kesalahan readout. Meskipun ini adalah topik yang sangat penting, kita bisa mengabaikannya untuk saat ini.
Kita mendapatkan nilai ekspektasi yang sangat mendekati 1.0 (sesuai dengan varians yang sangat rendah untuk ). Ini membuat produk dari dua varians cukup rendah:
Meskipun ini tidak persis nol, nilai ini semakin kecil dibandingkan dengan eigenvalue operator Pauli (). Nah, kamu mungkin ingat bahwa hubungan ketidakpastian antara posisi linier dan momentum bisa ditulis secara berbeda, secara eksplisit menggunakan hubungan komutasi antara operator dan :
di mana
adalah komutator dari dan .
Ini adalah bentuk yang paling mudah diperluas ke operator Pauli. Secara umum, untuk dua operator dan ,
Dan dalam kasus matriks Pauli dan , kita memerlukan untuk menghitung
Kita tunjukkan ini di sini, dan sisakan perhitungan serupa kepada pembaca sebagai latihan:
Ini adalah jawaban yang sangat bisa diterima, tapi dengan satu langkah lagi, kita lihat
Hubungan ketidakpastian kita dengan demikian menjadi