Wang Kuantum — modul tentang superposisi dan interferens
Untuk modul Qiskit in Classrooms ini, pelajar perlu mempunyai persekitaran Python yang berfungsi dengan pakej-pakej berikut dipasang:
qiskitv2.1.0 atau lebih baharuqiskit-ibm-runtimev0.40.1 atau lebih baharuqiskit-aerv0.17.0 atau lebih baharuqiskit.visualizationnumpypylatexenc
Untuk menyediakan dan memasang pakej-pakej di atas, lihat panduan Pasang Qiskit. Untuk menjalankan kerja pada komputer kuantum sebenar, pelajar perlu menyediakan akaun dengan IBM Quantum® dengan mengikuti langkah-langkah dalam panduan Sediakan akaun IBM Cloud anda.
Modul ini telah diuji dan menggunakan 47 saat masa QPU. Ini adalah anggaran sahaja. Penggunaan sebenar anda mungkin berbeza.
# 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 panduan modul oleh Dr. Katie McCormick di bawah, atau klik di sini untuk menonton di YouTube.
Pengenalan
Dalam modul ini, kita akan meneroka salah satu prinsip teras yang menjadi jantung teori kuantum: superposisi. Dalam pengalaman harian kita, objek sentiasa mempunyai ciri-ciri yang pasti. Lokasi, saiz, bentuk, warna mereka — segala-galanya tentang mereka — sudah ditentukan dan pasti, walaupun kita sebagai pemerhati belum lagi mengukurnya. Dalam dunia kuantum, ini tidak semestinya berlaku. Sebuah objek kuantum boleh berada dalam sesuatu yang dipanggil "superposisi" daripada beberapa keadaan yang dibenarkan secara klasik. Apabila superposisi diukur, ia akan secara rawak "runtuh" ke salah satu daripada keadaan-keadaan tersebut.
Dalam beberapa cara, mengukur keadaan superposisi adalah seperti melambung duit syiling: tidak ada cara untuk mengetahui terlebih dahulu ke mana ia akan jatuh. Ketakpastian asas ini adalah aspek mekanik kuantum yang tidak selesa, yang bahkan Einstein pun sukar menerimanya. Beliau terkenal dengan kata-katanya, "Tuhan tidak bermain dadu" tentang kerawakan ini. Tetapi, seperti yang akan kita lihat, Tuhan sebenarnya memang bermain dadu — dan melambung duit syiling.
Kita akan memikirkan lambungan duit syiling klasik sebagai analogi kepada pengukuran keadaan superposisi. Dan — dengan bermain dengan "duit syiling kuantum" menggunakan Qiskit dan sebuah qubit pada pemproses kuantum IBM® — kita akan segera menemui had analogi tersebut.
Duit syiling klasik
Mari mulakan dengan duit syiling klasik. Lambungkan duit syiling, dan ia akan jatuh sama ada muka ke atas atau muka ke bawah, dengan peluang 50% bagi setiap satu. Walaupun secara teori, seseorang boleh mengira ke sisi mana duit syiling akan jatuh jika mereka mengetahui keadaan awal duit syiling dan daya/tork lambungan dengan tepat, namun secara praktikalnya, tidak ada cara untuk mengetahui terlebih dahulu ke sisi mana duit syiling akan jatuh. Itulah sebabnya kita menggunakan lambungan duit syiling sebagai contoh kanonial bagi keadaan probabilistik klasik, di mana hasilnya pada dasarnya rawak. Kita boleh menulis keadaan duit syiling sebelum ia jatuh untuk mencerminkan kebarangkalian 50/50 ini:
Di sini, dua sebutan itu mewakili dua kemungkinan hasil lambungan, dan pekali mereka mewakili kebarangkalian bagi setiap hasil tersebut. Perlu diambil perhatian bahawa lazimnya, "" (dikenali sebagai "ket") digunakan untuk mewakili keadaan kuantum, tetapi di sini, kita bercakap tentang keadaan probabilistik klasik. Lihat Pelajaran 1: Sistem Tunggal dalam kursus Asas Maklumat Kuantum untuk mengetahui lebih lanjut tentang cara kita mewakili maklumat klasik dan kuantum.
Jika kita melambung duit syiling 1000 kali dan merekodkan bilangan muka ke atas dan ke bawah, kita akan mendapat 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()
Duit syiling kuantum
Kita boleh mencipta keadaan probabilistik yang serupa menggunakan qubit pada komputer kuantum kita. Seperti lambungan duit syiling, sebuah qubit juga boleh diukur dalam dua keadaan yang mungkin: dan . Kita mencipta keadaan probabilistik "superposisi" dengan bermula dalam keadaan , kemudian menerapkan sesuatu yang dipanggil Hadamard Gate pada qubit. Ini meletakkannya dalam superposisi yang sama antara dan . Perlu diambil perhatian bahawa walaupun keadaan superposisi ini mungkin kelihatan dan berkelakuan seperti duit syiling pada pandangan pertama, kita akan segera mendapati bahawa ia jauh lebih daripada itu. Tujuan modul ini adalah untuk menunjukkan kepada anda bahawa superposisi tidak sama dengan lambungan duit syiling klasik.
Jadi, memandangkan qubit berada dalam superposisi yang sama antara 0 dan 1, apabila kita mengukur qubit, akan ada peluang 50% kita mengukur , dan peluang 50% kita mengukur . Kita menulis keadaan ini sedikit berbeza daripada kes probabilistik klasik, atas sebab-sebab yang akan menjadi jelas kemudian:
Di sini, kebarangkalian mengukur setiap satu daripada dua keadaan tersebut tidak lagi sama dengan pekali, seperti yang berlaku dalam keadaan probabilistik klasik di atas. Sebaliknya, kuasa dua pekali itulah yang memberikan kita kebarangkalian, dan setiap pekali ini kini boleh menjadi kompleks, bermakna ia boleh mempunyai bahagian nyata dan khayalan.
Walaupun terdapat perbezaan-perbezaan ini, hasil pengukuran keadaan ini pada asasnya sama dengan melambung duit syiling.
from qiskit import QuantumCircuit
qcoin = QuantumCircuit(1)
qcoin.h(0)
qcoin.measure_all()
qcoin.draw("mpl")
Jadi, pada dasarnya, menerapkan Hadamard Gate adalah analogi kepada melambung duit syiling. Dan sama seperti kita melambung duit syiling 1000 kali untuk melihat statistik duit syiling mendarat muka ke atas atau ke bawah, kita boleh melakukan sesuatu yang serupa pada Qiskit dengan "duit syiling kuantum" kita. Kita boleh menggunakan primitif Qiskit yang dipanggil Sampler, yang akan mengulangi litar beberapa kali untuk mengambil sampel statistik keadaan yang terhasil.
Pertama, kita muatkan perkhidmatan dan primitif Qiskit Runtime, kemudian kita pilih Backend untuk menjalankan litar tersebut.
Terdapat kod di bawah untuk menyimpan kelayakan anda pada kali pertama digunakan. Pastikan anda memadamkan maklumat ini daripada buku nota setelah menyimpannya ke persekitaran anda, supaya kelayakan anda tidak terdedah secara tidak sengaja apabila anda berkongsi buku nota. Lihat Sediakan akaun IBM Cloud anda dan Inisialisasi perkhidmatan dalam persekitaran tidak dipercayai untuk panduan 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 anda tidak lagi mempunyai masa yang tersedia pada akaun anda, anda juga boleh memilih untuk menjalankannya pada simulator. Hanya nyahkomen kod dan jalankan sel di bawah untuk berbuat demikian:
## 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 litar di atas, kita mempunyai sesuatu yang kelihatan pada dasarnya sama dengan histogram duit syiling klasik, dengan sedikit turun naik statistik.
Selain mengambil sampel statistik duit syiling kuantum, kita juga boleh menggunakan primitif Qiskit lain yang dipanggil Estimator untuk mengukur apa yang dikenali sebagai nilai jangkaan bagi sebuah boleh cerapan keadaan tersebut. Untuk menggambarkan apakah nilai jangkaan ini, mari gunakan duit syiling klasik sebagai contoh. Katakan anda menggunakan duit syiling untuk berjudi: setiap kali anda melambung duit syiling dan ia mendarat "muka ke atas," anda menang satu dolar. Tetapi setiap kali ia mendarat "muka ke bawah," anda kalah satu dolar. Jika anda ingin mengetahui berapa banyak wang yang anda jangkakan akan dapat setiap lambungan (nilai jangkaan bagi boleh cerapan "wang"), maka anda akan mengira:
Memandangkan anda sama berkemungkinan untuk menang satu dolar atau kalah satu dolar, nilai jangkaannya adalah $0.
Begitu juga, dengan keadaan kuantum, kita boleh mengira nilai jangkaan bagi boleh cerapan "Z", di mana Z adalah matriks Pauli dengan nilai +1 dan -1 yang dikaitkan 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 mendapat nilai jangkaan sebesar 0, seperti yang dijangkakan (hah). Ini adalah satu lagi cara untuk mengesahkan bahawa memang terdapat kebarangkalian yang sama untuk mengukur 0 dan 1, dan kelihatan berkelakuan seperti lambungan duit syiling.
Pada ketika ini, "duit syiling kuantum" kelihatan persis sama seperti duit syiling klasik. Tetapi dalam bahagian seterusnya, kita akan menjalankan beberapa eksperimen yang akan mendedahkan perbezaan asas antara keduanya.
Kuantum terdedah: eksperimen dalam tiga dimensi
Mari buat eksperimen pemikiran: Katakan anda melambung duit syiling ke udara, dan daripada membiarkannya jatuh ke tanah, anda mempunyai koordinasi untuk bertepuk tangan semasa ia melintas di antara tangan anda dan menjepit duit syiling di antara tapak tangan anda. Kini, bukannya duit syiling menjadi sama ada muka ke atas atau ke bawah, ia menjadi muka ke kiri atau ke kanan.
Uji kefahaman anda
Baca soalan di bawah, fikirkan jawapan anda, kemudian klik segitiga untuk mendedahkan penyelesaiannya.
Berapakah kebarangkalian bagi setiap hasil ini, muka ke kiri atau muka ke kanan?
Jawapan:
Kebarangkaliannya masih akan menjadi 50-50. Dimensi mana yang kita pilih untuk mengukur hasil lambungan duit syiling tidak sepatutnya mempengaruhinya.
Diharapkan anda menjawab bahawa kebarangkalian mendapati muka ke kiri atau ke kanan masih 50-50. Dimensi di mana lambungan duit syiling diukur tidak sepatutnya mempengaruhi kebarangkalian hasilnya.
Tetapi bagaimana pula keadaannya berbeza untuk duit syiling kuantum kita? Mari kita semak.
Kita boleh menjadikan superposisi kuantum kita dengan cara yang sama seperti yang kita lakukan sebelum ini, dengan Hadamard Gate. Untuk mengukur "muka ke kiri atau ke kanan" pada duit syiling kuantum kita, kita boleh melakukan apa yang kita lakukan dengan duit syiling klasik: ukur sepanjang paksi yang berbeza. Pengukuran standard kita pada komputer kuantum adalah sepanjang paksi menegak, sama seperti pengukuran biasa "muka ke atas atau ke bawah" pada duit syiling klasik. Tetapi kita juga boleh bertanya kepada duit syiling kuantum kita sama ada ia muka ke kiri atau ke kanan, atau secara setara, sama ada ia berada dalam keadaan atau , yang menghala sepanjang paksi . Sampler hanya mengambil sampel dalam asas pengukuran Z, tetapi kita boleh menggunakan Estimator untuk memberikan kita nilai jangkaan bagi X. Nilai X adalah +1 dan -1 untuk keadaan atau , masing-masing.
Uji kefahaman anda
Baca soalan di bawah, fikirkan jawapan anda, kemudian klik segitiga untuk mendedahkan penyelesaiannya.
Jika duit syiling kuantum berkelakuan seperti duit syiling klasik dalam kes ini, kita akan mempunyai kebarangkalian 50-50 untuk mengukur keadaan berada dalam dan . Apakah nilai jangkaan X yang kita jangkakan Estimator akan kembalikan, jika ini adalah kasusnya?
Estimator akan kembalikan, jika ini adalah kasusnya?Jawapan:
Apabila kita menerapkan X pada keadaan , kita mendapat nilai +1 dan pada keadaan kita mendapat -1, jadi jika kita mempunyai taburan 50-50, kita akan mendapat nilai jangkaan sebesar 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 jangkaan X bagi keadaan ini adalah 1. Jadi, bukan kebarangkalian 50-50 untuk mengukur dan .
Uji kefahaman anda
Baca soalan di bawah, fikirkan jawapan anda, kemudian klik segitiga untuk mendedahkan penyelesaiannya.
Apakah yang nilai jangkaan ini beritahu kita tentang keadaan ? Berapakah kebarangkalian mengukur dan dalam asas X ini?
Jawapan:
Memandangkan nilai jangkaan adalah sama dengan nilai X untuk keadaan , itu bermakna kita mempunyai kebarangkalian 100% untuk mengukur keadaan apabila kita mengukur sepanjang X.
Apa yang berlaku di sini? Nampaknya duit syiling kuantum kita boleh mempunyai hasil rawak dan probabilistik sepanjang satu dimensi, tetapi hasil yang boleh diramal dengan sempurna sepanjang dimensi yang lain. Itu seperti melambung duit syiling dan menjamin bahawa setiap kali ia ditangkap dengan menjepit di antara dua tangan, ia akan berakhir dengan muka menghadap ke kanan.
Fasa kuantum
Perbezaan utama duit syiling kuantum adalah bahawa ia mempunyai satu kualiti lain yang tidak dimiliki oleh duit syiling klasik. Ingat bahawa dalam keadaan probabilistik klasik,
setiap pekali hanyalah nombor nyata positif yang mewakili kebarangkalian mengukur keadaan tertentu. Dalam keadaan kuantum,
pekali-pekailinya adalah kompleks, jadi ia mengandungi bahagian nyata dan khayalan. Setiap pekali boleh dinyatakan sebagai vektor dua dimensi pada satah kompleks, dengan magnitud dan sudut yang dibuatnya dengan paksi nyata:

Kita memanggil sebagai fasa. Fasa memberitahu kita bagaimana dua sebutan dalam keadaan kuantum akan berinterferens, atau bagaimana ia akan menambah atau membatalkan seperti gelombang. Jika dua gelombang berada dalam fasa yang sama antara satu sama lain, supaya puncak dan lembah mereka selari, maka mereka akan bergabung untuk membentuk gelombang yang dua kali lebih tinggi. Kita panggil ini interferens membina. Jika mereka berada di luar fasa, bermakna puncak dari satu selari dengan lembah dari yang lain, dan sebaliknya, mereka berinterferens secara memusnah dan saling membatalkan sepenuhnya.
Seperti gelombang, keadaan kuantum juga boleh menambah secara membina atau memusnah. Ia mungkin lebih sukar untuk dilihat kerana selalunya, kita tidak bercakap tentang gelombang sebenar dalam ruang fizikal. Dalam kes qubit kita, interferens berlaku dalam ruang maklumat abstrak qubit. Perlu diambil perhatian juga bahawa kerana hanya fasa relatif antara dua gelombang yang penting untuk cara mereka akan berinterferens — iaitu, perbezaan fasa bagi kedua-dua pekali — kita lazimnya menerapkan fasa global sebesar pada keseluruhan keadaan supaya adalah nyata sepenuhnya dan fasa relatif ditangkap sepenuhnya dalam .
Untuk melihat bagaimana fasa boleh menyebabkan interferens dalam duit syiling kuantum kita, mari cuba menerapkan Hadamard dua kali dan bukannya sekali sahaja. Secara klasik, ini tidak akan masuk akal — jika menerapkan Hadamard setara dengan melambung duit syiling, maka anda tidak boleh melambung duit syiling yang sudah sedang dilambung. Tetapi mari lihat apa yang berlaku pada duit syiling kuantum:
qcoin_0 = QuantumCircuit(1)
qcoin_0.h(0)
qcoin_0.h(0)
qcoin_0.measure_all()
qcoin_0.draw("mpl")
Kini, sebelum kita menggunakan Sampler untuk mengukur keadaan yang terhasil, mari fikirkan bagaimana qubit ini akan diubah oleh setiap gate. Ia bermula, seperti biasa, dalam . Kemudian, Hadamard pertama mengubah keadaan kepada superposisi, seperti yang telah kita lihat:
Dalam kes ini, kedua-dua pekali adalah nyata dan positif sepenuhnya, bermakna fasanya adalah .
Hadamard kedua kemudiannya diterapkan kepada setiap bahagian keadaan superposisi secara berasingan. Kita sudah tahu bagaimana Hadamard mengubah keadaan . Tetapi bagaimana pula dengan ?
Ini adalah, sekali lagi, superposisi yang sama antara 0 dan 1, serupa dengan melambung duit syiling, tetapi pekali keadaan ini di hadapan mempunyai fasa sebesar untuk memberikannya tanda negatif.
Uji kefahaman anda
Baca soalan di bawah, fikirkan jawapan anda, kemudian klik segitiga untuk mendedahkan penyelesaiannya.