วิธีดูระเบิดโดยไม่ต้องมองด้วยควอนตัม !

ksupasate
6 min readFeb 14, 2022

--

อ่านหัวข้อครั้งแรกทุกคนอาจจะงงว่าทำยังไง มันทำได้จริงหรอ งั้นเรามารู้จักกับ Quantum Minesweeper ที่จะนำมาใช้ในการพิสูจน์กัน..

เกริ่นนำ

จุดเริ่มต้นเริ่มจากผมได้ไปเห็นคลิปหนึ่งบน Youtube จากช่อง Qiskit เป็นคลิปที่นักศึกษาปริญญาเอกจากมหาวิทยาลัยอ็อกฟอร์ด ได้มาอธิบายเกี่ยวกับ “How to See a Bomb Without Looking” โดยใช้ Quantum Minesweeper ที่ดูน่าสนใจและเป็นเรื่องที่นำควอนตัมมาประยุกต์ให้เห็นและเข้าใจได้ง่ายขึ้น จึงเขียนบทความนี้ขึ้นมาเพื่อเผยแพร่ออกเป็นภาษาไทยให้ทุกคนได้อ่าน

เริ่มจาก

สมมติว่ามีกล่องอยู่ใบหนึ่งที่คุณไม่สามารถเห็นวัตถุข้างในกล่องได้เลย โดยที่คุณรู้ว่าข้างในกล่องนั้นอาจจะเป็นกล่องที่ว่างเปล่าหรือเป็นกล่องที่บรรจุระเบิดที่มีความอ่อนไหวมาก ที่หากระเบิดลูกนี้ถูกอนุภาคโฟตอนชนมันจะระเบิดทันที 💥

โจทย์มีอยู่ว่าคุณอยากรู้ว่ามีระเบิดอยู่ในกล่องไหม โดยที่ห้ามให้ระเบิดข้างในระเบิดออกมา ซึ่งโดยหลักการทั่วไปนั้นเป็นไปไม่ได้เลยที่คุณจะรู้ เพราะว่าหากคุณพยายามที่จะตรวจจับระเบิดข้างใน ระเบิดจะทำปฏิกิริยากับเครื่องตรวจจับของคุณทันทีและมันก็จะระเบิดออกมา

แต่ในปี 1993 มีนักฟิสิกส์สองคนที่ชื่อว่า Avshalom Elitzur และ Lev Vaidman ได้ทำการทดลองที่มีชื่อว่า “A Quantum Bomb Tester” ที่จะทำให้คุณนั้นสามารถเห็นระเบิดโดยที่ไม่ต้องมองได้ 🤨

มารู้จักสิ่งเหล่านี้ก่อนเริ่มทำการทดลอง

  • Quantum Circuit -> เป็นการอธิบายการทดลองทางความคิดเชิงควอนตัมให้เข้าใจได้ง่ายขึ้นและอยู่ในรูปแบบของวงจร (circuit)
ตัวอย่างของวงจรเชิงควอนตัม (Quantum Circuit)
  • Minesweeper -> เกมหลบกับดักระเบิดในตำนานที่ทุกคนน่าจะเคยเล่น โดยที่ผู้เล่นจะต้องใช้ตัวเลข (clues) ในการหาเบาะแสของระเบิดที่ซ่อนอยู่ในช่องต่าง ๆ ซึ่งหากสามารถทำให้ระเบิดไม่ระเบิดได้ก็จะชนะ
ตัวอย่างของเกม Minesweeper

เข้าใจหลักการเบื้องต้นของการทดลอง

โดยจากเกม Minesweeper นั้น ในเกมของ Quantum Minesweeper จะทำการกำหนดให้ตัวเลข (clues) คือผลลัพธ์ของการนับคิวบิต (qubit) ที่จะบอกเราว่าระเบิดนั้นมีอยู่หรือไม่ 🔍

ในการสร้าง Bomb Tester นั้น เราจะยิงโฟตอนเดียวไปที่ beam spliter ซึ่ง beam spliter จะทำการแยกโฟตอนออกมาให้อยู่ในสถานะของ superposition ของสถานะสะท้อน (reflect) และสถานะส่ง (transmitted) แล้วเราจะใช้กระจก (mirror) ในการที่จะสะท้อนสองลำแสงโฟตอน (photon beam) ด้วยกันอีกครั้ง

โดยใน second beam spliter ลำแสงโฟตอน (photon beam) จะถูกรบกวนหรือก็คือจะทำการรวมกัน (merge) อีกครั้งเข้าสู่สถานะส่งโดดเดี่ยวของลำแสง (single transmitted beam)

ซึ่งจะเป็นยังไงหากเรานำระเบิดไปวางไว้ใน bottom path ? ที่เมื่อไหร่ที่โฟตอนไปถึงระเบิด ระเบิดจะวัด (measure) ว่าโฟตอนอยู่ทางไหน โดยที่โฟตอนจะทำการยุบออกมาอยู่ในสถานะของ superposition ในทางที่ไปเส้นทางบนหรือไปเส้นทางล่างอย่างเดียวเท่านั้น

ถ้าโฟตอนถูกยุบไปอยู่ในเส้นทางที่ไปเส้นทางล่าง ระเบิดจะปะทุทันที💥 แต่ถ้าโฟตอนถูกยุบไปอยู่ในเส้นทางบนมันจะเดินทางต่อไปจนไปที่ second beam splitter อีกรอบ และจะถูกแยกออกมาอยู่ในสถานะของ superposition ในสถานะสะท้อน (reflect) และสถานะส่ง (transmitted)

ที่ถ้าโฟตอนถูกตรวจจับได้หลังจาก second beam splitter เราจะมั่นใจได้ว่ามีระเบิดอยู่ข้างในนั้น โดยที่ไม่ต้องทำให้ระเบิดปะทุออกมา

โดยที่จากงานวิจัยล่าสุด เราสามารถตรวจจับระเบิดได้ ซึ่งมีความน่าจะเป็นสูงสุดถึง 100% ดังนั้นเราก็จะสามารถรู้ได้ว่ามีระเบิดอยู่ข้างในกล่องมั้ย​โดยที่เราไม่ต้องทำอะไรเลย 🥸

สามารถดูคลิปการอธิบายการเคลื่อนที่ของโฟตอนได้ที่ : Video (นาที 2:01–3:01)

Paradoxes

Quantum Bomb Tester ได้รับการทดสอบการทดลองและมีการไปใช้ประยุกต์มากมายใน Quantum Technology เช่น

เราสามารถได้ภาพวัตถุขนาดเล็กที่มีความละเอียดอ่อนคล้ายเซลล์ได้ด้วยโฟตอนโดยให้พวกมันไปทำปฏิกิริยากับวัตถุให้เกิดความเสียหาย หรือ พวกเราสามารถทำ Counterfactual Quantum Computing ที่จะทำให้เราได้รับผลลัพธ์ของการคำนวณเชิงควอนตัม (Quantum Computation) โดยรวมเข้าไปอยู่ใน state ที่อัลกอริทึมไม่สามารถรันได้ และเราสามารถทำ Counterfactual Quantum Communication ที่คนหนึ่งสามารถส่งข้อมูลไปหาอีกคนหนึ่งได้โดยไม่ต้องส่ง actual partical ที่จะเป็นไปไม่ได้เลยที่จะดักฟังข้อมูล

ในงานวิจัยเบื้องต้นนั้น สำหรับการตีความของกลศาสตร์ควอนตัม (Quantum Mechanics) นั้นยังต้องอธิบายสำหรับการนำไปใช้ในสถานการณ์จริงอยู่

Let’s Start Lab !

ต่อไปจะเป็นการนำ Controversial Bomb Tester ให้อยู่ในรูปแบบของ Simple Quantum Circuit โดยในที่นี้จะใช้ Qiskit

เริ่มจาก จะทำการสร้าง Quantum Circuit โดยทำการใช้ 2 qubits โดยที่ อันแรกจะเป็น “คิวบิตของโฟตอน (photon qubit)” และอีกอันจะเป็น “คิวบิตของระเบิด (bomb qubit)” ที่จะใช้ Hadamard Gate บน photon qubit ในการอธิบาย beam splitter เพราะ Hadamard Gate สามารถดึง photon qubit จาก state 0 ไปยังตำแหน่ง superposition ของ 0 และ 1 และต่อไปจะแทน bomb qubit โดยใช้ NOT Gate ระหว่าง photon qubit และ bomb qubit

ถ้า photon qubit เป็น 0 จะทำให้ bomb อยู่ในสถานะ 0 ที่เป็นสถานะที่ไม่ระเบิด แต่ถ้า photon qubit เป็น 1 จะทำให้ bomb qubit กลับค่า(flip) เป็น 1 ที่หมายความว่าระเบิดจะปะทุหรือระเบิดทันที

ต่อไปเราจะทำการดัดแปลง Hadamard Gate อื่นๆไปยัง photon qubit สำหรับ second beam splitter และหลังจากที่วัด (measure) ทุกอย่างแล้วจะได้ circuit ที่หน้าตาแบบนี้

ตัวอย่าง quantum circuit โดยใช้ Hadamard Gate ในการทำ second beam splitter

ตัวอย่างโค้ดในการสร้าง quantum circuit :

# Code for the basic bomb tester circuit

from qiskit import QuantumCircuit

bomb_tester = QuantumCircuit(2)
bomb_tester.h(0)
bomb_tester.cx(0, 1)
bomb_tester.h(0)
bomb_tester.measure_all()
bomb_tester.draw(output='mpl')

หรือเราสามารถรันวงจรของเราลงบน simulator และจะได้ความน่าจะ 4 ค่าออกมาที่จะมีความน่าจะเป็นอยู่ที่ 25%

ค่าความน่าจะเป็นที่จะได้หลังจาก simulator

ที่หนึ่งในนี้จะเป็นของ photon qubit และอีกหนึ่งอันจะเป็นที่แสดง bomb อย่างแน่นอน ด้วย CNOT gate แต่ bomb qubit จะอยู่ในสถานะ 0 ที่ไม่ระเบิด

ซึ่งเราสามารถทำให้ Bomb Tester อยู่ในประสิทธิภาพแบบ 100% โดยใช้ “The Quantum Zeno effect” ที่จะทำงานเมื่อเราทำการสร้าง beam splitter ที่มีการสะท้อนแสงที่ดี

ดังนั้นเมื่อโฟตอนจะเข้าใกล้ระเบิดมันจะมีโอกาสมากที่จะยุบเข้าไปในเส้นทางที่สะท้อนแสงแทน ที่ๆไม่มีระเบิดอยู่ ซึ่งถ้าเราทำการยิงโฟตอนไปเรื่อย ๆ หลาย ๆ รอบมันจะไปอยู่ในเส้นทางที่สะท้อนแสงในทุกรอบ

และถ้าสมมติว่าในนั้นไม่มีระเบิดอยู่ โฟตอนจะเกิดการแทรกแซงตัวเอง (interferes) ในขณะที่มันผ่านทะลุ beam splitter และใน state นี้จะค่อยๆเปลี่ยนจนกว่าจะส่งผ่าน beam splitter แบบเต็มที่ (fully transmitted)

โดยสามารถตรวจดูได้ว่ารอบสิ้นสุดลงเมื่อไหร่ (cycle) ก็ต่อเมื่อโฟตอนอยู่ในสถานะสะท้อน (reflect) หรือสถานะส่ง (transmitted) จะทำให้เรามั่นใจได้ว่าจะไม่มีระเบิดอยู่ในแน่นอน และจะมีความน่าจะเป็นที่ต่ำมากที่ระเบิดจะปะทุออกมา 😯

ตัวอย่างโค้ดของ Quantum Bomb Tester :

# Coding the Zeno bomb tester 

from qiskit.circuit import QuantumRegister, ClassicalRegister
import numpy as np
from qiskit.circuit.library import RXGate

cycles = 6 # Choose the number of times we want to pass our photon through the mystery box. The more, the better.
theta = np.pi/cycles # The correct reflectivity of our beamsplitter is chosen for the quantum Zeno effect to work.

# Create our quantum circuit
qr = QuantumRegister(2, 'q')
cr = ClassicalRegister(cycles, 'c')
zeno_tester = QuantumCircuit(qr, cr)

# Create a chain of our variable beamsplitters and C-NOT bombs
for cycle in range(cycles-1):
zeno_tester.append(RXGate(theta), [qr[0]])
zeno_tester.cx(0, 1)
zeno_tester.measure(qr[1],cr[cycle])
zeno_tester.reset(qr[1])

# Add a final beamsplitter
zeno_tester.append(RXGate(theta), [qr[0]])

#Measure our photon to predict whether there is a bomb, and measure our bomb qubit to see if it exploded.
zeno_tester.measure(qr[0],cr[cycles-1])
zeno_tester.draw(output='mpl')

จะได้ quantum circuit ที่หน้าตาแบบนี้ :

ตัวอย่างของ quantum circuit หลังจากทำ Quantum Bomb Tester

จากรูปจะเห็นได้ว่าสามารถเห็น beam splitters ที่จะอยู่ใน X rotation gate (สีม่วง) และจะเห็นว่ามีการใช้ beams splitters ที่เยอะมาก และใช้ CNOT gate ในการ simulate โฟตอนที่ผ่าน beam splitters หลาย ๆ รอบ แล้วจะทำการวัด (measure) แต่ละ bomb qubit ที่จะทำการจรวจว่าระเบิดนั้นมีการปะทุหรือไม่ขณะที่โฟตอนกำลังทะลุผ่านในแต่ละรอบ

ตัวอย่างโค้ดของการแสดง quantum circuit บน simulator :

# Running the Zeno bomb tester 

zeno_job = simulator.run(zeno_tester, shots=1000)
zeno_result = zeno_job.result()
zeno_counts = zeno_result.get_counts(zeno_tester)

plot_histogram(zeno_counts)
ตัวอย่างภาพของการ simulator quantum circuit

จากรูปเราจะได้ histogram ทีดูเหมือนจะเป็นผลลัพธ์ออกมา โดยหนึ่งในนี้จะเป็นที่ที่ photon qubit อยู่ในสถานะ 0 หรือหมายความว่ามีระเบิดอยู่ตรงนี้ หรือ bomb qubit วัดได้ค่า 0 หมายความว่าระเบิดจะไม่ปะทุออกมา จะเห็นได้ว่าเมื่อเราใช้ beams splitters 6 อัน เราจะมีสองถึงสามโอกาสที่ระเบิดจะอยู่ที่นี่โดยไม่ระเบิด

ต่อไปจะใช้ beams splitters 6 อันนี้ ไปใช้กับเกม Quantum Minesweeper

ตัวอย่างโค้ดของ Quantum Minesweeper :

# Setting up the circuit for quantum minesweeper 

from qiskit.circuit.library import CCXGate

def q_sweeper(cycles) -> QuantumCircuit:
qr = QuantumRegister(3, 'q')
cr = ClassicalRegister(cycles+1, 'c')
qc = QuantumCircuit(qr, cr)
qc.h(qr[0])
for cycle in range(cycles-1):
qc.append(RXGate(theta), [qr[1]])
qc.ccx(qr[0], qr[1], qr[2])
qc.measure(qr[2],cr[cycle])
if cycle < cycles-1:
qc.reset(qr[2])

qc.append(RXGate(theta), [qr[1]])
qc.measure(qr[1],cr[cycles-1])
qc.measure(qr[0],cr[cycles])
return qc

successes = 0 # We will use this variable to track the number of successful predictions in a row
cycles = 6
theta = np.pi/cycles

zeno_circuit = q_sweeper(cycles)
zeno_circuit.draw(output='mpl')
ตัวอย่างของ quantum circuit ของ Quantum Minesweeper

จะเห็นว่าทำการเปลี่ยน controlled-NOT เป็น controlled-controlled-NOT ที่หมายความว่าระเบิดจะอยู่ในสถานะของ superposition ที่จะมีสถานะว่ามีระเบิดอยู่และไม่มีระเบิดอยู่ และในท้ายวงจรจะมีการวัด controlled qubit ที่จะทำให้เรารู้ว่ามีระเบิดอยู่หรือไม่ที่จะอยู่ในตำแหน่งของ C

สุดท้ายนี้จะเป็นเกมที่มีการใช้ Quantum Bomb Tester บน Quantum Bomb มาดูกันดีกว่าว่าเป็นยังไง !

ตัวอย่างโค้ดของ Quantum Minesweeper Game :

# Game of quantum minesweeper 
qsweeper_job = simulator.run(zeno_circuit, shots=1)
qsweeper_result = qsweeper_job.result()
qsweeper_counts = qsweeper_result.get_counts(zeno_circuit)

result = sorted(qsweeper_counts.keys())[0]

for i in range(2,cycles): # Check that none of the 3rd to last bits have flipped to a 1
if int(result[i]) == 1:
print("BOOM! The bomb has exploded. You lose... :(")
print("Your score was:")
print(successes)
successes = 0
explode = 1
break
else:
explode = 0

if explode == 0:
print("The qubit predicts...")
if int(result[1]) == 0:
print("Bomb present")
Prediction = input("What do you think? Type 0 for no bomb, 1 for bomb.")
else:
print("No bomb")
Prediction = input("What do you think? Type 0 for no bomb, 1 for bomb.")

if Prediction == "0":
print("You predicted there is no bomb.")
elif Prediction == "1":
print("You predicted there is a bomb")
else:
print("Invalid prediction!")

if Prediction == result[0]:
print("Congratulations! You predicted correctly, you win Quantum Minesweeper! :D")
successes += 1
elif int(Prediction) == (int(result[0]) + 1) % 2:
print("Uh oh! You predicted wrong. You lose :(")
print("Your score was:")
print(successes)
successes = 0
else:
print("Prediction was invalid so your score is unchanged.")

print("Quantum Minesweeper score:")
print(successes)

ตัวอย่างหน้าตาของเกม :

จากรูปจะเห็นว่า qubit จะทำการทำนายออกมาก่อน ซึ่งในที่นี้จะทำการทำนายว่า “ไม่มีระเบิดอยู่” และหากเราเชื่อและเราพิมพ์ “0 (บอกว่าไม่มีระเบิด)” และหากผลลัพธ์ถูกเราก็จะได้คะแนนขึ้นมา 🥳

ที่บางครั้ง ! qubit อาจจะมีการทำนายที่ผิดพลาดบ้างตามความน่าจะเป็นของการเกิดขึ้น

ตัวอย่างการทำนายที่ผิดพลาดของ qubit

โดยที่เราจะมาดูว่าสาเหตุที่ทำไมถึงเกิดเหตุการณ์นี้ขึ้นด้วย simulators กัน

ตัวอย่างโค้ดของการแสดง quantum circuit บน simulator :

qsweeper_job = simulator.run(zeno_circuit, shots=1000)
qsweeper_result = qsweeper_job.result()
qsweeper_counts = qsweeper_result.get_counts(zeno_circuit)

plot_histogram(qsweeper_counts)

จากกราฟจะเห็นว่าจะมีผลลัพธ์หลักๆอยู่สองค่าคือที่จะมีอยู่อันหนึ่งที่ทำการทำนายได้ถูกต้องว่า ไม่มีระเบิดอยู่ในนี้หรือทำนายถูกว่าระเบิดอยู่ที่นี่และไม่มีระเบิดที่จะปะทุออก 🤓

สรุป

จะเห็นว่าการประยุกต์ใช้ความรู้ทางด้าน Quantum Computing กับสิ่งรอบตัวไม่ใช่เรื่องที่ยากและไกลตัวเลย ซึ่งจากเกมที่สร้างขึ้นมาที่เป็นเกม Quantum Minesweeper จะเห็นว่าเมื่อนำไป test กับ real quantum hardware จะเกิดเหตุการณ์ที่ “เมื่อเราทำการเพิ่ม gate มากขึ้นเท่าไหร่ จะเป็นการเพิ่ม noise มากขึ้นเท่านั้น” ที่จะไปรบกวนกับ quantum circuit ของเรา

ดังนั้นหากใครสามารถสร้างเกมนี้โดยใช้ gate ให้น้อยที่สุดอาจจะทำให้ค่าความน่าจะเป็นในการทำนายนั้นมีโอกาสถูกที่สูงยิ่งขึ้น 😎

สุดท้ายนี้หากชื่นชอบโพสนี้ก็อย่าลืมแชร์และแบ่งปันความรู้ทางด้านควอนตัมต่อเนื่องให้กับคนอื่น ๆ ด้วยนะครับ ขอบคุณทุกคนที่อ่านถึงจุดนี้ครับ :)

Happy Coding & Learning Quantum 😁

Ref

Quantum Minesweeper: How to See a Bomb Without Looking — YouTube

quantum-paradoxes/quantum-minesweeper-code.ipynb at main · maria-violaris/quantum-paradoxes (github.com)

Quantum circuit example. | Download Scientific Diagram (researchgate.net)

Minesweeper Online

--

--

ksupasate
ksupasate

No responses yet