Quantum teleportation
โมดูล Qiskit in Classrooms นี้ต้องการให้นักเรียนมี Python environment ที่ใช้งานได้พร้อมติดตั้งแพ็กเกจต่อไปนี้:
qiskitv2.1.0 หรือใหม่กว่าqiskit-ibm-runtimev0.40.1 หรือใหม่กว่าqiskit-aerv0.17.0 หรือใหม่กว่าqiskit.visualizationnumpypylatexenc
สำหรับการตั้งค่าและติดตั้งแพ็กเกจข้างต้น ดู คู่มือติดตั้ง Qiskit เพื่อรันงานบนคอมพิวเตอร์ควอนตัมจริง นักเรียนต้องสร้างบัญชี IBM Quantum® โดยทำตามขั้นตอนในคู่มือ ตั้งค่าบัญชี IBM Cloud
โมดูลนี้ผ่านการทดสอบและใช้เวลา QPU ไป 14 วินาที ตัวเลขนี้เป็นค่าประมาณเท่านั้น ปริมาณการใช้งานจริงของคุณอาจแตกต่างกัน
# Added by doQumentation — required packages for this notebook
!pip install -q numpy qiskit qiskit-aer 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'
ดู walkthrough ของโมดูลโดย Dr. Katie McCormick ด้านล่าง หรือคลิก ที่นี่ เพื่อดูบน YouTube
บทนำและพื้นหลัง
Quantum teleportation เป็นเทคนิคในฟิสิกส์ควอนตัมที่ช่วยให้ถ่ายโอนข้อมูลควอนตัมจากที่หนึ่งไปยังอีกที่หนึ่งโดยไม่ต้องเคลื่อนย้ายอนุภาคทางกายภาพ ต่างจากแนวคิด teleportation ในนิยายวิทยาศาสตร์ กระบวนการนี้ไม่เกี่ยวข้องกับการขนส่งสสาร แต่อาศัยหลักการของ quantum entanglement ซึ่งอนุภาคสองตัวจะเชื่อมต่อกันโดยไม่คำนึงถึงระยะทาง ผ่านชุดการวัดและการสื่อสารแบบคลาสสิกที่แม่นยำ สถานะควอนตัมของอนุภาคหนึ่งสามารถสร้างขึ้นใหม่ในอนุภาคอีกตัวที่ตำแหน่งห่างไกล ซึ่งเป็นการ "teleport" ข้อมูลควอนตัมโดยพฤตินัย ในโมดูลนี้ เราจะดูว่าสิ่งนี้ทำงานอย่างไรทางคณิตศาสตร์ และจากนั้นเราจะนำ quantum teleportation ไปใช้บนคอมพิวเตอร์ควอนตัมจริง บทนำที่นี่จะกระชับ สำหรับข้อมูลพื้นหลังเพิ่มเติมเกี่ยวกับข้อมูลควอนตัม และคำอธิบายเพิ่มเติมเกี่ยวกับ teleportation เราแนะนำหลักสูตรของ John Watrous เกี่ยวกับ พื้นฐานของข้อมูลควอนตัม และโดยเฉพาะส่วนเกี่ยวกับ Teleportation
บิตคลาสสิกสามารถอยู่ในสถานะ 0 หรือ 1 ได้ Quantum bits (Qubit) สามารถอยู่ในสถานะควอนตัมที่แทนด้วย และ และยังเป็นการรวมเชิงเส้นของสถานะเหล่านี้ที่เรียกว่า "ซูเปอร์โพสิชัน" เช่น โดยที่ และ แม้ว่าสถานะสามารถอยู่ในซูเปอร์โพสิชันนี้ได้ การวัดสถานะจะ "คอลแลปส์" มันไปเป็นสถานะ หรือ พารามิเตอร์ และ เกี่ยวข้องกับความน่าจะเป็นของแต่ละผลการวัดตาม
ดังนั้นข้อจำกัดที่ว่า
คุณสมบัติสำคัญอีกอย่างคือ Qubit สามารถ "entangled" ได้ ซึ่งหมายความว่าการวัด Qubit ตัวหนึ่งสามารถส่งผลต่อผลลัพธ์การวัดของ Qubit ที่ entangled ตัวอื่นได้ การทำความเข้าใจว่า entanglement แตกต่างจาก classical correlations ธรรมดาอย่างไรนั้นค่อนข้างยุ่งยาก มาอธิบายสัญลักษณ์ของเราก่อน เรียก Qubit สองตัวที่เป็นของเพื่อน 0 (Alice) และเพื่อน 1 (Bob) และแต่ละตัวอยู่ในสถานะ
หรือ
บางครั้งย่อเป็น
สังเกตว่า Qubit ที่มีหมายเลข (หรือตัวอักษร) ต่ำที่สุดอยู่ทางขวาสุด นี่คือ convention ที่เรียกว่าสัญลักษณ์ "little-endian" ที่ใช้ตลอดทั้ง Qiskit หากสถานะสอง Qubit ของเพื่อนทั้งคู่คือ และพวกเขาวัดสถานะของ Qubit ของตัวเอง พวกเขาแต่ละคนจะพบ 0 ในทำนองเดียวกันหาก Qubit อยู่ในสถานะ การวัดแต่ละครั้งจะได้ 1 สิ่งนั้นไม่ต่างจากกรณีคลาสสิก อย่างไรก็ตาม ในการประมวลผลเชิงควอนตัม เราสามารถรวมสิ่งนี้กับซูเปอร์โพสิชันเพื่อได้สถานะเช่น
ในสถานะเช่นนี้ ยังไ ม่ทราบ ยังไม่ถูกกำหนดโดยธรรมชาติว่า Alice และ Bob มี Qubit ในสถานะ 0 หรือ 1 และยังคงทราบว่าพวกเขาจะวัดสถานะเดียวกันสำหรับ Qubit ของตัวเอง ตัวอย่างเช่น หาก Bob วัด Qubit ของตัวเองว่าอยู่ในสถานะ วิธีเดียวที่เกิดขึ้นได้คือการวัดได้คอลแลปส์สถานะสอง Qubit ไปยังหนึ่งในสองสถานะที่เป็นไปได้ โดยเฉพาะไปยัง ซึ่งทำให้ Qubit ของ Alice อยู่ในสถานะ ด้วย
Qubit ที่ entangled กันในลักษณะนี้ไม่ต้องการให้ Qubit อยู่ใกล้กันทางกายภาพ กล่าวอีกนัยคือ เราสามารถ entangle Qubit แล้วแยกพวกมันออกระยะทางไกล และใช้ entanglement ของพวกมันเพื่อส่งข้อมูลได้ สถานะที่ entangled เช่นข้างต้นเป็นหน่วยพื้นฐานของ entanglement และบางครั้งเรียกว่า "e-bit" ซึ่งเป็น entanglement หนึ่งบิต e-bit เหล่านี้สามารถถือเป็นทรัพยากรในการสื่อสารเชิงควอนตัม เนื่องจาก e-bit แต่ละตัวที่แบ่งปันระหว่างพาร์ทเนอร์ที่อยู่ห่างไกลสามารถใช้ได้ ตามที่เราอธิบายที่นี่ เพื่อย้ายข้อมูลจากที่หนึ่งไปยังอีกที่หนึ่ง
ความคิดแรกของหลายคนที่เรียนรู้เรื่องนี้เป็นครั้งแรกคือเรื่องการละเมิด relativity: เราสามารถใช้สิ่งนี้ส่งข้อมูลเร็วกว่าแสงได้หรือไม่? โดยทุกวิถีทาง ย ังคงตั้งคำถามและตรวจสอบกฎทางวิทยาศาสตร์ต่อไป แต่น่าเสียดายที่สิ่งนี้ไม่อนุญาตให้เราส่งข้อมูลเร็วกว่าแสง ด้วยเหตุผลที่จะชัดเจนขึ้นตลอดโมดูลนี้ Spoiler: น่าประหลาดใจที่ไม่ใช่เพราะความเร็วที่ "collapse" นี้เผยแพร่ ซึ่งดูเหมือนจะเกิดขึ้นเร็วกว่าแสง [1]
เราเริ่มต้นด้วยผู้ทำงานร่วมกันสองคนคือ Alice และ Bob ซึ่งในตอนแรกอยู่ในที่เดียวกันและสามารถทำงานร่วมกันบน Qubit เดียวกันได้ ผู้ทำงานร่วมกันเหล่านี้จะ entangle Qubit ของพวกเขา จากนั้นพวกเขาจะย้ายออกไปยังสองตำแหน่งทางภูมิศาสตร์ที่ต่างกัน นำ Qubit ที่เกี่ยวข้องไปด้วย Alice จะได้รับข้อมูลควอนตัมบน Qubit ใหม่ Q เราไม่ได้สมมติเกี่ยวกับข้อมูลบน Q สถานะของ Q อาจเป็นความลับที่ Alice ไม่รู้ มันอาจไม่รู้จากทุกคน แต่ Alice ได้รับมอบหมายให้ถ่ายโอนข้อมูลบน Q ให้กับ Bob เธอจะทำสิ่งนี้โดยใช้ quantum teleportation
เพื่อทำสิ่งนี้ เราจะต้องรู้จักการดำเนินการควอนตัมบางอย่างหรือ "gate"
Quantum operators (Gate)
สามารถข้ามส่วนนี้ได้หากคุณคุ้นเคยกับ quantum gate แล้ว หากต้องการเข้าใจ Gate เหล่านี้ดีขึ้น ดู พื้นฐานของข้อมูลควอนตัม โดยเฉพาะสองบทแรกเกี่ยวกับ IBM Quantum Learning
สำหรับ teleportation protocol นี้เราจะใช้ quantum gate สองประเภทหลัก: Hadamard Gate และ CNOT Gate อีกไม่กี่ตัวจะมีบทบาทรอง: Gate, Gate และ SWAP Gate
โมดูลนี้สามารถทำให้เสร็จได้ด้วยพื้นฐาน linear algebra ที่จำกัดมาก แต่บางครั้งการแสดงภาพ Gate กลศาสตร์ควอนตัมโดยใช้เมทริกซ์และ vector อาจเป็นประโยชน์ ดังนั้นเราจึงนำเสนอรูปแบบเมทริกซ์/vector ของ Gate/สถานะควอนตัมที่นี่ด้วย
สถานะที่เราเพิ่งนำเสนอถูกเลือก (ส่วนหนึ่งตาม convention และส่วนหนึ่งตามข้อจำกัด) ให้มีรูปแบบ vector:
ในลักษณะนี้ สถานะตามต้องการ สามารถเขียนเป็น
มีทางเลือกในการขยายสัญลักษณ์ไปยังสถานะ Qubit หลายตัว แต่ทางเลือกด้านล่างค่อนข้างเป็นมาตรฐาน:
ด้วยสัญลักษณ์ vector นี้ในใจ เราสามารถแนะนำ quantum gate ที่ต้องการ ผลกระทบต่อสถานะควอนตัม และรูปแบบเมทริกซ์ของมัน
H Hadamard Gate: สร้างสถานะซูเปอร์โพส ิชัน Gate สำหรับ Qubit เดี่ยว
Circuit ที่มี Hadamard Gate สร้างขึ้นดังนี้:
from qiskit import QuantumCircuit
qc = QuantumCircuit(1)
qc.h(0)
qc.draw("mpl")
CNOT Controlled-NOT Gate: Gate นี้ใช้ Qubit สองตัว: control และ target ตรวจสอบสถานะของ control qubit ซึ่งไม่ถูกเปลี่ยนแปลง แต่ถ้า control qubit อยู่ในสถานะ Gate จะเปลี่ยนสถานะของ target qubit ถ้าสถานะของ control qubit คือ จะไม่มีการเปลี่ยนแปลงใดๆ ในสัญลักษณ์ด้านล่าง ถือว่า Qubit (Qubit ทางขวาสุด) เป็น control และ Qubit (Qubit ทางซ้ายสุด) เป็น target ด้านล่าง สัญลักษณ์ที่ใช้คือ
คุณอาจเห็น CNOT เขียนด้วยลำดับของ control และ target ที่เข้าใจกันโดยปริยาย แต่ไม่มีความคลุมเครือดังกล่าวในโค้ดหรือแผนภาพ Circuit
CNOT gate มีลักษณะค่อนข้างต่างกันใน Circuit เนื่องจากต้องใช้สอง Qubit วิธีนำไปใช้มีดังนี้:
qc = QuantumCircuit(2)
qc.cx(0, 1)
qc.draw("mpl")
ทดสอบความเข้าใจ
อ่านคำถามด้านล่าง คิดหาคำตอบ แล้วคลิกสามเหลี่ยมเพื่อดูเฉลย
Gate ส่วนใหญ่มีรูปแบบเมทริกซ์เหมือนกันใน Qiskit และทุกที่อื่น แต่ CNOT Gate กระทำบนสอง Qubit ดังนั้นทันใดนั้น convention การเรียงลำดับ Qubit กลายเป็นปัญหา ตำราที่เรียง Qubit เป็น จะแสดงรูปแบบเมทริกซ์ที่ต่างกันสำหรับ CNOT Gate ยืนยันโดยการคูณเมทริกซ์อย่างชัดแจ้งว่าเมทริกซ์ CNOT ด้านบนมีการกระทำที่ถูกต้องบนสถานะ
คำตอบ:
Gate: เทียบเท่ากับการดำเนินการ NOT Gate สำหรับ Qubit เดี่ยว
ใน Qiskit การสร้าง Circuit ที่มี Gate มีลักษณะดังนี้:
qc = QuantumCircuit(1)
qc.x(0)
qc.draw("mpl")
Gate: เพิ่ม "เฟส" ให้กับสถานะ (ตัวคูณนำหน้า ซึ่งในกรณีของ Z eigenstates และ จะเป็น 1 หรือ -1 ตามลำดับ) Gate สำหรับ Qubit เดี่ยว
ใน Qiskit การสร้าง Circuit ที่มี Gate มีลักษณะดังนี้:
qc = QuantumCircuit(1)
qc.z(0)
qc.draw("mpl")
ทฤษฎี
มาวางรูปแบบ protocol สำหรับ quantum teleportation โดยใช้คณิตศาสตร์ จากนั้นในส่วนถัดไป เราจะนำการตั้งค่านี้มาสร้างโดยใช้คอมพิวเตอร์ควอนตัม
Alice และ Bob entangle Qubit ของพวกเขา: ในตอนแรก Qubit ของ Alice และ Qubit ของ Bob แต่ละตัวแยกกันอยู่ในสถานะ (สมมติฐานที่ดีและการกำหนดค่าเริ่มต้นที่ถูกต้องสำหรับคอมพิวเตอร์ควอนตัม IBM®) เราสามารถเขียนสิ่งนี้เป็น หรือเพียง มาคำนวณว่าเกิดอะไรขึ้นเมื่อ Alice และ Bob กระทำด้ วย Hadamard Gate บน Qubit ของ Alice และจากนั้น CNOT Gate โดยมี Qubit ของ Alice เป็น control และของ Bob เป็น target:
สังเกตว่าตอนนี้ Qubit ของ Alice และ Bob entangled กัน แม้ว่าธรรมชาติยังไม่ได้กำหนดว่า Qubit ทั้งคู่อยู่ในสถานะ หรือ แต่ทราบว่า Qubit ของพวกเขาอยู่ในสถานะเดียวกัน
Alice และ Bob แยกกัน: เพื่อนทั้งสองย้าย Qubit ของพวกเขาไปยังสถานที่ใหม่ อาจห่างไกลมาก สิ่งนี้มีข้อสงวนมากมาย: การย้ายข้อมูลควอนตัมโดยไม่รบกวนมันไม่ใช่เรื่องง่าย แต่สามารถย้ายได้ และแน่นอนคุณจะย้ายมันในโมดูลนี้ แต่โปรดจำไว้เป็นข้อสงวนว่าเราคาดว่าจะพบข้อผิดพลาดบางอย่างเมื่อเราย้ายข้อมูลควอนตัมไปมามาก
Q ถูกนำเข้า: สถานะลับถูกเตรียมบน Qubit Q:
ณ จุดนี้ Q อยู่ติดกับ Qubit ของ Alice (A) เพียงแค่นั้น ไม่มี entanglement ดังนั้นสถานะควอนตัมของสาม Qubit รวมกันสามารถเขียนเป็น:
เป้าหมายคือการย้ายข้อมูลบน Q จากตำแหน่งของ Alice ไปยังตำแหน่งของ Bob ณ จุดนี้ เราไม่ได้อ้างสิทธิ์หรือความต้องการใดๆ เกี่ยวกับความลับหรือความเร็วของการถ่ายโอนข้อมูล เราแค่สำรวจว่าข้อมูลสามารถเคลื่อนจาก Alice ไปยัง Bob ได้อย่างไร
เนื่องจากข้อมูลเริ่มต้นบน Q เราจะสมมติว่า Q ถูกกำหนดหมายเลข Qubit ต่ำที่สุด ดังนั้นสัญลักษณ์ little endian ทำให้ Q เป็น Qubit ทางขวาสุดในคณิตศาสตร์ด้านล่าง
Alice entangle Qubit A และ Q: ตอนนี้ Alice ดำเนินการด้วย CNOT Gate โดยมี Qubit ของตัวเองเป็น control และ Q เป็น target จากนั้นนำ Hadamard Gate ไปใช้กับ Q มาคำนวณสถานะสาม Qubit หลังจากการดำเนินการนั้น:
เนื่องจาก A และ Q อยู่ในตำแหน่งเดียวกัน มาจัดกลุ่มเทอมด้านบนตามผลลัพธ์การวัดบน Qubit A และ Q:
ทดสอบความเข้าใจ
อ่านคำถามด้านล่าง คิดหาคำตอบ แล้วคลิกสามเหลี่ยมเพื่อดูเฉลย
จากนิพจน์ด้านบนสำหรับสถานะของสาม Qubit ทั้งหมด ความน่าจะเป็นที่การวัด Qubit A และ Q จะได้ คือเท่าใด?
คำตอบ:
25% เพื่อเห็นสิ่งนี้ จำว่าสถานะของ Bob ต้องถูก normalize ดังนั้น
ตอนนี้ Alice สามารถวัด Qubit A และ Q เธอไม่สามารถควบคุมผลลัพธ์ของการวัดนั้นได้ เนื่องจากการวัดควอนตัมมีความน่าจะเป็น ดังนั้นเมื่อเธอวัด จะมีผลลัพธ์ที่เป็นไปได้ 4 แบบ และทั้ง 4 แบบมีความน่าจะเป็นเท่ากัน: และ สังเกตว่าแต่ละผลลัพธ์มีผลต่าง Qubit ของ Bob แตกต่างกัน ตัวอย่างเช่น ถ้า Alice พบว่า Qubit ของเธออยู่ใน นั่นได้คอลแลปส์สถานะสาม Qubit ทั้งหมดไปยัง ผลลัพธ์การวัดอื่นๆ ของ Alice ให้สถานะต่างกันสำหรับ Bob สถานะเหล่านี้ถูกรวบรวมในตารางด้านล่าง
| ผลลัพธ์ของ Alice | สถานะของ Bob | คำสั่งถึง Bob | ผลลัพธ์ |
|---|---|---|---|
| ไม่มี | |||
| แล้ว |
สำหรับผลลัพธ์การวัดที่เป็นไปได้ทั้งหมดบน Qubit ของ Alice Qubit ของ Bob จะอยู่ในสถานะที่คล้ายกับสถานะลับที่เดิมอยู่บน Q ในกรณีที่ Alice วัด (แถวแรกของตาราง) Qubit ของ Bob อยู่ในสถานะลับพอดี! ในกรณีอื่นๆ มีบางอย่างผิดปกติเกี่ยวกับสถานะ สัมประสิทธิ์ () สลับกัน หรือมีเครื่องหมาย "-" ที่ควรเป็น "+" หรือทั้งสองอย่าง เพื่อปรับ Qubit ของ Bob ให้เท่ากับสถานะลับพอดี Alice ต้องโทรหา Bob (ใช้วิธีการสื่อสารแบบคลาสสิก) และบอก Bob ให้ทำการดำเนินการเพิ่มเติมบน Qubit ของเขา ตามที่ระบุในตาราง ตัวอย่างเช่น ในแถวที่สาม สัมประสิทธิ์ถูกสลับ ถ้า Alice โทรหา Bob และบอกให้เขานำ gate ไปใช้กับ Qubit ของเขา มันจะเปลี่ยน เป็น และในทางกลับกัน และสถานะลับก็ออกมา
ตอนนี้ควรชัดเจนแล้วว่าทำไมเราจึงไม่สามารถใช้การตั้งค่านี้ส่งข้อมูลเร็วกว่าแสงได้ เราอาจโชคดีและวัด หมายความว่า Bob มีสถานะลับพอดีทันที แต่ Bob ไม่รู้จนกว่าเราจะโทรหาเขาและบอกว่า "เราวัด ดังนั้นคุณไม่ต้องทำอะไร"
ในการทดลองทางความคิด Qubit มักแยกออกทางกายภาพและนำไปยังสถานที่ใหม่ คอมพิวเตอร์ควอนตัม IBM® ใช้ solid-state Qubit บนชิปที่ไม่สามารถแยกออกได้ ดังนั้นแทนที่จะย้าย Alice และ Bob ไปยังตำแหน่งต่างกัน เราจะแยกข้อมูลบนชิปเองโดยใช้สิ่งที่เรียกว่า "swap gate" เพื่อย้ายข้อมูลจาก Qubit หนึ่งไปยังอีก Qubit
การทดลองที่ 1: Teleportation พื้นฐาน
IBM Quantum แนะนำให้จัดการปัญหาการประมวลผลเชิงควอนตัมโดยใช้กรอบการทำงานที่เราเรียกว่า "Qiskit patterns" ประกอบด้วยขั้นตอนดังต่อไปนี้:
- ขั้นตอนที่ 1: แมปปัญหาของคุณไปยัง Circuit ควอนตัม
- ขั้นตอนที่ 2: ปรับแต่ง Circuit สำหรับการรันบน hardware ควอนตัมจริง
- ขั้นตอนที่ 3: รันงานบนคอมพิวเตอร์ควอนตัม IBM โดยใช้ Runtime Primitives
- ขั้นตอนที่ 4: ประมวลผลผลลัพธ์
ขั้นตอนที่ 1: แมปปัญหาของคุณไปยัง Circuit ควอนตัม
คณิตศาสตร์ทั้งหมดที่เราทำด้านบนเป็นการอธิบายขั้นตอนที่ 1 ตอนนี้เราจะนำไปใช้งาน สร้าง Circuit ควอนตัมโดยใช้ Qiskit! เราเริ่มสร้าง Circuit ควอนตัมที่มีสาม Qubit และ entangle Qubit สองตัวของ Alice และ Bob เราจะให้ Qubit เหล่านี้เป็น Qubit 1 และ 2 และสงวน Qubit 0 ไว้สำหรับสถานะลับ
# Step 1: Map your problem to a quantum circuit
# Import some general packages
from qiskit import ClassicalRegister, QuantumCircuit, QuantumRegister
import numpy as np
# Define registers
secret = QuantumRegister(1, "Q")
Alice = QuantumRegister(1, "A")
Bob = QuantumRegister(1, "B")
cr = ClassicalRegister(3, "c")
qc = QuantumCircuit(secret, Alice, Bob, cr)
# We entangle Alice's and Bob's qubits as in our work above. We apply a Hadamard gate and then a CNOT gate.
# Note that the second argument in the CNOT gate is the target.
qc.h(Alice)
qc.cx(Alice, Bob)
# Inserting a barrier changes nothing about the logic. It just allows us to force gates to be positioned in "layers".
qc.barrier()
# Now we will use random variables to create the secret state. Don't worry about the "u" gate and the details.
np.random.seed(42) # fixing seed for repeatability
theta = np.random.uniform(0.0, 1.0) * np.pi # from 0 to pi
varphi = np.random.uniform(0.0, 2.0) * np.pi # from 0 to 2*pi
# Assign the secret state to the qubit on the other side of Alice's (qubit 0), labeled Q
qc.u(theta, varphi, 0.0, secret)
qc.barrier()
# Now entangle Q and Alice's qubits as in the discussion above.
qc.cx(secret, Alice)
qc.h(secret)
qc.barrier()
# Now Alice measures her qubits, and stores the outcomes in the "classical registers" cr[]
qc.measure(Alice, cr[1])
qc.measure(secret, cr[0])
# Now we insert some conditional logic. If Alice measures Q in a "1" we need a Z gate, and if Alice measures A in a "1" we need an X gate (see the table).
with qc.if_test((cr[1], 1)):
qc.x(Bob)
with qc.if_test((cr[0], 1)):
qc.z(Bob)
qc.draw(output="mpl")
นั่นคือทั้งหมดที่เราต้องทำเพื่อ teleport สถานะของ Alice ไปยัง Bob อย่างไรก็ตาม จำไว้ว่าเมื่อเราวัดสถานะควอนตัม เราจะพบ หรือ ดังนั้นในตอนท้ายของทั้งหมดนี้ Bob มีสถานะลับของ Alice อย่างแน่นอน แต่เราไม่สามารถยืนยันสิ่งนี้ได้ง่ายๆ ด้วยการวัด เพื่อให้การวัดบอกเราว่าทำสิ่งนี้ถูกต้อง เราต้องทำเทคนิคหนึ่ง เรามีตัวดำเนินการที่มีชื่อว่า "U" สำหร ับ "unitary" ที่เราใช้เตรียมสถานะลับของ Alice เราสามารถนำ inverse ของ U ไปใช้ตอนท้ายของ Circuit ถ้า U แมปสถานะ ของ Alice ไปยัง inverse ของ U จะแมป ของ Bob กลับไปยัง ดังนั้นส่วนสุดท้ายนี้จะไม่จำเป็นหากเป้าหมายเพียงแค่ย้ายข้อมูลควอนตัม สิ่งนี้ทำเพื่อให้เราตรวจสอบตัวเองเท่านั้น
# Add the inverse of U and measure Bob's qubit.
qc.barrier()
qc.u(theta, varphi, 0.0, Bob).inverse() # inverse of u(theta,varphi,0.0)
qc.measure(Bob, cr[2]) # add measurement gate
qc.draw(output="mpl")
ดังนั้นถ้าเราทำสิ่งนี้ถูกต้อง การวัดของเราบน Qubit ของ Bob ควรได้สถานะ แน่นอนว่าการวัดเหล่านี้มีความน่าจะเป็น ดังนั้นหากมีแม้แต่โอกาสเล็กน้อยที่จะวัด Qubit ของ Bob ให้อยู่ในสถานะ การวัดครั้งเดียวก็อาจได้ เราต้องการทำการวัดหลายครั้งจริงๆ เพื่อให้แน่ใจว่าความน่าจะเป็นของ สูงมาก
ขั้นตอนที่ 2: ปรับแต่งปัญหาสำหรับการรันเชิงควอนตัม
ขั้นตอนนี้นำการดำเนินการที่เราต้องการทำและแสดงออกมาในรูปของฟังก์ชันการทำงานของคอมพิวเตอร์ควอนตัมเฉพาะ และยังแมปปัญหาของเราบน layout ของคอมพิวเตอร์ควอนตัม
เราจะเริ่มต้นด้วยการโหลดแพ็กเกจหลา ยอย่างที่ต้องการสำหรับการสื่อสารกับคอมพิวเตอร์ควอนตัม IBM เราต้องเลือก Backend ที่จะรันด้วย เราสามารถเลือก Backend ที่ว่างที่สุด หรือเลือก Backend เฉพาะที่เราทราบคุณสมบัติ
ด้านล่างมีโค้ดสำหรับบันทึก credentials ในการใช้งานครั้งแรก ตรวจสอบให้แน่ใจว่าลบข้อมูลนี้ออกจาก notebook หลังจากบันทึกลงใน environment แล้ว เพื่อไม่ให้ credentials ของคุณถูกแชร์โดยไม่ตั้งใจเมื่อแชร์ notebook ดู ตั้งค่าบัญชี IBM Cloud และ เริ่มต้น service ในสภาพแวดล้อมที่ไม่น่าเชื่อถือ สำหรับคำแนะนำเพิ่มเติม
# Load the Qiskit Runtime service
from qiskit_ibm_runtime import QiskitRuntimeService
# Load the Qiskit Runtime service
# 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()
# Use the least busy backend, or uncomment the loading of a specific backend like "ibm_brisbane".
backend = service.least_busy(operational=True, simulator=False, min_num_qubits=127)
# backend = service.backend("ibm_brisbane")
print(backend.name)
ibm_sherbrooke
เราเปิดใช้งาน logic บนการวัดอย่างชัดเจน
from qiskit.circuit import IfElseOp
backend.target.add_instruction(IfElseOp, name="if_else")
ตอนนี้เราต้อง "transpile" Circuit ควอนตัม ซึ่งเกี่ยวข้องกับหลายขั้นตอนย่อยและเป็นหัวข้อที่น่าสนใจ เพื่อยกตัวอย่างขั้นตอนย่อย: คอมพิวเตอร์ควอนตัมไม่ใช่ทุกตัวที่สามารถใช้งาน logical gate ทั้งหมดใน Qiskit โดยตรง เราต้องเขียน Gate จาก Circuit ของเราในรูปของ Gate ที่คอมพิวเตอร์ควอนตัมสามารถใช้งานได้ เราสามารถดำเนินกระบวนการนั้นและกระบวนการอื่นๆ โดยใช้ preset pass manager การตั้ง optimization = 3 (ระดับสูงสุดของการปรับแต่ง) ช่วยให้มั่นใจว่าการแมปจาก Circuit ควอนตัมนามธรรมไปยังคำสั่งที่ให้กับคอมพิวเตอร์ควอนตัมมีประสิทธิภาพมากที่สุดเท่าที่การประมวลผลล่วงหน้าของเราจะทำได้
# Step 2: 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(qc)
"Sampler" คือ primitive ที่ออกแบบมาเพื่อสุ่มตัวอย่างสถานะที่เป็นไปได้จาก Circuit ควอนตัม และรวบรวมสถิติว่าสถานะใดอาจถูกวัดและด้วยความน่าจะเป็นเท่าใด เราโหลด Qiskit Runtime Sampler ที่นี่:
# Load the Runtime primitive and session
from qiskit_ibm_runtime import SamplerV2 as Sampler
sampler = Sampler(mode=backend)
ไม่ใช่การคำนวณทั้งหมดบนคอม พิวเตอร์ควอนตัมที่สามารถจำลองได้อย่างสมเหตุสมผลบนคอมพิวเตอร์แบบคลาสสิก teleportation ง่ายๆ นี้สามารถทำได้แน่นอน แต่ไม่น่าแปลกใจเลยที่เราสามารถบันทึกข้อมูลในที่หนึ่งหรืออีกที่หนึ่งได้แบบคลาสสิก เราแนะนำอย่างยิ่งให้ดำเนินการคำนวณเหล่านี้โดยใช้คอมพิวเตอร์ควอนตัม IBM จริง แต่ในกรณีที่คุณใช้งานฟรีรายเดือนหมดแล้ว หรือถ้าบางอย่างต้องเสร็จในชั้นเรียนและรอคิวไม่ได้ โมดูลนี้สามารถทำให้เสร็จได้โดยใช้ simulator เพียงรันเซลล์ด้านล่างและ uncomment บรรทัดที่เกี่ยวข้องในขั้นตอน "Execute"
# Load the backend sampler
from qiskit.primitives import BackendSamplerV2
# Load the Aer simulator and generate a noise model based on the currently-selected backend.
from qiskit_aer import AerSimulator
from qiskit_aer.noise import NoiseModel
noise_model = NoiseModel.from_backend(backend)
# Define a simulator using Aer, and use it in Sampler.
backend_sim = AerSimulator(noise_model=noise_model)
sampler_sim = BackendSamplerV2(backend=backend_sim)
# Alternatively, load a fake backend with generic properties and define a simulator.
# backend_gen = GenericBackendV2(num_qubits=18)
# sampler_gen = BackendSamplerV2(backend=backend_gen)
ขั้นตอนที่ 3: รัน
ใช้ Sampler รันงานของคุณ โดยมี Circuit เป็น argument
job = sampler.run([qc_isa])
# job = sampler_sim.run([qc_isa])
res = job.result()
counts = res[0].data.c.get_counts()
ขั้นตอนที่ 4: การประมวลผลหลังและการวิเคราะห์
มาพล็อตผลลัพธ์และตีความ
# This required 5 s to run on a Heron r2 processor on 10-28-24
from qiskit.visualization import plot_histogram
plot_histogram(counts)
ทดสอบความเข้าใจ
อ่านคำถามด้านล่าง คิดหาคำตอบ แล้วคลิกสามเหลี่ยมเพื่อดูเฉลย
สถานะใดด้านบนบ่งชี้ว่า teleportation สำเร็จ และคุณรู้ได้อย่างไร?
คำตอบ:
สถานะ ทั้งหมดสอดคล้องกับ teleportation ที่สำเร็จ เนื่องจากเราเพิ่ม Gate เพื่อยกเลิกการเตรียมสถานะลับเริ่มต้น ถ้าสถานะลับถูก teleport ไปยัง Qubit ของ Bob สำเร็จ Gate เพิ่มเติมนั้นควรคืน Qubit ของ Bob กลับไปยังสถานะ ดังนั้นสถานะใดก็ตามด้านบนที่มี Qubit ของ Bob (Qubit 0 ซึ่งวัดเป็นส่วนประกอบที่ 0 ของ classical register และดังนั้นสูงสุด/ทางขวาสุด) อยู่ในสถานะ บ่งชี้ความสำเร็จ
พล็อตนี้แสดงผลลัพธ์การวัดทั้งหมดสำหรับสาม Qubit บนการทดลอง 5,000 ครั้งหรือ "shots" เราชี้ให้เห็นก่อนหน้านี้ว่า Alice จะวัดสถานะที่เป็นไปได้ทั้งหมดสำหรับ Qubit A และ Q ด้วยความน่าจะเป็นเท่ากัน เรากำหนด Qubit 0-2 ใน Circuit ให้กับ Q, A และ B ตามลำดับ ในสัญลักษณ์ little-endian Qubit ของ Bob คือทางซ้ายสุด/ต่ำสุด ดังนั้นแท่งสี่ตัวทางซ้ายตรงกับ Qubit ของ Bob อยู่ใน และ Qubit สองตัวอื่นอยู่ในการรวมกันที่เป็นไปได้ทั้งหมดด้วยความน่าจะเป็นประมาณเท่ากัน สังเกตว่าเกือบทั้งหมด (โดยปกติ ~95%) ของการวัดให้ Qubit ของ Bob อยู่ในสถานะ หมายความว่าการตั้งค่าของเราสำเร็จ! มี shots ไม่กี่ตัว (~5%) ที่ให้ Qubit ของ Bob อยู่ในสถานะ สิ่งนั้นไม่ควรเป็นไปได้ตามตรรกะ อย่างไร ก็ตาม คอมพิวเตอร์ควอนตัมสมัยใหม่ทั้งหมดประสบกับ noise และข้อผิดพลาดในระดับที่มากกว่าคอมพิวเตอร์แบบคลาสสิกอย่างมาก และ quantum error correction ยังเป็นสาขาที่กำลังพัฒนา
การทดลองที่ 2: Teleportation ข้ามตัวประมวลผล
อย่างมีเหตุผล ส่วนที่น่าสนใจที่สุดของ quantum teleportation คือสถานะควอนตัมสามารถ teleport ได้ในระยะทางไกลทันที (แม้ว่าการสื่อสารแบบคลาสสิกของ Gate เพิ่มเติมจะไม่ทันที) ดังที่กล่าวไว้แล้ว เราไม่สามารถแตก Qubit ออกจากตัวประมวลผลและย้ายพวกมันไปรอบๆ ได้ แต่เราสามารถย้ายข้อมูลจาก Qubit หนึ่งไปยังอีก Qubit จนกว่า Qubit ที่เกี่ยวข้องกับ teleportation จะอยู่คนละด้านของตัวประมวลผล มาทำซ้ำขั้นตอนที่เราทำด้ านบน แต่ตอนนี้เราจะสร้าง Circuit ที่ใหญ่กว่าพร้อม Qubit เพียงพอที่จะข้ามตัวประมวลผล
ขั้นตอนที่ 1: แมปปัญหาของคุณไปยัง Circuit ควอนตัม
คราวนี้ Qubit ที่ตรงกับ Alice และ Bob จะเปลี่ยนไป ดังนั้นเราจะไม่ตั้งชื่อ Qubit เดี่ยวว่า "A" และอีกตัวว่า "B" แต่เราจะตั้งหมายเลข Qubit และใช้ตัวแปรเพื่อแสดงตำแหน่งปัจจุบันของข้อมูลบน Qubit ที่เป็นของ Alice และ Bob ขั้นตอนอื่นทั้งหมดยกเว้น swap gate เหมือนกับที่อธิบายก่อนหน้า
# Step 1: Map
# Define registers
qr = QuantumRegister(13, "q")
qc = QuantumCircuit(qr, cr)
# Define registers
secret = QuantumRegister(1, "Q")
ebitsa = QuantumRegister(6, "A")
ebitsb = QuantumRegister(6, "B")
# q = ClassicalRegister(1, "q meas")
# a = ClassicalRegister(1, "a")
# b = ClassicalRegister(1, "b")
cr = ClassicalRegister(3, "c")
qc = QuantumCircuit(secret, ebitsa, ebitsb, cr)
# We'll start Alice in the middle of the circuit, then move information outward in both directions.
Alice = 5
Bob = 0
qc.h(ebitsa[Alice])
qc.cx(ebitsa[Alice], ebitsb[Bob])
# Starting with Bob and Alice in the center, we swap their information onto adjacent qubits, until the information is on distant qubits.
for n in range(Alice):
qc.swap(ebitsb[Bob], ebitsb[Bob + 1])
qc.swap(ebitsa[Alice], ebitsa[Alice - 1])
Alice = Alice - 1
Bob = Bob + 1
qc.barrier()
# Create a random state for Alice (qubit zero)
np.random.seed(42) # fixing seed for repeatability
# theta = np.random.uniform(0.0, 1.0) * np.pi #from 0 to pi
theta = 0.3
varphi = np.random.uniform(0.0, 2.0) * np.pi # from 0 to 2*pi
qc.u(theta, varphi, 0.0, secret)
# Entangle Alice's two qubits
qc.cx(secret, ebitsa[Alice])
qc.h(secret)
qc.barrier()
# Make measurements of Alice's qubits and store the results in the classical register.
qc.measure(ebitsa[Alice], cr[1])
qc.measure(secret, cr[0])
# Send instructions to Bob's qubits based on the outcome of Alice's measurements.
with qc.if_test((cr[1], 1)):
qc.x(ebitsb[Bob])
with qc.if_test((cr[0], 1)):
qc.z(ebitsb[Bob])
qc.barrier()
# Invert the preparation we did for Carl's qubit so we can check whether we did this correctly.
qc.u(theta, varphi, 0.0, ebitsb[Bob]).inverse() # inverse of u(theta,varphi,0.0)
qc.measure(ebitsb[Bob], cr[2]) # add measurement gate
qc.draw("mpl")
คุณสามารถเห็นในแผนภาพ Circuit ว่าขั้นตอนตามตรรกะเหมือนกัน ความแตกต่างเพียงอย่างเดียวคือเราใช้ swap gate เพื่อนำสถานะ Qubit ของ Alice จาก Qubit 6 () ขึ้นไปยัง Qubit 1 () ข้างๆ Q และเราใช้ swap gate เพื่อนำสถานะเริ่มต้นของ Bob จาก Qubit 7 () ลงไปยัง Qubit 12 () สังเกตว่าสถานะบน Qubit 12 ไม่เกี่ยวข้องกับสถานะลับของ Q จนกว่าจะมีการวัดบน Qubit 0 และ 1 ที่ห่างไกล และสถานะบน Qubit 12 ไม่เท่ากับสถานะลับจนกว่า และ gate เงื่อนไขจะถูกนำไปใช้