การแนะนำเกณฑ์ DiVincenzo แบบลงมือปฏิบัติด้วย Qiskit 2
บทนำ
นักฟิสิกส์ David DiVincenzo ได้ระบุข้อกำหนดสำคัญห้าประการสำหรับการนำคอมพิวเตอร์ควอนตัมไปใช้งานจริงในเชิงฟิสิก ส์ บวกกับเกณฑ์เพิ่มเติมอีกสองประการสำหรับการสื่อสารควอนตัม ใน notebook นี้ เราจะสัมผัสกับเกณฑ์ DiVincenzo แต่ละข้อผ่านการสาธิตด้วย Qiskit แบบลงมือปฏิบัติ แทนที่จะเจาะลึกเรื่องทฤษฎี แต่ละส่วนจะอธิบายเกณฑ์หนึ่งข้ออย่างย่อ แล้วให้แบบฝึกหัดโค้ดด้วย Qiskit 2 คุณจะได้รัน Circuit บนซิมูเลเตอร์และอุปกรณ์ IBM Quantum จริง เพื่อสำรวจแต่ละหลักการด้วยตัวเอง
เกณฑ์ห้าประการของ DiVincenzo สำหรับการคำนวณเชิงควอนตัม:
- ระบบฟิสิกส์ที่ขยายขนาดได้พร้อม Qubit ที่มีลักษณะเฉพาะที่ชัดเจน
- ความสามารถในการกำหนดค่าเริ่มต้น Qubit ให้อยู่ในสถานะอ้างอิงที่เรียบง่าย (เช่น |00…0〉)
- เวลา decoherence ที่ยาวนาน (ความสอดคล้องของ Qubit ต้องยาวนานกว่าเวลาการทำงานของ Gate มาก)
- ชุด Gate ควอนตัมแบบ universal (สามารถทำ unitary operation ใดก็ได้ตามต้องการ)
- ความ สามารถในการวัดแบบเจาะจง Qubit (อ่านค่าสถานะของแต่ละ Qubit)
(DiVincenzo ยังได้อธิบายเกณฑ์สองประการสำหรับการสื่อสารควอนตัมด้วย ได้แก่ ความสามารถในการแปลงระหว่าง Qubit แบบนิ่งและ "flying" Qubit และการส่ง flying Qubit ระหว่างตำแหน่งต่าง ๆ อย่างถูกต้อง เราจะรวมเรื่องนี้ไว้ในกิจกรรมแนะนำตอนท้ายของ notebook นี้)
แต่ละส่วนต่อไปนี้สอดคล้องกับเกณฑ์หนึ่งข้อ เราจะใช้ Qiskit เพื่ออธิบายแนวคิดด้วยโค้ดและการทดลองแบบโต้ตอบที่คุณสามารถลองทำได้ ตัวอย่างเช่น เราจะเห็นว่าการเพิ่มจำนวน Qubit และความลึกของ Circuit ส่งผลต่อผลลัพธ์อย่างไร (เกณฑ์ 1) วิธีรีเซ็ตและเตรียมสถานะ Qubit (เกณฑ์ 2) วิธีวัด Qubit บนซิมูเลเตอร์เทียบกับอุปกรณ์จริง (เกณฑ์ 4) วิธีที่ Qiskit สร้าง Gate แบบ universal (เกณฑ์ 3) และผลกระทบของ coherence ที่จำกัด (T₁, T₂) ต่อการคำนวณ (เกณฑ์ 5) เมื่อจบแล้ว คุณจะมีความเข้าใจที่ลึกซึ้งขึ้นว่าแต ่ละเกณฑ์ DiVincenzo หมายความว่าอะไรในทางปฏิบัติ และ Qiskit ช่วยให้ทดลองกับเกณฑ์เหล่านั้นได้อย่างไร
# Added by doQumentation — required packages for this notebook
!pip install -q numpy
# Install necessary packages
!pip install qiskit[visualization] qiskit-ibm-runtime qiskit-aer qiskit_ibm_runtime
1. เกณฑ์ 1 – Qubit ที่ขยายขนาดได้และมีลักษณะเฉพาะที่ชัดเจน
เกณฑ์ 1: "ระบบฟิสิกส์ที่ขยายขนาดได้พร้อม Qubit ที่มีลักษณะเฉพาะที่ชัดเจน" หมายความว่าเราต้องการแพลตฟอร์มฮาร์ดแวร์ควอนตัมที่ สามารถเพิ่มจำนวน Qubitได้ในขณะที่ยังควบคุมได้อย่างน่าเชื่อถือ คุณสมบัติของ Qubit แต่ละตัว (ระดับพลังงาน, อัตราความผิดพลาด, การเชื่อมต่อ ฯลฯ) ควรเป็นที่เข้าใจดี โดยพื้นฐานแล้ว เราต้องการสร้าง Circuit ขนาดใหญ่ขึ้นโดยไม่ให้ระบบพัง ในทางปฏิบัติ เมื่อเราขยายจำนวน Qubit หรือความลึกของ Circuit ความผิดพลาดและ decoherence จะสะสมขึ้น ดังนั้นการแสดงให้เห็น scalability ยังหมายถึงการทำความเข้าใจว่าการเพิ่มขนาดส่งผลต่อประสิทธิภาพอย่างไร
เป้าหมายของการสาธิต: ใช้ Qiskit เพื่อแสดงผลกระทบของการขยายขนาด Circuit (ในจำนวน Qubit หรือความลึกของ Gate) ต่อ fidelity ของผลลัพธ์ เราจะจำลองสถานการณ์ในอุดมคติเทียบกับแบบมีสัญญาณรบกวน เพื่อดูว่าระบบขนาดใหญ่ขึ้นหรือ Circuit ที่ลึกขึ้นพ่ายแพ้ต่อ decoherence และความผิดพลาดได้อย่างไร
ก่อนอื่น มาสร้างสถานะ entanglement ขนาดเล็ก (สถานะ GHZ) บน 3 Qubit จากนั้นขน าดใหญ่ขึ้นบน 5 Qubit เพื่อทดสอบการขยายขนาดอย่างง่าย สถานะ GHZ ของ Qubit จำนวน n ตัวคือ ในการจำลองแบบอุดมคติ การวัด GHZ ขนาด n Qubit จะได้เพียงสองผลลัพธ์ (ทั้งหมดเป็น 0 หรือทั้งหมดเป็น 1) ด้วยความน่าจะเป็นเท่ากัน เราจะเปรียบเทียบผลลัพธ์อุดมคติกับผลลัพธ์ที่มีสัญญาณรบกวนเมื่อเราเพิ่ม n หรือความลึกของ Circuit
from qiskit import QuantumCircuit
from qiskit_aer import AerSimulator
from qiskit.visualization import plot_histogram
from qiskit.transpiler.preset_passmanagers import generate_preset_pass_manager
from qiskit_ibm_runtime import SamplerV2 as Sampler
# 3-qubit GHZ circuit
qc3 = QuantumCircuit(3, 3)
qc3.h(0)
qc3.cx(0, 1)
qc3.cx(1, 2)
qc3.measure([0, 1, 2], [0, 1, 2])
# 5-qubit GHZ circuit (scaling up the number of qubits)
qc5 = QuantumCircuit(5, 5)
qc5.h(0)
qc5.cx(0, range(1, 5)) # entangle qubit 0 with all others
qc5.measure(range(5), range(5))
# Transpile for a simulator backend
sim_backend = AerSimulator()
pm = generate_preset_pass_manager(backend=sim_backend, optimization_level=1)
isa_qc3 = pm.run(qc3)
isa_qc5 = pm.run(qc5)
# Run ideal simulations (no noise)
sampler = Sampler(mode=sim_backend)
job3 = sampler.run([isa_qc3], shots=1024)
result3 = job3.result()
counts3 = result3[0].data.c.get_counts()
job5 = sampler.run([isa_qc5], shots=1024)
result5 = job5.result()
counts5 = result5[0].data.c.get_counts()
print("3-qubit GHZ counts (ideal):", counts3)
plot_histogram(counts3, legend=['3-qubit ideal'], figsize=(6,4))
3-qubit GHZ counts (ideal): {'000': 531, '111': 493}

print("5-qubit GHZ counts (ideal):", counts5)
plot_histogram(counts5, legend=['5-qubit ideal'], figsize=(6,4))
5-qubit GHZ counts (ideal): {'11111': 535, '00000': 489}

ผลลัพธ์ที่คาดหวัง (กรณีอุดมคติ): GHZ 3 Qubit ในอุดมคติจะได้ประมาณ 50% 000 และ 50% 111 ใน counts GHZ 5 Qubit จะได้ ~50% 00000 และ 50% 11111 ไม่มี bit-string อื่นปรากฏขึ้น เพราะสถานะอยู่ใน coherent และ entanglement อย่างสมบูรณ์ในอุดมคติ คุณควรเห็นแท่งสูงสองแท่งบน histogram สำหรับแต่ละ Circuit ที่สอดคล้องกับผลลัพธ์ทั้งหมดเป็นศูนย์และทั้งหมดเป็นหนึ่ง
ต่อไป มาดูว่าเกิดอะไรขึ้นในสภาพแวดล้อมที่มีสัญญาณรบกวน เราจะใช้ความสามารถของ noise model ใน Qiskit Aer เพื่อจำลองความผิดพลาดของอุปกรณ์จริง ตัวอย่างเช่น เราสามารถนำคุณสมบัติของ IBM backend มาสร้าง noise model ที่รวมถึงความผิดพลาดของ Gate, เวลา Gate ที่จำกัด, การคลายตัวของ Qubit (T₁), dephasing (T₂) และความผิดพลาดในการอ่านค่า ที่นี่ เราจะใช้ fake backend ที่แสดงถึงอุปกรณ์ IBM Quantum Brisbane เพื่อสร้าง noise model แล้วรัน Circuit GHZ อีกครั้งผ่านโมเดลนั้น
แบบฝึกหัด 1a: จำลองด้วย Noise
เติมโค้ดด้านล่างให้สมบูรณ์เพื่อจำลอง Circuit GHZ บนซิมูเลเตอร์ที่มีสัญญาณรบกวนจาก backend FakeBrisbane ซึ่งจะแสดงให้เห็นว่าประสิทธิภาพลดลงอย่างไรเมื่อระบบขยายขนาดในสภาพแวดล้อม noise จริง
from qiskit_ibm_runtime.fake_provider import FakeBrisbane
# We will reuse the ideal circuits qc3 and qc5 and their results from the previous cell.
# --- YOUR CODE HERE ---
# 1. Create a fake backend for IBM Quantum Brisbane
###brisbane_backend = ...
# 2. Create a noisy AerSimulator from the fake backend's properties
###noisy_sim = ...
# 3. Transpile the circuits for the noisy simulator (this adapts them to the device's specific gates and connectivity)
###pm = ...
###isa_qc3_noisy = ...
###isa_qc5_noisy = ...
# 4. Run the noisy simulations using the Sampler and get the counts
###sampler = ...
###job3 = ...
###result3_noisy = ...
###counts3_noisy = ...
###job5 = ...
###result5_noisy = ...
###counts5_noisy = ...
# --- END YOUR CODE ---
# This part is done for you to print and plot the results:
print("3-qubit GHZ counts (noisy):", counts3_noisy)
plot_histogram(counts3_noisy, legend=['3-qubit noisy'], figsize=(6,4))
print("5-qubit GHZ counts (noisy):", counts5_noisy)
plot_histogram(counts5_noisy, legend=['5-qubit noisy'], figsize=(6,4))