ข้ามไปยังเนื้อหาหลัก

อสมการ CHSH

ประมาณการการใช้งาน: สองนาทีบนโปรเซสเซอร์ Heron r2 (หมายเหตุ: นี่เป็นเพียงการประมาณการ ระยะเวลาจริงอาจแตกต่างกัน)

พื้นหลัง

ในบทแนะนำนี้ คุณจะรันการทดลองบนคอมพิวเตอร์ควอนตัมเพื่อแสดงให้เห็นการละเมิดอสมการ CHSH ด้วย Estimator primitive

อสมการ CHSH ซึ่งตั้งชื่อตามผู้เขียน Clauser, Horne, Shimony และ Holt ถูกใช้เพื่อพิสูจน์ทฤษฎีบทของเบลล์เชิงทดลอง (ค.ศ. 1969) ทฤษฎีบทนี้ยืนยันว่าทฤษฎีตัวแปรซ่อนเร้นเฉพาะที่ไม่สามารถอธิบายผลที่ตามมาบางประการของการพัวพันในกลศาสตร์ควอนตัมได้ การละเมิดอสมการ CHSH ถูกใช้เพื่อแสดงว่ากลศาสตร์ควอนตัมนั้นไม่สอดคล้องกับทฤษฎีตัวแปรซ่อนเร้นเฉพาะที่ นี่เป็นการทดลองที่สำคัญในการทำความเข้าใจรากฐานของกลศาสตร์ควอนตัม

รางวัลโนเบลสาขาฟิสิกส์ปี 2022 มอบให้แก่ Alain Aspect, John Clauser และ Anton Zeilinger ส่วนหนึ่งเนื่องจากผลงานบุกเบิกของพวกเขาในสาขาวิทยาศาสตร์สารสนเทศควอนตัม และโดยเฉพาะอย่างยิ่งสำหรับการทดลองด้วยโฟตอนที่พัวพันกันซึ่งแสดงให้เห็นการละเมิดอสมการของเบลล์

ข้อกำหนดเบื้องต้น

ก่อนเริ่มบทแนะนำนี้ ตรวจสอบให้แน่ใจว่าคุณได้ติดตั้งสิ่งต่อไปนี้แล้ว:

  • Qiskit SDK v1.0 หรือใหม่กว่า พร้อมรองรับ visualization
  • Qiskit Runtime (pip install qiskit-ibm-runtime) v0.22 หรือใหม่กว่า

ตั้งค่า

# 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

ขั้นตอนที่ 1: แปลงอินพุตแบบคลาสสิกเป็นปัญหาควอนตัม

สำหรับการทดลองนี้ เราจะสร้างคู่ที่พัวพันกันซึ่งเราวัด Qubit แต่ละตัวบนสองฐานที่แตกต่างกัน เราจะกำหนดชื่อฐานสำหรับ Qubit แรกว่า AA และ aa และฐานสำหรับ Qubit ที่สองว่า BB และ bb ซึ่งช่วยให้เราคำนวณปริมาณ CHSH S1S_1 ได้:

S1=A(Bb)+a(B+b).S_1 = A(B-b) + a(B+b).

Observable แต่ละตัวมีค่าเป็น +1+1 หรือ 1-1 เห็นได้ชัดว่าหนึ่งในเทอม B±bB\pm b ต้องเป็น 00 และอีกเทอมต้องเป็น ±2\pm 2 ดังนั้น S1=±2S_1 = \pm 2 ค่าเฉลี่ยของ S1S_1 ต้องเป็นไปตามอสมการ:

S12.|\langle S_1 \rangle|\leq 2.

การกระจาย S1S_1 ในรูปของ AA, aa, BB, และ bb ให้ผลลัพธ์:

S1=ABAb+aB+ab2|\langle S_1 \rangle| = |\langle AB \rangle - \langle Ab \rangle + \langle aB \rangle + \langle ab \rangle| \leq 2

คุณสามารถกำหนดปริมาณ CHSH อีกค่าหนึ่งคือ S2S_2:

S2=A(B+b)a(Bb),S_2 = A(B+b) - a(B-b),

ซึ่งนำไปสู่อสมการอีกข้อหนึ่ง:

S2=AB+AbaB+ab2|\langle S_2 \rangle| = |\langle AB \rangle + \langle Ab \rangle - \langle aB \rangle + \langle ab \rangle| \leq 2

หากกลศาสตร์ควอนตัมสามารถอธิบายได้ด้วยทฤษฎีตัวแปรซ่อนเร้นเฉพาะที่ อสมการข้างต้นจะต้องเป็นจริง อย่างไรก็ตาม ดังที่แสดงให้เห็นในบทแนะนำนี้ อสมการเหล่านี้สามารถถูกละเมิดได้ในคอมพิวเตอร์ควอนตัม ดังนั้นกลศาสตร์ควอนตัมจึงไม่สอดคล้องกับทฤษฎีตัวแปรซ่อนเร้นเฉพาะที่ หากต้องการศึกษาทฤษฎีเพิ่มเติม ลองสำรวจ Entanglement in Action กับ John Watrous คุณจะสร้างคู่ที่พัวพันกันระหว่าง Qubit สองตัวในคอมพิวเตอร์ควอนตัมโดยการสร้างสถานะเบลล์ Φ+=00+112|\Phi^+\rangle = \frac{|00\rangle + |11\rangle}{\sqrt{2}} การใช้ Estimator primitive ช่วยให้คุณได้ค่าความคาดหวังที่ต้องการโดยตรง (AB,Ab,aB\langle AB \rangle, \langle Ab \rangle, \langle aB \rangle และ ab\langle ab \rangle) เพื่อคำนวณค่าความคาดหวังของปริมาณ CHSH ทั้งสอง S1\langle S_1\rangle และ S2\langle S_2\rangle ก่อนการแนะนำ Estimator primitive คุณต้องสร้างค่าความคาดหวังจากผลลัพธ์การวัด

คุณจะวัด Qubit ที่สองในฐาน ZZ และ XX ส่วน Qubit แรกจะวัดในฐานตั้งฉากเช่นกัน แต่มีมุมเทียบกับ Qubit ที่สอง ซึ่งเราจะกวาดระหว่าง 00 ถึง 2π2\pi ดังที่คุณจะเห็น Estimator primitive ทำให้การรัน Circuit ที่มีพารามิเตอร์เป็นเรื่องง่ายมาก แทนที่จะสร้าง CHSH Circuit หลายตัว คุณต้องสร้างเพียง หนึ่ง CHSH Circuit ที่มีพารามิเตอร์ระบุมุมการวัดและชุดค่าเฟสสำหรับพารามิเตอร์นั้น

สุดท้าย คุณจะวิเคราะห์ผลลัพธ์และพล็อตเทียบกับมุมการวัด คุณจะเห็นว่าในช่วงมุมการวัดบางช่วง ค่าความคาดหวังของปริมาณ CHSH S1>2|\langle S_1\rangle| > 2 หรือ S2>2|\langle S_2\rangle| > 2 ซึ่งแสดงให้เห็นการละเมิดอสมการ 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'

สร้าง CHSH Circuit ที่มีพารามิเตอร์

ก่อนอื่น เราจะเขียน Circuit ที่มีพารามิเตอร์ θ\theta ซึ่งเราเรียกว่า theta Estimator primitive สามารถทำให้การสร้าง Circuit และการวิเคราะห์ผลลัพธ์ง่ายขึ้นอย่างมากโดยการให้ค่าความคาดหวังของ Observable โดยตรง ปัญหาหลายอย่างที่น่าสนใจ โดยเฉพาะสำหรับการประยุกต์ใช้งานระยะใกล้บนระบบที่มีสัญญาณรบกวน สามารถกำหนดในรูปของค่าความคาดหวัง Estimator (V2) primitive สามารถเปลี่ยนฐานการวัดโดยอัตโนมัติตาม Observable ที่ให้มา

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")

Output of the previous code cell

สร้างรายการค่าเฟสที่จะกำหนดภายหลัง

หลังจากสร้าง CHSH Circuit ที่มีพารามิเตอร์แล้ว คุณจะสร้างรายการค่าเฟสที่จะกำหนดให้กับ Circuit ในขั้นตอนถัดไป คุณสามารถใช้โค้ดต่อไปนี้เพื่อสร้างรายการค่าเฟส 21 ค่าในช่วง 00 ถึง 2π2 \pi ด้วยระยะห่างเท่ากัน คือ 00, 0.1π0.1 \pi, 0.2π0.2 \pi, ..., 1.9π1.9 \pi, 2π2 \pi

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]

Observable

ตอนนี้เราต้องการ Observable เพื่อคำนวณค่าความคาดหวัง ในกรณีของเรา เราดูที่ฐานตั้งฉากสำหรับ Qubit แต่ละตัว โดยให้การหมุน YY ที่มีพารามิเตอร์สำหรับ Qubit แรกกวาดฐานการวัดแทบต่อเนื่องเทียบกับฐานของ Qubit ที่สอง ดังนั้นเราจะเลือก Observable ZZZZ, ZXZX, XZXZ และ XXXX

# <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)]
)

ขั้นตอนที่ 2: ปรับแต่งปัญหาสำหรับการรันบนฮาร์ดแวร์ควอนตัม

เพื่อลดเวลาการรันงานทั้งหมด V2 primitives รับเฉพาะ Circuit และ Observable ที่สอดคล้องกับคำสั่งและการเชื่อมต่อที่รองรับโดยระบบเป้าหมาย (เรียกว่า ISA circuits และ observables)

ISA Circuit

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")

Output of the previous code cell

ISA Observables

ในทำนองเดียวกัน เราต้องแปลง Observable เพื่อให้ใช้งานได้กับ Backend ก่อนรันงานด้วย Runtime Estimator V2 เราสามารถทำการแปลงนี้ได้โดยใช้เมธอด apply_layout ของออบเจกต์ SparsePauliOp

isa_observable1 = observable1.apply_layout(layout=chsh_isa_circuit.layout)
isa_observable2 = observable2.apply_layout(layout=chsh_isa_circuit.layout)

ขั้นตอนที่ 3: รันด้วย Qiskit primitives

เพื่อรันการทดลองทั้งหมดในการเรียกครั้งเดียวด้วย Estimator เราสามารถสร้าง Qiskit Runtime Estimator primitive เพื่อคำนวณค่าความคาดหวังของเรา เมธอด EstimatorV2.run() รับ iterable ของ primitive unified blocs (PUBs) แต่ละ PUB เป็น iterable ในรูปแบบ (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()

ขั้นตอนที่ 4: ประมวลผลหลังการรันและส่งคืนผลลัพธ์ในรูปแบบคลาสสิกที่ต้องการ

Estimator ส่งคืนค่าความคาดหวังสำหรับ Observable ทั้งสองตัว คือ ZZZX+XZ+XX\langle ZZ \rangle - \langle ZX \rangle + \langle XZ \rangle + \langle XX \rangle และ ZZ+ZXXZ+XX\langle ZZ \rangle + \langle ZX \rangle - \langle XZ \rangle + \langle XX \rangle

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()

Output of the previous code cell

ในรูป เส้นและพื้นที่สีเทาแสดงขอบเขต เส้นด้านนอกสุด (เส้นประสลับจุด) แสดงขอบเขตควอนตัม (±2\pm 2) ส่วนเส้นด้านใน (เส้นประ) แสดงขอบเขตคลาสสิก (±22\pm 2\sqrt{2}) คุณจะเห็นว่ามีบางบริเวณที่ปริมาณ CHSH witness เกินขอบเขตคลาสสิก ยินดีด้วย! คุณได้แสดงให้เห็นการละเมิดอสมการ CHSH ในระบบควอนตัมจริงสำเร็จแล้ว!

แบบสำรวจบทแนะนำ

กรุณาทำแบบสำรวจสั้นนี้เพื่อให้ข้อเสนอแนะเกี่ยวกับบทแนะนำนี้ ความคิดเห็นของคุณจะช่วยให้เราปรับปรุงเนื้อหาและประสบการณ์การใช้งาน

ลิงก์ไปยังแบบสำรวจ

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.

Source: IBM Quantum docs — updated 7 ก.พ. 2569
English version on doQumentation — updated 7 พ.ค. 2569
This translation based on the English version of 9 เม.ย. 2569