Koin Kuantum — modul tentang superposisi dan interferensi
Untuk modul Qiskit in Classrooms ini, siswa harus memiliki lingkungan Python yang berfungsi dengan paket-paket berikut terpasang:
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 pada komputer kuantum nyata, siswa perlu membuat akun di IBM Quantum® dengan mengikuti langkah-langkah dalam panduan Set up your IBM Cloud account.
Modul ini sudah diuji dan menggunakan 47 detik waktu QPU. Ini hanya perkiraan. Penggunaan aktual kamu bisa berbeda.
# Added by doQumentation — required packages for this notebook
!pip install -q matplotlib numpy qiskit 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 walkthrough modul oleh Dr. Katie McCormick di bawah ini, atau klik di sini untuk menontonnya di YouTube.
Pendahuluan
Dalam modul ini, kita akan mengeksplorasi salah satu prinsip inti di jantung teori kuantum: superposisi. Dalam pengalaman sehari-hari, objek selalu memiliki ciri-ciri yang pasti. Lokasi, ukuran, bentuk, warna — semuanya — sudah ditentukan dan pasti, meskipun kita sebagai pengamat belum mengukurnya. Di dunia kuantum, ini belum tentu demikian. Objek kuantum bisa berada dalam sesuatu yang disebut "superposisi" dari beberapa keadaan yang secara klasik diperbolehkan. Ketika superposisi diukur, ia akan secara acak "kolaps" ke salah satu keadaan tersebut.
Dalam beberapa hal, mengukur keadaan superposisi itu seperti melempar koin: tidak ada cara untuk mengetahui sebelumnya ke sisi mana ia akan jatuh. Indeterminisme fundamental ini merupakan aspek mekanika kuantum yang tidak nyaman bahkan bagi Einstein. Ia terkenal berkata, "Tuhan tidak bermain dadu" tentang keacakan ini. Tapi, seperti yang akan kita lihat, Tuhan memang bermain dadu — dan melempar koin.
Kita akan memikirkan lemparan koin klasik sebagai analogi untuk pengukuran keadaan superposisi. Dan — dengan bermain dengan "koin kuantum" menggunakan Qiskit dan sebuah qubit pada prosesor kuantum IBM® — kita akan segera menemukan batas-batas analogi tersebut.
Koin klasik
Mari mulai dengan koin klasik. Lempar koin, dan ia akan jatuh dengan sisi kepala menghadap ke atas atau ke bawah, masing-masing dengan peluang 50%. Walaupun secara prinsip, seseorang bisa menghitung sisi mana yang akan mendarat jika mereka mengetahui kondisi awal koin secara tepat beserta gaya/torsi lemparannya, secara praktik, tidak ada cara untuk mengetahui sebelumnya sisi mana yang akan mendarat. Itulah mengapa kita menggunakan lemparan koin sebagai contoh kanonik dari keadaan probabilistik klasik, di mana hasilnya pada dasarnya acak. Kita bisa menuliskan keadaan koin sebelum mendarat untuk mencerminkan probabilitas 50/50 ini:
Di sini, dua suku tersebut mewakili dua kemungkinan hasil lemparan, dan koefisiennya mewakili probabilitas masing-masing hasil. Perhatikan bahwa biasanya, "" (dikenal sebagai "ket") digunakan untuk merepresentasikan keadaan kuantum, tapi di sini, kita berbicara tentang keadaan probabilistik klasik. Lihat Pelajaran 1: Sistem Tunggal dalam kursus Basics of Quantum Information untuk mempelajari lebih lanjut tentang cara kita merepresentasikan informasi klasik dan kuantum.
Jika kita melempar koin 1000 kali dan mencatat jumlah kepala yang menghadap ke atas dan ke bawah, kita akan mendapatkan sesuatu seperti ini:
# import necessary packages:
import numpy as np
import matplotlib.pyplot as plt
import random
nflips = 1000
fliplist = [random.randint(0, 1) for f in range(nflips)]
# bar plots using get_gaussian_probs function
plt.hist(fliplist)
plt.show()
Koin kuantum
Kita bisa membuat keadaan probabilistik serupa menggunakan qubit pada komputer kuantum kita. Seperti lemparan koin, qubit juga bisa diukur dalam dua keadaan yang mungkin: dan . Kita membuat keadaan probabilistik "superposisi" dengan mulai dari keadaan , kemudian menerapkan sesuatu yang disebut Hadamard Gate pada qubit. Ini menempatkannya dalam superposisi yang sama antara dan . Perhatikan bahwa meskipun keadaan superposisi ini mungkin terlihat dan berperilaku seperti koin pada pandangan pertama, kita akan segera melihat bahwa ada lebih banyak hal di dalamnya. Tujuan modul ini adalah untuk menunjukkan bahwa superposisi tidak sama dengan lemparan koin klasik.
Jadi, karena qubit berada dalam superposisi yang sama antara 0 dan 1, ketika kita mengukur qubit tersebut, akan ada peluang 50% kita mengukur , 50% peluang kita mengukur . Kita menuliskan keadaan ini sedikit berbeda dari kasus probabilistik klasik, karena alasan yang akan menjadi jelas nanti:
Di sini, probabilitas pengukuran masing-masing dari dua keadaan tidak lagi sama dengan koefisiennya, seperti yang terjadi dalam keadaan probabilistik klasik di atas. Sebagai gantinya, kuadrat dari koefisien itulah yang memberikan probabilitasnya, dan masing-masing koefisien ini sekarang bisa bersifat kompleks, artinya bisa memiliki bagian real dan imajiner.
Meskipun ada perbedaan-perbedaan ini, hasil pengukuran keadaan ini pada dasarnya sama seperti melempar koin.
from qiskit import QuantumCircuit
qcoin = QuantumCircuit(1)
qcoin.h(0)
qcoin.measure_all()
qcoin.draw("mpl")
Jadi, pada dasarnya, menerapkan Hadamard Gate adalah analogi dari melempar koin. Dan sama seperti kita melempar koin 1000 kali untuk melihat statistik koin mendarat kepala ke atas atau ke bawah, kita bisa melakukan hal serupa di Qiskit dengan "koin kuantum" kita. Kita bisa menggunakan primitive Qiskit yang disebut Sampler, yang akan mengulangi Circuit beberapa kali untuk mengambil sampel statistik dari keadaan yang dihasilkan.
Pertama, kita memuat layanan Qiskit Runtime dan primitive, kemudian kita memilih Backend untuk menjalankan Circuit.
Ada kode di bawah untuk menyimpan kredensial kamu saat pertama kali digunakan. 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.
# 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 (
SamplerV2 as Sampler,
EstimatorV2 as Estimator,
)
# Use the least busy backend
backend = service.least_busy()
print(backend.name)
ibm_kingston
Jika kamu tidak memiliki waktu yang tersedia lagi di akunmu, kamu juga bisa memilih untuk menjalankan ini pada simulator. Cukup batalkan komentar pada kode dan jalankan sel di bawah untuk melakukannya:
## Use a local simulator
# from qiskit_aer import AerSimulator
## Generate a simulator that mimics the real quantum system
# backend_sim = AerSimulator.from_backend(backend)
## Import an estimator, this time from qiskit (we will import from Runtime for real hardware)
# from qiskit.primitives import BackendSamplerV2
# sampler_sim = BackendSamplerV2(backend = backend_sim)
# from qiskit.primitives import BackendEstimatorV2
# estimator_sim = BackendEstimatorV2(backend = backend_sim)
## 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(qcoin)
## Execute
# On real hardware:
sampler = Sampler(mode=backend)
pubs = [qc_isa]
job = sampler.run(pubs, shots=1000)
res = job.result()
counts = res[0].data.meas.get_counts()
# or with Aer simulator with noise model from real backend
# job = sampler_sim.run([qc_isa])
# counts=job.result()[0].data.meas.get_counts()
## Analysis
from qiskit.visualization import plot_histogram
plot_histogram(counts)
Dengan 1000 sampel dari Circuit di atas, kita mendapatkan sesuatu yang terlihat pada dasarnya identik dengan histogram koin klasik, dengan sedikit fluktuasi statistik.
Selain mengambil sampel statistik dari koin kuantum, kita juga bisa menggunakan primitive Qiskit lain yang disebut Estimator untuk mengukur apa yang disebut nilai ekspektasi dari sebuah observable pada keadaan tersebut. Untuk menggambarkan apa nilai ekspektasi ini, mari gunakan koin klasik sebagai contoh. Katakanlah kamu menggunakan koin untuk berjudi: setiap kali kamu melempar koin dan mendarat "kepala ke atas," kamu menang satu dolar. Tapi setiap kali mendarat "kepala ke bawah," kamu kehilangan satu dolar. Jika kamu ingin tahu berapa banyak uang yang diharapkan kamu dapatkan per lemparan (nilai ekspektasi dari observable "uang"), maka kamu akan menghitung:
Karena kamu sama-sama mungkin menang satu dolar maupun kehilangan satu dolar, nilai ekspektasinya adalah $0.
Demikian pula, dengan keadaan kuantum, kita bisa menghitung nilai ekspektasi dari observable "Z", di mana Z adalah matriks Pauli dengan nilai +1 dan -1 yang terkait dengan keadaan dan , masing-masing.
from qiskit.quantum_info import Pauli
qcoin = QuantumCircuit(1)
qcoin.h(0)
# for Estimator, we do not apply the measurement to the circuit
<qiskit.circuit.instructionset.InstructionSet at 0x136df1ba0>
## Transpile
from qiskit.transpiler.preset_passmanagers import generate_preset_pass_manager
target = backend.target
pm = generate_preset_pass_manager(target=target, optimization_level=3)
obs = Pauli("Z")
qc_isa = pm.run(qcoin)
obs_isa = obs.apply_layout(layout=qc_isa.layout)
## Execute
# On real hardware:
estimator = Estimator(mode=backend)
pubs = [(qc_isa, obs_isa)]
job = estimator.run([[qc_isa, obs_isa]])
res = job.result()
# On a simulator:
# job = estimator_sim.run([[qc_isa, obs_isa]])
# res=job.result()
print(res[0].data.evs)
-0.014799284701239441
Kita mendapatkan nilai ekspektasi 0, seperti yang diharapkan (ha). Ini adalah cara lain untuk mengkonfirmasi bahwa memang ada probabilitas yang sama untuk mengukur 0 dan 1, dan tampaknya berperilaku seperti lemparan koin.
Pada titik ini, "koin kuantum" terlihat persis seperti koin klasik. Tapi di bagian berikutnya, kita akan melakukan beberapa eksperimen yang akan mengungkap perbedaan mendasar antara keduanya.
Kuantum yang terungkap: eksperimen dalam tiga dimensi
Mari lakukan eksperimen pikiran: Katakanlah kamu melempar koin ke udara, dan alih-alih membiarkannya jatuh ke tanah, kamu memiliki koordinasi untuk bertepuk tangan saat koin melewati antara tanganmu dan menjepit koin di antara telapak tanganmu. Sekarang, alih-alih koin berada kepala ke atas atau ke bawah, ia berada kepala ke kiri atau ke kanan.
Cek pemahamanmu
Baca pertanyaan di bawah, pikirkan jawabanmu, lalu klik segitiga untuk mengungkap solusinya.
Berapa probabilitas masing-masing hasil ini, kepala ke kiri atau kepala ke kanan?
Jawaban:
Probabilitasnya tetap akan 50-50. Seharusnya tidak masalah dimensi mana yang kita pilih untuk mengukur hasil lemparan koin.
Semoga kamu menjawab bahwa probabilitas mendapatkan kepala ke kiri atau ke kanan tetap 50-50. Dimensi di mana lemparan koin diukur seharusnya tidak mempengaruhi probabilitas hasil.
Tapi bagaimana tampilannya berbeda untuk koin kuantum kita? Mari kita cek.
Kita bisa membuat superposisi kuantum dengan cara yang sama seperti sebelumnya, dengan Hadamard Gate. Untuk mengukur "kepala ke kiri atau kanan" pada koin kuantum kita, kita bisa melakukan apa yang kita lakukan dengan koin klasik: mengukur sepanjang sumbu yang berbeda. Pengukuran standar kita pada komputer kuantum adalah sepanjang sumbu vertikal, seperti pengukuran "kepala ke atas atau ke bawah" biasa dari koin klasik. Tapi kita juga bisa menanyakan koin kuantum apakah ia berada kepala ke kiri atau ke kanan, atau secara setara, apakah ia berada dalam keadaan atau , yang menunjuk sepanjang sumbu . Sampler hanya mengambil sampel dalam basis pengukuran Z, tapi kita bisa menggunakan Estimator untuk memberikan nilai ekspektasi X. Nilai X adalah +1 dan -1 untuk keadaan atau , masing-masing.
Cek pemahamanmu
Baca pertanyaan di bawah, pikirkan jawabanmu, lalu klik segitiga untuk mengungkap solusinya.
Jika koin kuantum berperilaku seperti koin klasik dalam kasus ini, kita akan memiliki probabilitas 50-50 untuk mengukur keadaan berada di dan . Nilai ekspektasi X apa yang kita harapkan dikembalikan oleh Estimator, jika itu masalahnya?
Estimator, jika itu masalahnya?Jawaban:
Ketika kita menerapkan X pada keadaan , kita mendapatkan nilai +1 dan pada keadaan kita mendapatkan -1, jadi jika kita memiliki distribusi 50-50, kita akan mendapatkan nilai ekspektasi 0.
# Step 1: map problem
qcoin_lr = QuantumCircuit(1)
qcoin_lr.h(0)
obs = Pauli("X")
# Step 2: Transpile the circuit
pm = generate_preset_pass_manager(target=target, optimization_level=3)
qc_isa = pm.run(qcoin_lr)
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 = estimator_sim.run([[qc_isa,obs_isa]])
# res=job.result()
# Step 4: Return the result in classical form, and analyze.
print(res[0].data.evs)
0.9985207100591716
Nilai ekspektasi X untuk keadaan ini adalah 1. Jadi, tidak ada probabilitas 50-50 untuk mengukur dan .
Cek pemahamanmu
Baca pertanyaan di bawah, pikirkan jawabanmu, lalu klik segitiga untuk mengungkap solusinya.
Apa yang nilai ekspektasi ini katakan kepada kita tentang keadaan ? Berapa probabilitas pengukuran dan dalam basis X ini?
Jawaban:
Karena nilai ekspektasinya sama dengan nilai X untuk keadaan , itu berarti kita memiliki probabilitas 100% untuk mengukur keadaan ketika kita mengukur sepanjang X.
Ada apa di sini? Tampaknya koin kuantum kita bisa memiliki hasil acak dan probabilistik sepanjang satu dimensi, tapi hasil yang bisa diprediksi dengan sempurna sepanjang dimensi lainnya. Itu akan seperti melempar koin dan menjamin bahwa setiap kali ia ditangkap dengan menjepit di antara dua tangan, kepala akan selalu menghadap ke kanan.
Fase kuantum
Perbedaan utama koin kuantum adalah ia memiliki sifat lain yang tidak dimiliki koin klasik. Ingat bahwa dalam keadaan probabilistik klasik,
setiap koefisien hanyalah bilangan real positif yang merepresentasikan probabilitas mengukur keadaan tertentu. Dalam keadaan kuantum,
koefisiennya bersifat kompleks, sehingga mengandung bagian real dan bagian imajiner. Setiap koefisien bisa dinyatakan sebagai vektor dua dimensi pada bidang kompleks, dengan magnitudo dan sudut yang dibentuknya terhadap sumbu real:

Kita menyebut sebagai fase. Fase memberitahu kita bagaimana dua suku dalam keadaan kuantum akan berinterferensi, atau bagaimana keduanya akan saling menjumlahkan atau saling membatalkan seperti gelombang. Jika dua gelombang sefase satu sama lain, sehingga puncak dan lembahnya berimpit, maka keduanya akan bergabung membentuk gelombang yang dua kali lebih tinggi. Ini disebut interferensi konstruktif. Jika keduanya berbeda fase, artinya puncak satu berimpit dengan lembah yang lain, dan sebaliknya, maka keduanya berinterferensi secara destruktif dan saling menghilangkan sepenuhnya.
Seperti gelombang, keadaan kuantum juga bisa berjumlah secara konstruktif maupun destruktif. Ini kadang lebih sulit dilihat karena seringkali kita tidak berbicara tentang gelombang nyata di ruang fisik. Dalam kasus qubit kita, interferensi terjadi di ruang informasi abstrak qubit. Perlu juga dicatat bahwa karena hanya fase relatif antara dua gelombang yang menentukan cara interferensinya — yaitu, selisih fase dari dua koefisien — kita biasanya menerapkan fase global ke seluruh keadaan sehingga menjadi murni real dan fase relatif sepenuhnya tercermin dalam .
Untuk melihat bagaimana fase dapat menyebabkan interferensi pada koin kuantum kita, mari coba terapkan Hadamard dua kali berturut-turut alih-alih hanya sekali. Secara klasik, ini tidak masuk akal — jika menerapkan Hadamard setara dengan melempar koin, maka kamu tidak bisa melempar koin yang sudah berputar. Tapi mari lihat apa yang terjadi pada koin kuantum:
qcoin_0 = QuantumCircuit(1)
qcoin_0.h(0)
qcoin_0.h(0)
qcoin_0.measure_all()
qcoin_0.draw("mpl")
Sekarang, sebelum menggunakan Sampler untuk mengukur keadaan yang dihasilkan, mari pikirkan bagaimana qubit ini akan diubah oleh setiap Gate. Seperti biasa, qubit dimulai dari . Lalu, Hadamard pertama mengubah keadaan menjadi superposisi, seperti yang sudah kita lihat:
Dalam kasus ini, kedua koefisien sepenuhnya real dan positif, artinya fasenya adalah .
Hadamard kedua kemudian diterapkan ke setiap bagian dari keadaan superposisi secara terpisah. Kita sudah tahu bagaimana Hadamard mengubah keadaan . Tapi bagaimana dengan ?
Ini juga merupakan superposisi setara antara 0 dan 1, mirip dengan melempar koin, tetapi koefisien keadaan ini di depan memiliki fase yang memberikan tanda negatif.
Cek pemahamanmu
Baca pertanyaan di bawah, pikirkan jawabanmu, lalu klik segitiga untuk melihat solusinya.
Hitung keadaan yang dihasilkan setelah menerapkan Hadamard kedua. Yaitu, hitung: . Perhatikan bahwa bersifat distributif, sehingga kita bisa menerapkannya ke setiap suku secara terpisah.
Jawaban:
Sekarang mari verifikasi prediksi kita dengan Sampler.
## Transpile
target = backend.target
pm = generate_preset_pass_manager(target=target, optimization_level=3)
qc_isa = pm.run(qcoin_0)
## Execute
# On real hardware:
sampler = Sampler(mode=backend)
pubs = [qc_isa]
job = sampler.run(pubs, shots=1000)
res = job.result()
counts = res[0].data.meas.get_counts()
# or with Aer simulator with noise model from real backend
# job = sampler_sim.run([qc_isa])
# counts=job.result()[0].data.meas.get_counts()
## Analyze
plot_histogram(counts)
Hadamard kedua telah membatalkan yang pertama, dan kita kembali ke keadaan 0 seperti semula! Ini karena Hadamard mengubah keadaan dan ke keadaan yang serupa, tetapi dengan fase yang berlawanan. Setelah Hadamard kedua, kita melihat bahwa suku berinterferensi secara konstruktif, tetapi suku berinterferensi secara destruktif dan saling menghilangkan.
Mari kita jelajahi lebih lanjut: kita bisa mengubah fase menggunakan Gate "PHASE". Sekarang mari terapkan Hadamard untuk membuat superposisi, terapkan pergeseran fase sebesar radian, lalu terapkan Hadamard kedua:
qcoin_pi = QuantumCircuit(1)
qcoin_pi.h(0)
qcoin_pi.p(np.pi, 0)
qcoin_pi.h(0)
qcoin_pi.measure_all()
qcoin_pi.draw("mpl")
## Transpile
target = backend.target
pm = generate_preset_pass_manager(target=target, optimization_level=3)
qc_isa = pm.run(qcoin_pi)
## Execute
# On real hardware:
sampler = Sampler(mode=backend)
pubs = [qc_isa]
job = sampler.run(pubs, shots=1000)
res = job.result()
counts = res[0].data.meas.get_counts()
# or with Aer simulator with noise model from real backend
# job = sampler_sim.run([qc_isa])
# counts=job.result()[0].data.meas.get_counts()
## Analyze
plot_histogram(counts)
Dan sekarang qubit diukur berada di keadaan 1, bukan 0.
Jadi, bahkan dari beberapa eksperimen sederhana ini, kamu sudah bisa melihat perbedaan drastis yang bisa ditimbulkan fase ini pada Circuit kuantum. Efeknya bisa halus dan sulit dilihat pada awalnya. Dalam eksperimen pertama kita, di mana kita sekadar melempar koin kuantum dengan Gate Hadamard dan mengukur hasil lemparan, tidak ada efek fase yang terlihat. Baru ketika kita menggali lebih dalam kita menemukan perbedaan yang bisa ditimbulkan fase. Fase bisa menyebabkan Gate kuantum yang sama memiliki efek yang secara harfiah berlawanan pada sebuah qubit.
Coba sendiri:
Edit sel kode di bawah untuk mengubah fase sehingga Hadamard kedua menciptakan keadaan superposisi dengan probabilitas 25% dan 75% untuk menemukan keadaan di dan