Ketaksamaan CHSH
Anggaran penggunaan: Dua minit pada pemproses Heron r2 (NOTA: Ini adalah anggaran sahaja. Masa jalan sebenar mungkin berbeza.)
Latar belakangβ
Dalam tutorial ini, kamu akan menjalankan eksperimen pada komputer kuantum untuk menunjukkan pelanggaran ketaksamaan CHSH menggunakan primitif Estimator.
Ketaksamaan CHSH, dinamakan sempena pengarang-pengarangnya Clauser, Horne, Shimony, dan Holt, digunakan untuk membuktikan teorem Bell secara eksperimental (1969). Teorem ini menyatakan bahawa teori pembolehubah tersembunyi setempat tidak dapat menjelaskan beberapa kesan keterjaitan dalam mekanik kuantum. Pelanggaran ketaksamaan CHSH digunakan untuk menunjukkan bahawa mekanik kuantum tidak serasi dengan teori pembolehubah tersembunyi setempat. Ini adalah eksperimen penting untuk memahami asas mekanik kuantum.
Hadiah Nobel Fizik 2022 telah dianugerahkan kepada Alain Aspect, John Clauser dan Anton Zeilinger sebahagiannya atas kerja perintis mereka dalam sains maklumat kuantum, khususnya eksperimen mereka dengan foton yang terjalin yang menunjukkan pelanggaran ketaksamaan Bell.
Keperluanβ
Sebelum memulakan tutorial ini, pastikan kamu telah memasang yang berikut:
- Qiskit SDK v1.0 atau lebih baru, dengan sokongan visualisasi
- Qiskit Runtime (
pip install qiskit-ibm-runtime) v0.22 atau lebih baru
Persediaanβ
# Added by doQumentation β required packages for this notebook
!pip install -q matplotlib numpy qiskit qiskit-ibm-runtime
# General
import numpy as np
# Qiskit imports
from qiskit import QuantumCircuit
from qiskit.circuit import Parameter
from qiskit.quantum_info import SparsePauliOp
from qiskit.transpiler.preset_passmanagers import generate_preset_pass_manager
# Qiskit Runtime imports
from qiskit_ibm_runtime import QiskitRuntimeService
from qiskit_ibm_runtime import EstimatorV2 as Estimator
# Plotting routines
import matplotlib.pyplot as plt
import matplotlib.ticker as tck
Langkah 1: Petakan input klasik kepada masalah kuantumβ
Untuk eksperimen ini, kita akan mencipta pasangan terjalin di mana kita mengukur setiap Qubit pada dua asas yang berbeza. Kita akan melabelkan asas untuk Qubit pertama sebagai dan serta asas untuk Qubit kedua sebagai dan . Ini membolehkan kita mengira kuantiti CHSH :
Setiap nilai boleh jadi atau . Jelas sekali, salah satu daripada sebutan mesti , dan yang satu lagi mesti . Oleh itu, . Nilai purata mesti memenuhi ketaksamaan:
Mengembangkan dalam sebutan , , , dan menghasilkan:
Kamu boleh mentakrifkan kuantiti CHSH lain :
Ini membawa kepada ketaksamaan lain:
Jika mekanik kuantum boleh diterangkan oleh teori pembolehubah tersembunyi setempat, ketaksamaan sebelumnya mesti benar. Namun, seperti yang ditunjukkan dalam tutorial ini, ketaksamaan-ketaksamaan ini boleh dilanggar dalam komputer kuantum. Oleh itu, mekanik kuantum tidak serasi dengan teori pembolehubah tersembunyi setempat.
Kalau kamu nak belajar lebih banyak teori, terokai Keterjaitan dalam Tindakan bersama John Watrous.
Kamu akan mencipta pasangan terjalin antara dua Qubit dalam komputer kuantum dengan mewujudkan keadaan Bell . Menggunakan primitif Estimator, kamu boleh mendapatkan nilai jangkaan yang diperlukan (, dan ) secara terus untuk mengira nilai jangkaan dua kuantiti CHSH dan . Sebelum diperkenalkannya primitif Estimator, kamu perlu membina nilai jangkaan daripada hasil ukuran.
Kamu akan mengukur Qubit kedua dalam asas dan . Qubit pertama juga akan diukur dalam asas ortogon, tetapi dengan sudut terhadap Qubit kedua, yang akan kita sapu antara dan . Seperti yang akan kamu lihat, primitif Estimator memudahkan pelaksanaan Circuit berparameter. Daripada mencipta siri Circuit CHSH, kamu hanya perlu mencipta satu Circuit CHSH dengan parameter yang menentukan sudut ukuran dan siri nilai fasa untuk parameter tersebut.
Akhirnya, kamu akan menganalisis hasil dan memplotnya berbanding sudut ukuran. Kamu akan nampak bahawa untuk julat sudut ukuran tertentu, nilai jangkaan kuantiti CHSH atau , yang menunjukkan pelanggaran ketaksamaan CHSH.
# To run on hardware, select the backend with the fewest number of jobs in the queue
service = QiskitRuntimeService()
backend = service.least_busy(
operational=True, simulator=False, min_num_qubits=127
)
backend.name
'ibm_kingston'
Cipta Circuit CHSH berparameterβ
Pertama, kita tulis Circuit dengan parameter , yang kita panggil theta. Primitif Estimator boleh memudahkan pembinaan Circuit dan analisis output dengan besar dengan menyediakan nilai jangkaan boleh ukur secara terus. Banyak masalah yang menarik, terutamanya untuk aplikasi jangka pendek pada sistem bising, boleh diformulasikan dalam sebutan nilai jangkaan. Primitif Estimator (V2) boleh menukar asas ukuran secara automatik berdasarkan boleh ukur yang diberikan.
theta = Parameter("$\\theta$")
chsh_circuit = QuantumCircuit(2)
chsh_circuit.h(0)
chsh_circuit.cx(0, 1)
chsh_circuit.ry(theta, 0)
chsh_circuit.draw(output="mpl", idle_wires=False, style="iqp")
Cipta senarai nilai fasa untuk ditetapkan kemudianβ
Selepas mencipta Circuit CHSH berparameter, kamu akan mencipta senarai nilai fasa untuk ditetapkan pada Circuit dalam langkah seterusnya. Kamu boleh menggunakan kod berikut untuk mencipta senarai 21 nilai fasa yang merentangi hingga dengan jarak yang sama, iaitu , , , ..., , .
number_of_phases = 21
phases = np.linspace(0, 2 * np.pi, number_of_phases)
# Phases need to be expressed as list of lists in order to work
individual_phases = [[ph] for ph in phases]
Boleh Ukurβ
Sekarang kita perlukan boleh ukur untuk mengira nilai jangkaan. Dalam kes kita, kita melihat asas ortogon bagi setiap Qubit, membiarkan putaran berparameter bagi Qubit pertama menyapu asas ukuran hampir berterusan berbanding asas Qubit kedua. Oleh itu, kita akan memilih boleh ukur , , , dan .
# <CHSH1> = <AB> - <Ab> + <aB> + <ab> -> <ZZ> - <ZX> + <XZ> + <XX>
observable1 = SparsePauliOp.from_list(
[("ZZ", 1), ("ZX", -1), ("XZ", 1), ("XX", 1)]
)
# <CHSH2> = <AB> + <Ab> - <aB> + <ab> -> <ZZ> + <ZX> - <XZ> + <XX>
observable2 = SparsePauliOp.from_list(
[("ZZ", 1), ("ZX", 1), ("XZ", -1), ("XX", 1)]
)
Langkah 2: Optimumkan masalah untuk pelaksanaan perkakasan kuantumβ
Untuk mengurangkan jumlah masa pelaksanaan kerja, primitif V2 hanya menerima Circuit dan boleh ukur yang mematuhi arahan dan ketersambungan yang disokong oleh sistem sasaran (dirujuk sebagai Circuit dan boleh ukur ISA, iaitu instruction set architecture).
Circuit ISAβ
target = backend.target
pm = generate_preset_pass_manager(target=target, optimization_level=3)
chsh_isa_circuit = pm.run(chsh_circuit)
chsh_isa_circuit.draw(output="mpl", idle_wires=False, style="iqp")
Boleh Ukur ISAβ
Begitu juga, kita perlu mengubah boleh ukur supaya serasi dengan Backend sebelum menjalankan kerja dengan Runtime Estimator V2. Kita boleh melakukan transformasi menggunakan kaedah apply_layout pada objek SparsePauliOp.
isa_observable1 = observable1.apply_layout(layout=chsh_isa_circuit.layout)
isa_observable2 = observable2.apply_layout(layout=chsh_isa_circuit.layout)
Langkah 3: Laksanakan menggunakan primitif Qiskitβ
Untuk melaksanakan keseluruhan eksperimen dalam satu panggilan kepada Estimator.
Kita boleh mencipta primitif Qiskit Runtime Estimator untuk mengira nilai jangkaan kita. Kaedah EstimatorV2.run() mengambil iterable bagi primitive unified blocs (PUB). Setiap PUB adalah iterable dalam format (circuit, observables, parameter_values: Optional, precision: Optional).
# To run on a local simulator:
# Use the StatevectorEstimator from qiskit.primitives instead.
estimator = Estimator(mode=backend)
pub = (
chsh_isa_circuit, # ISA circuit
[[isa_observable1], [isa_observable2]], # ISA Observables
individual_phases, # Parameter values
)
job_result = estimator.run(pubs=[pub]).result()
Langkah 4: Proses pasca dan kembalikan hasil dalam format klasik yang dikehendakiβ
Estimator memulangkan nilai jangkaan bagi kedua-dua boleh ukur, dan .
chsh1_est = job_result[0].data.evs[0]
chsh2_est = job_result[0].data.evs[1]
fig, ax = plt.subplots(figsize=(10, 6))
# results from hardware
ax.plot(phases / np.pi, chsh1_est, "o-", label="CHSH1", zorder=3)
ax.plot(phases / np.pi, chsh2_est, "o-", label="CHSH2", zorder=3)
# classical bound +-2
ax.axhline(y=2, color="0.9", linestyle="--")
ax.axhline(y=-2, color="0.9", linestyle="--")
# quantum bound, +-2β2
ax.axhline(y=np.sqrt(2) * 2, color="0.9", linestyle="-.")
ax.axhline(y=-np.sqrt(2) * 2, color="0.9", linestyle="-.")
ax.fill_between(phases / np.pi, 2, 2 * np.sqrt(2), color="0.6", alpha=0.7)
ax.fill_between(phases / np.pi, -2, -2 * np.sqrt(2), color="0.6", alpha=0.7)
# set x tick labels to the unit of pi
ax.xaxis.set_major_formatter(tck.FormatStrFormatter("%g $\\pi$"))
ax.xaxis.set_major_locator(tck.MultipleLocator(base=0.5))
# set labels, and legend
plt.xlabel("Theta")
plt.ylabel("CHSH witness")
plt.legend()
plt.show()
Dalam rajah itu, garis dan kawasan kelabu mengehadkan sempadan; garis paling luar (titik-bergaris) mengehadkan sempadan kuantum (), manakala garis dalam (bergaris) mengehadkan sempadan klasik (). Kamu boleh nampak ada kawasan di mana kuantiti saksi CHSH melebihi sempadan klasik. Tahniah! Kamu berjaya menunjukkan pelanggaran ketaksamaan CHSH dalam sistem kuantum sebenar!
Kaji selidik tutorialβ
Sila ambil kaji selidik ringkas ini untuk memberikan maklum balas tentang tutorial ini. Pandangan kamu akan membantu kami memperbaiki kandungan dan pengalaman pengguna kami.
Note: This survey is provided by IBM Quantum and relates to the original English content. To give feedback on doQumentation's website, translations, or code execution, please open a GitHub issue.