การทดลอง Stern-Gerlach บนคอมพิวเตอร์ควอนตัม
สำหรับโมดูล Qiskit in Classrooms นี้ นักเรียนต้องมีสภาพแวดล้อม Python ที่ใช้งานได้พร้อมติดตั้งแพ็คเกจต่อไปนี้:
qiskitv2.1.0 หรือใหม่กว่าqiskit-ibm-runtimev0.40.1 หรือใหม่กว่าqiskit-aerv0.17.0 หรือใหม่กว่าqiskit.visualizationnumpypylatexenc
เพื่อตั้งค่าและติดตั้งแพ็คเกจข้างต้น ดูคู่มือ ติดตั้ง Qiskit เพื่อรัน job บนคอมพิวเตอร์ควอนตัมจริง นักเรียนจะต้องสร้างบัญชีกับ IBM Quantum® โดยทำตามขั้นตอนในคู่มือ ตั้งค่าบัญชี IBM Cloud ของคุณ
โมดูลนี้ถูกทดสอบและใช้เวลา QPU 2 วินาที นี่เป็นการประมาณเท่านั้น การใช้งานจริงของคุณอาจแตกต่างกัน
# 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'
ดูการนำเสนอโมดูลโดย Dr. Katie McCormick ด้านล่าง หรือคลิก ที่นี่ เพื่อดูบน YouTube
พื้นหลัง
ในช่วงต้นทศวรรษที่ 1900 หลักฐานของพฤติกรรมเชิงควอนตัมในระดับอะตอมสะสมมากขึ้นเรื่อยๆ การตีความข้อมูลที่ประสบความสำเร็จมากมาย เช่น คำอธิบายของ Max Planck เกี่ยวกับ ultraviolet catastrophe และการทดลองข อง Otto Stern และ Walther Gerlach มีบทบาทสำคัญในการโน้มน้าวให้โลกยอมรับว่าระบบกลศาสตร์ควอนตัมเป็นสิ่งจำเป็น และปรากฏการณ์ทางกายภาพบางอย่างมีลักษณะเชิงควอนตัม ในกรณีของการทดลอง Stern-Gerlach (คิดขึ้นโดย Stern ในปี 1921 และดำเนินการโดย Stern และ Gerlach ในปี 1922) เป้าหมายคือการตรวจสอบการควอนตัมของโมเมนตัมเชิงมุมในอะตอม
ในช่วงเวลาเดียวกัน แบบจำลองอะตอมที่แพร่หลายในขณะนั้นคือแบบจำลอง Bohr-Sommerfeld ซึ่งเป็นการขยายจากแบบจำลอง Bohr และเช่นเดียวกับแบบจำลอง Bohr มันทำนายว่าอิเล็กตรอนอยู่ในวงโคจรควอนตัมบางวงที่คล้ายกับดาวเคราะห์โคจรรอบดวงอาทิตย์

แม้ว่าในท้ายที่สุดการอธิบายนี้จะไม่เพียงพอที่จะอธิบายพฤติกรรมเชิงกลศาสตร์ควอนตัมของอะตอม แต่โดยรวมแล้วมันทำนายปรากฏการณ์ที่สังเกตได้หลายอย่าง เช่น เส้นสเปกตรัมแยกของอะตอม วงโคจรควอนตัมของอิเล็กตรอนที่มีพลังงานเฉพาะสอดคล้องกับค่าโมเมนตัมเชิงมุมที่เป็นควอนตัม นี่คือโมเมนตัมเชิงมุมของวงโคจรที่ Stern และ Gerlach ต้องการสังเกตในการทดลองของพวกเขา แม้ว่าการทดลองนี้ใช้ได้กับโมเมนตัมเชิงมุมประเภทใดก็ตาม รวมถึงสปิน คุณมักได้ยินเกี่ยวกับการทดลอง Stern-Gerlach ที่นำไปใช้กับสปิน จุดเน้นของการทดลองดั้งเดิมคือโมเมนตัมเชิงมุมของวงโคจรเพียงเพราะ George Uhlenbeck และ Samuel Goudsmit จะยังไม่ตั้งทฤษฎีเกี่ยวกับการมีอยู่ของสปินจนถึงปี 1925
ไม่ว่าจะเป็นโมเมนตัมเชิงมุมประเภทใด ประจุที่มีโมเมนตัมเชิงมุมจะมีโมเมนต์แม่เหล็ก ในการอธิบายแบบคลาสสิกของการเคลื่อนที่แบบวงโคจร เราคาดว่าอนุภาคที่มีประจุ มวล และโมเมนตัมเชิงมุม จะมีโมเมนต์แม่เหล็ก ดังนี้
ปรากฏว่าสูตรเกือบเดียวกันนี้ใช้ได้กับโมเมนตัมเชิงมุมในกลศาสตร์ควอนตัม โดยมีเงื่อนไขเพิ่มอัตราส่วนตัวเลขที่เกี่ยวข้องกับประเภทของโมเมนตัมเชิงมุม เรียกว่า g-factor เมื่อรวมโมเมนตัมเชิงมุมป ระเภทต่างๆ หรือนิยามเป็นประเภทโดยทั่วไป มักเห็น ใช้แทน ดังนั้นเราเขียน:
สำหรับวัตถุคลาสสิก สำหรับอิเล็กตรอน และมีค่าอื่นๆ อีกมากมายสำหรับนิวเคลียสและอนุภาคย่อยของอะตอมต่างๆ ประเด็นหลักคือโมเมนตัมเชิงมุมเชิงควอนตัมหมายความว่าโมเมนต์แม่เหล็กก็เป็นควอนตัมด้วย!
โมเมนต์แม่เหล็กนี้จะสัมผัสแรงบิดในสนามแม่เหล็ก:
และจะสัมผัสแรงในสนามแม่เหล็กที่มีความชันไม่เป็นศูนย์:
เรามักพิจารณาสมการข้างต้นทีละองค์ประกอบ ดังนั้นอาจสะดวกที่จะคิดถึงองค์ประกอบ :
รวมสมการเข้าด้วยกัน เราได้
Stern และ Gerlach ไม่ทราบเกี่ยวกับ factor แต่แม้จะมีมันในสมการ เราก็มีแรงที่เท่ากับค่าคงที่ที่รู้จักหรือว ัดได้หลายตัวคูณกับโมเมนตัมเชิงมุม ดังนั้นโดยใช้สนามแม่เหล็กที่มีความชันที่รู้จัก และวัดการเบี่ยงเบนของอนุภาคขณะผ่านสนาม เราควรได้ข้อมูลเกี่ยวกับโมเมนตัมเชิงมุม นี่คือแก่นของการทดลอง Stern-Gerlach

ภาพ การทดลอง Stern-Gerlach[1]: อะตอมของซิลเวอร์เดินทางผ่านสนามแม่เหล็กที่ไม่สม่ำเสมอ และถูกเบี่ยงเบนขึ้นหรือลงขึ้นอยู่กับสปินของมัน แบบคลาสสิกเราคาดว่าจะเห็นการกระจายต่อเนื่องบนหน้าจอ แต่ในการทดลองเราเห็นสองจุดที่แตกต่างกัน
อะตอมของซิลเวอร์ที่เป็นกลางถูกให้ความร้อนในเตาอบ เมื่อลำของอะตอมซิลเวอร์ออกมาจากเตาอบ ตัวคอลลิเมตเตอร์ลำถูกใช้เพื่อเลือกเฉพาะอะตอมที่เดินทางใกล้กับศูนย์กลางของสนามแม่เหล็กที่ไม่สม่ำเสมอ แน่นอนว่าอะตอมบางส่วนเบี่ยงเบนไปทางซ้ายหรือขวาเล็กน้อย และสัมผัสกับความชันที่อ่อนกว่าในสนาม หรือไม่มีความชันเลย ดังนั้น เราไม่ได้กังวลมากเกินไปกับพฤติกรรมของอะตอมที่อยู่ทางซ้ายหรือขวามากเกินไป เราสนใจสิ่งที่เกิดขึ้นกับอะตอมที่เดินทางลงตรงกลางของช่อง ซึ่งความชันของสนามแม่เหล็กจะให้แรงที่เบี่ยงเบนอะตอมในทิศทาง เท่านั้น
เราควรคาดหวังอะไร แบบคลาสสิก?
อะตอมเหล่านี้จะมีพฤติกรรมอย่างไรหากมันเหมือนกับแม่เหล็กคลาสสิกขนาดใหญ่? คุณสามารถทำการทดลองได้ ลองจินตนาการถึงการยิงแม่เหล็กนีโอดิเมียมขนาดเล็กผ่านแม่เหล็กขนาดใหญ่ที่ทรงพลัง การวางแนวของแม่เหล็กขนาดเล็กนั้นสุ่ม แต่เมื่อผ่านแม่เหล็กขนาดใหญ่ มันจะจัดตัวเองอย่างรวดเร็วให้สอดคล้องกับสนาม และถูกดึงดูดไปยังแม่เหล็กขนาดใหญ่ แม่เหล็กขนาดเล็กส่วนใหญ่ถูกเบี่ยงเบนไปทางแม่เหล็กขนาดใหญ่ ผู้สังเกตที่เฉียบแหลมอาจตั้งคำถามว่า "แล้วการอนุรักษ์พลังงานล่ะ?"
แน่นอน โมเมนต์แม่เหล็กในสนามแม่เหล็กภายนอกมีพลังงานศักย์ที่เกี่ยวข้อง:
ดังนั้นหากโมเมนต์แม่เหล็กหมุนในสนามแม่เหล็กภายนอก จะมีการเปลี่ยนแปลงพลังงานดังนี้:
ในกรณีพิเศษของแม่เหล็กขนาดเล็กที่อยู่ตรงข้ามกับสนามภายนอกอย่างสมบูรณ์และพลิกกลับมาสอดคล้อง นี่จะสอดคล้องกับการลดลงของพลังงานศักย์:
แล้วพลังงานนั้นไปไหน? แม่เหล็กคลาสสิกอย่างแม่เหล็กติดตู้เย็นนีโอดิเมียมขนาดเล็กมีอนุภาคจำนวนมากและสามารถกระจายพลังงานจำนวนเกือบใดก็ได้ออกเป็นความร้อน มุมเริ่มต้นและสุดท้ายระหว่างโมเมนต์แม่เหล็กและสนามแม่เหล็กภายนอกอาจเป็นอะไรก็ได้ และอย่างน้อยการวางแนวเริ่มต้นก ็จะสุ่ม ดังนั้นพลังงานที่แตกต่างกันจะถูกกระจายออกเป็นความร้อนสำหรับแม่เหล็กขนาดเล็กแต่ละชิ้น แต่ในเชิงคลาสสิกนี่ไม่ใช่ปัญหา เนื่องจากกลุ่มของอนุภาคคลาสสิกสามารถกระจายพลังงานจำนวนใดก็ได้ออกเป็นความร้อน
เราควรคาดหวังอะไรเมื่อนำการคิดแบบคลาสสิกไปใช้กับระดับอะตอม?
อย่างน้อยก็ไม่เหมือนกันสำหรับแม่เหล็กระดับอะตอม เพราะมีอนุภาคน้อยกว่า มีระดับความเสรีน้อยกว่าที่พลังงานจะถ่ายเทออกไปได้ ข้อเสนอของกลศาสตร์ควอนตัมยุคแรกแนะนำเพิ่มเติมว่าพลังงานที่สามารถดูดซับโดยอนุภาคแต่ละตัว เช่น อิเล็กตรอน จะเป็นควอนตัม หมายความว่าอิเล็กตรอนสามารถดูดซับพลังงานได้เฉพาะบางปริมาณที่แน่นอนเท่านั้น เนื่องจากการวางแนวสุ่มเริ่มต้นจะต้องการการกระจายพลังงานในปริมาณสุ่ม สิ่งนี้ไม่ควรเป็นไปได้สำหรับระบบที่มีระดับพลังงานเป็นควอนตัม พลังงานส่วนเกินไม่สามารถกระจายออกเป็นความร้อนได้ แล้วจะเกิดอะไรขึ้นแทน?
ตรวจสอบความเข้าใจของคุณ
อ่านคำถามด้านล่าง คิดคำตอบของคุณ จากนั้นคลิกสามเหลี่ยมเพื่อดูคำตอบ
อธิบายสิ่งที่คุณคิดว่าจะเกิดขึ้นในสถานการณ์ที่อธิบายข้างต้น นั่นคือ คุณมีแม่เหล็กขนาดอะตอมที่ไม่สามารถกระจายพลัง งานออกเป็นความร้อนได้ ดังนั้นพลังงานศักย์แม่เหล็กเริ่มต้นใดๆ จะต้องอยู่ในระบบ แต่แรงบิดถูกใช้โดยสนามแม่เหล็กภายนอก ซึ่งพยายามหมุนแม่เหล็กขนาดเล็กให้สอดคล้องกับสนามภายนอก จะเกิดอะไรขึ้น?
คำตอบ:
โมเมนต์แม่เหล็กขนาดเล็กจะหมุนไปสู่การสอดคล้องกับสนามภายนอก แต่เมื่อมันสอดคล้องกันชั่วคราว มันจะมีพลังงานจลน์การหมุนที่จะทำให้มันหมุนต่อผ่านสนามและกลับออกจากการสอดคล้อง พฤติกรรมนี้สามารถเห็นได้แม้ในแม่เหล็กคลาสสิกขนาดใหญ่ แต่ในระบบคลาสสิกเหล่านั้น การแกว่งของโมเมนต์แม่เหล็กขนาดเล็กจะหยุดในที่สุดเมื่อพลังงานถูกกระจายออกเป็นความร้อน แต่ในระบบที่ไม่มีกลไกการกระจายดังกล่าว การแกว่งควรดำเนินต่อไปอย่างไม่มีกำหนด
จากพฤติกรรมที่คาดหวังในค ำตอบข้างต้น คุณคาดว่าจะเห็นการกระจายของอนุภาคแม่เหล็กแบบใดบนหน้าจอ?
คำตอบ:
การกระจายที่ราบรื่นตั้งแต่การเบี่ยงเบนสูงสุดไปทางด้านที่แข็งแกร่งกว่าของสนามแม่เหล็ก (อนุภาคเหล่านั้นที่เริ่มต้นในแนวเดียวกับสนามภายนอก) ไปจนถึงการเบี่ยงเบนสูงสุดไปทางด้านที่อ่อนแอกว่าของสนาม (อนุภาคที่เริ่มต้นในแนวตรงข้ามกับสนามภายนอก) และทุกการเบี่ยงเบนระหว่างนั้น สอดคล้องกับทุกการวางแนวเริ่มต้นระหว่างขีดสุดเหล่านั้น

กลศาสตร์ควอนตัมจะทำนายอะไร?
บางทีความเป็นไปได้ที่แปลกที่สุดคือ: ถ้าโมเมนตัมเชิงมุมของอิเล็กตรอนเป็นควอนตัม แต่การฉายภาพของมันบนแกนใดๆ ก็เป็นควอนตัมด้วย? การควอนตัมของโมเมนตัมเชิงมุมในฐานะขนาดนั้นน่าสนใจ แต่อาจพยายามโต้แย้งผ่านมันโดยใช้สัญชาตญาณคลาสสิก ในแบบที่วงโคจรของดาวเคราะห์ตั้งอยู่ในเส้นทางที่คงที่ที่ไม่ตัดกัน มีเฉพาะโมเมนตัมเชิงมุมบางค่าที่อนุญาต แต่ถ้าเวกเตอร์โมเมนตัมเชิงมุมนั้นสามารถชี้ตรงตาม หรือตรงข้าม เท่านั้น แต่ไม่มีองค์ประกอบอื่นตาม ? ถ้าเมื่อวัดในทิศทางอื่น เวกเตอร์สามารถชี้ตาม ทั้งหมดหรือตรงข้าม ทั้งหมด และไม่มีกลาง? นั่นจะแปลกในแบบที่ขัดกับสัญชาตญาณคลาสสิกทั้งหมด
ตรวจสอ บความเข้าใจของคุณ
อ่านคำถามด้านล่าง คิดคำตอบของคุณ จากนั้นคลิกสามเหลี่ยมเพื่อดูคำตอบ
คุณคาดว่าจะเห็นการกระจายของอนุภาคบนหน้าจอแบบใดในกรณีสุดท้ายนี้ ที่การฉายภาพของโมเมนตัมเชิงมุมตามทิศทางของสนามเป็นควอนตัม รู้สึกอิสระที่จะพิจารณาเฉพาะอนุภาคที่ผ่านตรงกลางของอุปกรณ์ หรือรวมอนุภาคที่เบี่ยงเบนเล็กน้อยออกไปด้านข้างที่ความชันอ่อนแอกว่า แค่ระบุให้ชัดเจน
คำตอบ:
อนุภาคที่อยู่ตรงกลางของอุปกรณ์จะสัมผัสกับสนามที่ไม่สม่ำเสมอเพียงสนามเดียวและทั้งหมดจะถูกวัดให้มีหนึ่งในสองการวางแนวของโมเมนต์แม่เหล็ก ดังนั้น พวกมันจะถูกเบี่ยงเบนสูงส ุดตามความชันหรือสูงสุดขัดต่อความชัน และไม่มีอะไรระหว่างนั้น แน่นอน ด้านข้างทั้งสอง ที่ความชันอ่อนกว่า การเบี่ยงเบนจะน้อยกว่า ที่ตำแหน่งด้านข้างที่ใหญ่มาก อาจอยู่นอกความชันทั้งหมด และอาจมีเพียงพื้นที่เดียวของอนุภาคที่ไม่ถูกเบี่ยงเบน

Qubit จะช่วยให้เราทดสอบสิ่งนี้ได้อย่างไร?
คอมพิวเตอร์ควอนตัมส่วนใหญ่ใช้ "Qubit" — อนาล็อกควอนตัมของบิตคลาสสิก โดยเฉพาะอย่างยิ่ง พวกมันถูกออกแบบให้เป็นระบบสองระดับ คล้ายกับสถานะ "เปิด"/"ปิด" ของบิตคลาสสิก กระบวนทัศน์การคำนวณควอนตัมที่ใช้ระบบสามระดับ (เรียกว่า "qutrits") หรือระบบหลายระดับ (เรียกว่า "qudits") มีอยู่จริง แต่งานส่วนใหญ่มุ่งเน้นที่ Qubit โดยเฉพาะอย่างยิ่ง คอมพิวเตอร์ควอนตัม IBM® ใช้สิ่งที่เรียกว่า fixed-frequency transmon qubits สิ่งเหล่านี้แตกต่างอย่างมากจากโมเมนตัมเชิงมุมของวงโคจรหรือสปินของอะตอม แต่เช่นเดียวกับสปินของอิเล็กตรอน Qubit ของ IBM® เป็นระบบกลศาสตร์ควอนตัมที่สามารถโต้ตอบกับแสงและสามารถทำการวัดได้ อันที่จริง มักพบการเปรียบเทียบระหว่างสถานะของสปินกลศาสตร์ควอนตัมและสถานะเชิงคำนวณของ Qubit ตัวอย่างเช่น มักเห็นสถานะ "spin-up" เชื่อมโยงกับสถานะเชิงคำนวณ 0 และ "spin-down" เชื่อมโยงกับสถานะเชิงคำนวณ 1:
เราสามารถใช้ความคล้ายคลึงเหล่านี้เพื่อสังเกตพฤติกรรมกลศาสตร์ควอนตัมในคอมพิวเตอร์ควอนตัม IBM ที่เลียนแบบพฤติกรรมกลศาสตร์ควอนตัมของโมเมนตัมเชิงมุมของวงโคจรหรือสปินในอะตอม เราจะทำการสังเกตที่คล้ายกันโดยใช้การรวมเชิงเส้นของสถานะเหล่านี้ที่ช่วยให้เราขยายการอภิปรายไปยังโมเมนตัมเชิงมุมในทิศทางใดก็ตาม
การทดลองที่หนึ่ง: การวัดครั้งเดียว
ในการทดลองแรกนี้และตลอดทั้งโมดูล เราจะใช้กรอบสำหรับการคำนวณควอนตัมที่รู้จักกันในชื่อ "Qiskit patterns" ซึ่งแบ่งเวิร์กโฟลว์ออกเ ป็นขั้นตอนดังต่อไปนี้:
- ขั้นตอนที่ 1: แมป input แบบคลาสสิกไปยังปัญหาควอนตัม
- ขั้นตอนที่ 2: ปรับปัญหาให้เหมาะสมสำหรับการรันบนควอนตัม
- ขั้นตอนที่ 3: รันโดยใช้ Qiskit Runtime Primitives
- ขั้นตอนที่ 4: การประมวลผลภายหลังและการวิเคราะห์แบบคลาสสิก
เราจะทำตามขั้นตอนเหล่านี้โดยทั่วไป แม้ว่าเราอาจไม่ได้ระบุชื่ออย่างชัดเจนเสมอไป
ขั้นตอนที่ 1: แมป input แบบคลาสสิกไปยังปัญหาควอนตัม
ที่นี่ input แบบคลาสสิกคือการวางแนวของสปินก่อนการวัดในอุปกรณ์ Stern-Gerlach ไม่ต้องกังวลมากเกินไปเกี่ยวกับลักษณะที่แท้จริงของสถานะควอนตัมก่อนการวัด นั่ นเป็นหัวข้อของโมดูล Qiskit Classrooms อื่น เกี่ยวกับทฤษฎีบทของ Bell
โปรดทราบว่าคอมพิวเตอร์ควอนตัม IBM วัดสถานะตามแกน ดังนั้นการทดลองแรกนี้จะคล้ายกับการทดลอง Stern-Gerlach ที่มีความชันของสนามแม่เหล็กตาม มาก เราจะเห็นวิธีเปลี่ยนระบบเพื่อวัดตามทิศทางต่างๆ ในภายหลัง
มาเริ่มต้นด้วยการสร้างอนาล็อกของสถานะสปิน นั่นคือ ส่วนผสมของ และ หรือเทียบเท่ากับ และ เราได้เสนอค่าเริ่มต้นบางค่า แต่รู้สึกอิสระที่จะทดลองค่าอื่นหรือแม้แต่ค่าสุ่ม
import random
from numpy import pi
import numpy as np
# Use these lines to choose your own arbitrary state vector and normalize it.
# a = 2
# b = (1+1j)
# norm = np.sqrt(a*np.conjugate(a)+b*np.conjugate(b))
# a = a/norm
# b = b/norm
# print(a,b)
# Use these lines if you would rather look at at random spin orientations.
a = random.random()
b = random.random()
norm = np.sqrt(a * np.conjugate(a) + b * np.conjugate(b))
a = a / norm
b = b / norm
print(a, b)
0.7032089086145691 0.7109832845047109
ตอนนี้เราจะใช้มุมข้างต้นเป็นพารามิเตอร์ใน Circuit ควอนตัม เราพิจารณาอนุภาคเพียงหนึ่งตัวในแต่ละครั้ง ดังนั้นเราจะใช้เพียง Qubit เดียวใน Circuit ของเรา และเราต้องการเพียง classical register เดียว
from qiskit.circuit import QuantumRegister, ClassicalRegister, QuantumCircuit, Parameter
# Define registers
qr = QuantumRegister(1, "q")
cr = ClassicalRegister(1, "c")
qc = QuantumCircuit(qr, cr)
# Initialize the quantum state
qc.initialize([a, b])
qc.measure(0, 0)
qc.draw("mpl")
ขั้นตอนที่ 2: ปรับปัญหาให้เหมาะสมสำหรับการรันบนควอนตัม
เพื่อรันการทดลองของเราบนคอมพิวเตอร์ควอนตัมจริง เราต้องโหลด Qiskit Runtime Service และเลือกคอมพิวเตอร์ควอนตัม (หรือ "Backend") ด้านล่าง เราเพียงแค่เลือกคอมพิวเตอร์ควอนตัมที่ไม่ยุ่งที่สุดที่มีอยู่
มีโค้ดด้านล่างสำหรับบันทึก credentials ของคุณในการใช้งานครั้งแรก อย่าลืมลบข้อมูลนี้ออกจาก notebook หลังจากบันทึกลงในสภาพแวดล้อมของคุณ เพื่อไม่ให้ credentials ของคุณถูกแบ่งปันโดยไม่ตั้งใจเมื่อคุณแบ่งปัน notebook ดู ตั้งค่าบัญชี IBM Cloud ของคุณ และ เริ่มต้นใช้งานบริการในสภาพแวดล้อมที่ไม่น่าเชื่อถือ สำหรับคำแนะนำเพิ่มเติม
# Load the Qiskit Runtime service
from qiskit_ibm_runtime import QiskitRuntimeService
# 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')
# Syntax for specifying a channel and instance (if you need to change from the default set above)
# service = QiskitRuntimeService(channel='<channel name here>', instance="<your instance name here>")
# Load saved credentials
service = QiskitRuntimeService()
# Load the Runtime primitive and session
from qiskit_ibm_runtime import Session, SamplerV2 as Sampler
# Use the least busy backend, specify options as needed
# backend = service.least_busy(operational=True, simulator=False, min_num_qubits = 127)
backend = service.least_busy()
print(backend.name)
ibm_sherbrooke
ตอนนี้เราต้อง transpile Circuit ซึ่งหมายความว่าเราต้องแมป Circuit ของเราบน Gate พื้นฐานที่มีอยู่ในคอมพิวเตอร์ควอนตัมที่เลือก และเราต้องการปรับปรุง Circuit ของเราสำหรับการรันบนคอมพิวเตอร์ควอนตัมนั้น
# Transpile the circuit and optimize for running on the quantum computer selected
from qiskit.transpiler.preset_passmanagers import generate_preset_pass_manager
pm = generate_preset_pass_manager(optimization_level=3, backend=backend)
qc_ibm = pm.run(qc)
ขั้นตอนที่ 3: รันโดยใช้ Qiskit Runtime Primitives
ตอนนี้เราต้องการรันบนคอมพิวเตอร์ควอนตัมจริง syntax ที่จำเป็นทั้งหมดสำหรับนั้นอยู่ในบล็อกโค้ดด้านล่าง หากคุณหมดเวลาที่จัดสรรบนคอมพิวเตอร์ควอนตัมจริง หรือหากคุณไม่มีการเชื่อมต่ออินเทอร์เน็ต คุณสามารถ uncomment บล็อกโค้ดถัดไป ซึ่งจะรันโค้ดบน local simulator
# Specify that we want to use only a single shot, to represent a single measurement of a spin in a SG device.
num_shots = 1
# Evaluate the problem using a QPU via Qiskit IBM Runtime
# The best practice is to use a session as shown below. This is available to Premium Plan, Flex Plan, and On-Prem (IBM Quantum Platform API) Plan users.
with Session(backend=backend) as session:
sampler = Sampler(mode=session)
dist = sampler.run([qc_ibm], shots=num_shots).result()
session.close()
counts = dist[0].data.c.get_counts()
# Open users can still carry out this experiment, but without making use of a session, meaning repeated queuing is possible.
# from qiskit_ibm_runtime import Batch,
# batch = Batch(backend=backend)
# sampler = Sampler(mode=batch)
# dist = sampler.run([qc_ibm], shots=num_shots).result()
# Close the batch because no context manager was used.
# batch.close()
# counts = dist[0].data.c.get_counts()
ใช้โค้ดด้านล่างหากคุณไม่สามารถรันการทดลองบนคอมพิวเตอร์ควอนตัมจริงได้
# This uses a local simulator
# from qiskit_aer import AerSimulator
# This generates a simulator that mimics the real quantum system
# backend_sim = AerSimulator.from_backend(backend)
# Import an estimator, this time from qiskit (we import from Runtime for real hardware)
# from qiskit.primitives import BackendSamplerV2
# sampler = BackendSamplerV2(backend = backend_sim)
# num_shots = 1
# This runs the job
# dist = sampler.run([qc_ibm], shots = num_shots).result()
# This selects measurement counts for the 0th circuit, which in this case is the only circuit
# counts=dist[0].data.c.get_counts()
ขั้นตอนที่ 4: การประมวลผลภายหลังและการวิเคราะห์แบบคลาสสิก
สำหรับการทดลองง่ายๆ นี้ การวิเคราะห์แบบคลาสสิกเป็นเพียงการแสดงผลลัพธ์การทดลอง
from qiskit.visualization import plot_histogram
print("counts = ", counts)
plot_histogram(counts)
counts = {'0': 1}
เราทำการวัดหนึ่งครั้งและได้ "0" ซึ่งไม่น่าแปลกใจสำหรับเรา เรารู้ว่าเรากำลังใช้คอมพิวเตอร์ควอนตัมที่ประกอบด้วย Qubit และเราคุ้นเคยกับบิตคลาสสิกที่ส่งคืน 0 หรือ 1 แต่จำไว้ว่า: นี่คืออนาล็อกการคำนวณควอนตัมของการทดลองที่ทำกับอนุภาคที่มีโมเมนต์แม่เหล็ก หากเราคาดหวังการกระจายสม่ำเสมอระหว่าง 0 และ +1 มันอาจทำให้เราแปลกใจที่ได้ค่าขีดสุดบนการวัดครั้งแรก การควอนตัมที่น่าประหลาดใจของผลลัพธ์ในการทดลอง Stern-Gerlach นำเราไปสู่ความเข้าใจที่ดีขึ้นเกี่ยวกับธรรมชาติ และในที่สุดก็ช่วยให้เราสร้างคอมพิวเตอร์ควอนตัมได้
มาดูว่าจะเกิดอะไรขึ้นเมื่อเราทำการวัดกลุ่ม
การทดลองที่สอง: การวัดอนุภาคหลายตัว
เพื่อรวบรวมสถิติจากการวัดดังกล่าวจำนวนมาก เราไม่จำเป็นต้องทำซ้ำขั้นตอนที่ 1 และ 2 เราสามารถเพิ่มจำนวน shots ในการทดลองของเราได้ รู้สึกอิสระที่จะทดลองจำนวน shots ในตัวอย่างของขั้นตอนที่ 3 ด้านล่าง
from qiskit_ibm_runtime import Session, SamplerV2 as Sampler
num_shots = 100
# Evaluate the problem using a QPU via Qiskit IBM Runtime
# The best practice is to use a session as shown below. This is available to Premium Plan, Flex Plan, and On-Prem (IBM Quantum Platform API) Plan users.
with Session(backend=backend) as session:
sampler = Sampler(mode=session)
dist = sampler.run([qc_ibm], shots=num_shots).result()
session.close()
counts = dist[0].data.c.get_counts()
# Open users can still carry out this experiment, but without making use of a session, meaning repeated queuing is possible.
# batch = Batch(backend=backend)
# sampler = Sampler(mode=batch)
# dist = sampler.run([qc_ibm], shots=num_shots).result()
# Close the batch because no context manager was used.
# batch.close()
# counts = dist[0].data.c.get_counts()
เช่นเดียวกับก่อนหน้า หากคุณไม่สามารถรันบนคอมพิวเตอร์ควอนตัมจริงได้ ให้ uncomment บล็อกด้านบนจากการทด ลองแรก และเพียงเปลี่ยน num_shots = 1 เป็น num_shots = 100 หรือมากกว่า
plot_histogram(counts)
เราเห็นว่าบางครั้งวัดได้ 0 และบางครั้งวัดได้ 1 โปรดสังเกตว่าเราไม่เคยวัดได้อย่างอื่น! คุณสามารถเปลี่ยนจำนวน shots และสังเกตว่าความน่าจะเป็นของการวัด 0 หรือ 1 ดูเหมือนค่อนข้างสม่ำเสมอระหว่างการรันที่แตกต่างกันด้วยจำนวน shots ที่แตกต่างกัน ดังนั้น บางอย่างเกี่ยวกับการเตรียมสถานะดูเหมือนจะกำหนดความน่าจะเป็นของผลลัพธ์การวัด แม้ว่าการวัดใดๆ ครั้งหนึ่งอาจให้ 0 หรือ 1
การทดลองที่สาม: สปินสุ่มในเตาอบ
ในการทดลอง Stern-Gerlach นักวิจัยไม่สามารถระบุมุมที่เวกเตอร์โมเมนตัมเชิงมุมจะออกมาจากเตาอบได้ การวางแนวนั้นสุ่ม (หรืออะไรที่ลึกลับกว่านั้น! ดูโมดูล Qiskit Classroom เกี่ยวกับทฤษฎีบทของ Bell) อนาล็อกที่สมเหตุสมผลของการทดลองนั้นคือให้เราเริ่มต้นสถานะของ Qubit โดยสุ่มและทำการวัดหลายครั้ง
ขั้นตอนที่ 1: แมป input แบบคลาสสิกไปยังปัญหาควอนตัม
Circuit ที่เราต้องการสร้างนั้นเหมือนกับก่อนหน้า ความแตกต่างเพียงอย่างเดียวคือครั้งนี้เราจะสร้าง Circuit โดยใช้ Gate ที่มีพารามิเตอร์อิสระ และ ค่าตัวเลขสำหรับพารามิเตอร์เหล่านั้นจะถูกกำหนดสำหรับแต่ละการรันใหม่
# from qiskit.circuit import QuantumCircuit, Parameter
theta = Parameter("θ")
phi = Parameter("$\phi$")
# Define registers
qr = QuantumRegister(1, "q")
cr = ClassicalRegister(1, "c")
qc = QuantumCircuit(qr, cr)
# Add rotation gates for rotating the state of qubit 0 to random orientations
qc.rx(theta, 0)
qc.rz(phi, 0)
qc.measure(0, 0)
qc.draw("mpl")
การรัน Circuit ควอนตัมสำหรับเพียง shot เดียวและทำเช่นนั้นสำหรับการกำหนดค่าสุ่มจำนวนมากเป็นเวิร์กโฟลว์ที่ผิดปกติสำหรับคอมพิวเตอร์ควอนตัม แน่นอนว่าสามารถทำได้ แต่เพื่อความง่าย เราจะใช้ local simulator ที่นี่
# This uses a local simulator
from qiskit_aer import AerSimulator
# Import an estimator, this time from qiskit (we import from Runtime for real hardware)
from qiskit.primitives import BackendSamplerV2
# This generates a simulator that mimics the real quantum system
backend_sim = AerSimulator.from_backend(backend)
sampler_sim = BackendSamplerV2(backend=backend_sim)
# from qiskit.primitives import BackendSamplerV2
# sampler = BackendSamplerV2(backend=backend)
# A list to store the accumulated probabilities of the two possible measurement outcomes.
probslist = {"0": 0.0, "1": 0.0}
# Choose how many "particles"/measurements
measurements = 100
num_shots = 1
for i in range(measurements):
# Assign a random orientation for each measurement
phi = random.random() * 2 * pi
theta = random.random() * 2 * pi
angles = [phi, theta]
circuit = qc.assign_parameters(angles)
qc_ibm = pm.run(circuit)
# Run the circuit
# job = sampler.run([circuit],num_shots = 1)
dist = sampler_sim.run([qc_ibm], shots=num_shots).result()
# Update the list of probabilities
zeroterm = dist[0].data.c.get_counts().get("0") or 0
oneterm = dist[0].data.c.get_counts().get("1") or 0
probslist.update({"0": probslist.get("0") + zeroterm})
probslist.update({"1": probslist.get("1") + oneterm})
probslist.update({"0": probslist.get("0") / measurements})
probslist.update({"1": probslist.get("1") / measurements})
# print(probslist)
plot_histogram(probslist)
เราจึงเห็นว่าสถานะเริ่มต้นสุ่มของ Qubit (สอดคล้องกับการวางแนวสุ่มของโมเมนตัมเชิงมุมในการทดลอง Stern-Gerlach) ให้จำนวน 0 และ 1 ที่คล้ายคลึงกัน (เช่นเดียวกับจำนวนสถานะ spin up และ spin down ที่คล้ายกัน) นี่คือสิ่งที่การทดลอง Stern-Gerlach ดั้งเดิมแสดงให้เห็น
การทดลองที่สี่: การวัดซ้ำ
เมื่อ Qubit เริ่มต้นในสถานะสุ่ม เราเห็นว่ามีโอกาสประมาณ 50-50 ในการวัดค่าขีดสุดหนึ่งมากกว่าอีกค่าหนึ่ง แต่จะเกิดอะไรขึ้นกับสถานะของ Qubit (หรือโมเมนตัมเชิงมุมของอนุภาค) หลังจากการวัด? เพื่อตอบคำถามนั้น เราต้องกำหนด Circuit ที่ช่วยให้เราทำการวัดหลายครั้งบน Qubit เดียวกัน มาสร้าง Circuit ที่เราสามารถใช้ตรวจสอบสิ่งนี้ เรา ต้องการอนุญาตให้วัดได้ทั้งสถานะ และ ดังนั้นเราต้องการอะไรบางอย่างเพื่อหมุนสถานะเริ่มต้นของ Qubit จากสถานะ เริ่มต้น ในกรณีนี้ เราจะใช้ Hadamard gate เนื่องจาก โปรดสังเกตว่าโดยค่าเริ่มต้น การวัดทั้งสองนี้จ ะอยู่ตาม
from qiskit import QuantumCircuit
# Define registers
qr = QuantumRegister(1, "q")
cr = ClassicalRegister(2, "c")
qc = QuantumCircuit(qr, cr)
# Initialize the qubit to be a mixture of 0 and 1 states.
qc.h(0)
# Add a first measurement
qc.measure(0, 0)
qc.barrier()
# Add a second measurement
qc.measure(0, 1)
qc.draw("mpl")
qc_ibm = pm.run(qc)
# Step 3: Run the job
num_shots = 1000
dist = sampler.run([qc_ibm], shots=num_shots).result()
# To run on a simulator, uncomment the line below and comment out the line above.
# dist = sampler_sim.run([qc_ibm], shots=num_shots).result()
counts = dist[0].data.c.get_counts()
print(counts)
{'00': 497, '11': 498, '01': 3, '10': 2}
# Step 4: Post-process
plot_histogram(counts)
ในรูปข้างต้น ช่องถูกระบุว่า "00", "01" เป็นต้น ที่นี่ ตัวเลขเหล่านี้หมายถึง "ผลลัพธ์ที่ 2, ผลลัพธ์ที่ 1" ดังนั้น "00" หมายความว่าการวัดทั้งสองให้สถานะ และ "01" หมายความว่าการวัดแรกให้ และครั้งที่สองให้ Qubit ส่วนใหญ่ถูกวัดให้อยู่ในสถานะ สองครั้ง หรือถูกวัดให้เป็น สองครั้ง มันเป็นเรื่องหายากมากที่ Qubit จะถูกวัดในสถานะหนึ่งแล้วถูกวัดในสถานะอื่น และกรณีไม่กี่กรณีที่เกิดขึ้น (~1%) เกิดจากสัญญาณรบกวน ในกรณีนี้สัญญาณรบกวนนั้นถูกจำลองให้สอดคล้องกับพฤติกรรมของระบบควอนตัมจริง ความสัมพันธ์ที่สังเกตได้นี้ระหว่างการวัดต่อเนื่องกันยังพบในการวัดแบบ Stern-Gerlach ของอนุภาคที่มีโมเมนตัมเชิงมุมสปินด้วย หากอนุภาคถูกวัดให้เป็น "spin-up" การวัดครั้งต่อมาในไม่ช้าจะให้ "spin-up" อีกครั้ง (โดยมีความแปรปรวนเล็กน้อยเนื่องจากสัญญาณรบกวน)
สิ่งนี้อาจดูเหมือนเรื่องธรรมดา ท้ายที่สุด ถ้า Qubit ถูกวัดให้อยู่ในสถานะหนึ่ง แล้วฉันวัดมันอีกครั้งอย่างรวดเร็ว ทำไมมันจะไม่อยู่ในสถานะนั้นอีก? แต่ถ้าเราจับความละเอียดนี้ได้อย่างแท้จริง มันอาจช่วยให้เราเลือกเครื่องมือทางคณิตศาสตร์เพื่ออธิบายปรากฏการณ์นี้
การวิเคราะห์การทดลองจนถึงตอนนี้
มาสรุปข้อสังเกตจากการทดลองของเราจนถึงตอนนี้:
- การวัดระบบกลศาสตร์ควอนตัมจะให้ค่าหนึ่งในชุดของ "ค่าที่อนุญาต" เท่านั้น สำหรับระบบสองระดับอย่าง Qubit หรืออนุภาค spin-1/2 การวัดจะให้เพียงหนึ่งในผลลัพธ์แบบไบนารี
- เมื่อเราเริ่มต้นสถานะของระบบไบนารีของเราโดยสุ่ม (เช่น อนุภาค spin-1/2 ที่ออกมาจากเตาอบ) ผลลัพธ์การวัดแบบไบนารีทั้งสองเป็นไปได้
- เมื่อทำการวัดแล้วและรู้สถานะของระบบ การทำซ้ำการวัด physical observable เดียวกันจะไม่เปลี่ยนสถานะ! นั่นคือ ถ้าเราได้สถานะ 0 หนึ่งครั้ง เมื่อเราวัดอีกครั้งมันยังคงอยู่ในสถานะ 0 (โดยมีสัญญาณรบกวนเล็กน้อยในระบบ ~0.1% ถึง 1%)
โปรดสังเกตอย่างชัดเจนว่าเรายังไม่ได้พูดถึงลักษณะความน่าจะเป็นของกลศาสตร์ควอนตัม หรือกล่าวถึงการ "collapse" สถานะไปยัง eigenstate โดยใช้เพียงข้อสังเกตข้างต้น อาจดึงดูดใจให้มองหาการดำเนินการทางคณิตศาสตร์ ที่ปล่อยให้ชุดพิเศษของสถานะกลศาสตร์ควอนตัม ไม่เปลี่ยนแปลงจนถึงบางค่าคงที่: เนื่องจากการวัดตาม สองครั้งให้ผลลัพธ์เดียวกัน ในท้ายที่สุด การค้นหานั้นจะล้มเหลวในการอธิบายพฤติกรรมทั้งหมดที่เราจะเห็น แต่มันสามารถอธิบายบางสิ่งได้ ดังนั้นเราจะดำเนินต่อไปสักครู่
มีการดำเนินการดังกล่าวอยู่จริง การดำเนินการเมทริกซ์บนเวกเตอร์บางตัวเปลี่ยนเวกเตอร์ และการดำเนินการเมทริกซ์บนเวกเตอร์อื่น (eigenvectors) ปล่อยให้เวกเตอร์ไม่เปลี่ยนแปลงจนถึงค่าคงที่ ตัวอย่างเช่น เมทริกซ์ และเวกเตอร์ ที่
และ
โปรดสังเกตว่า
แต่สำหรับเวกเตอร์อื่น เช่น เรามี
เราอาจพยายามอธิบายสปินของอนุภาคโดยใช้เมทริกซ์ และเราอาจพยายามอธิบายสถานะของอนุภาคหลังการวัดโดยใช้เวกเตอร์ที่เรียกว่า "state vector" ไม่ชัดเจนเลยว่าค่าใดควรอยู่ในเมทริกซ์หรือ state vector ดังกล่าว แต่คุณสมบัติเดียวที่เรามีจากการวัดจนถึงตอนนี้ที่เราสามารถใช้ระบุสถานะคือความน่าจะเป็นของการวัด 0 หรือ 1 ("spin-up" หรือ "spin-down" ในบริบทของอนุภาค spin-1/2) เราควรพิจารณาว่ารายการใน state vectors ควรเกี่ยวข้องกับความน่าจะเป็นนี้ (ความน่าจะเป็นที่แน่นอน "probability amplitude" — หมายความว่าเรายกกำลังสองรายการเพื่อได้ความน่าจะเป็น เป็นต้น) แต่ในขณะนี้ เราไม่แน่ใจว่ารายการในเมทริกซ์เหล่านี้ควรเป็นจำนวนจริงล้วนๆ จำนวนเชิงซ้อน หรืออะไร เพื่อความปลอดภัย ลองพัฒนากรอบที่เวกเตอร์และเมทริกซ์ตอบสนองสิ่งต่อไปนี้:
- ตัวดำเนินการเมทริกซ์เชื่อมต่อกับการทดลองมากที่สุดเท่าที่เป็นไปได้ ตัวอย่างเช่น เราสามารถเชื่อมโยง eigenvalues ของเมทริกซ์สปินกับการฉายภาพสปินที่สังเกตได้จากการทดลอง
- State vectors ควรเชื่อมต่อกับความน่าจะเป็นในแบบต่อไปนี้: ถ้าอนุภาคอยู่ใน state vector ความน่าจะเป็นที่การวัดครั้งต่อมาจะพบอนุภาคในสถานะ คือ
สิ่งนี้ให้เสรีภาพอย่างมากในการพัฒนาเมทริกซ์แรกของเรา ตัวอย่างเช่น เราอาจลองอย่างไร้เดียงสา
ที่นี่ หมายความว่ามีสถานะในคอมพิวเตอร์ควอนตัมและในระบบ spin-1/2 ที่คล้ายกันมากและมักถูกแมปซึ่งกันและกัน พวกมันเห็นได้ชัดว่าไม่เหมือนกันทุกประการ เนื่องจากพวกมันอ้างถึงระบบที่แตกต่างกัน แต่พีชคณิตที่อธิบายระบบสองสถานะเหล่านี้อาจสอดคล้องกับกฎเดียวกัน (spoiler: มันสอดคล้องกัน!) โปรดสังเกตว่าการเลือกแบบสุ่มนี้มีคุณลักษณะที่ดีอยู่แล้ว โปรดสังเกตว่า
นั่นคือ ถ้าอนุภาคอยู่ในสถานะ แล้ว ความน่าจะเป็นที่การวัดครั้งต่อมาจะให้ อีกครั้งคือ 1 (ยกเว้นผลกระทบจากสัญญาณรบกวน) นี่ยอดเยี่ยม เพราะเราได้เห็นแล้วว่าเมื่อสถานะอยู่ใน 0 หรือสถานะ "spin-up" มันจะอยู่ที่นั่นเมื่อวัดซ้ำ ความน่าจะเป็นข้างต้นควรเป็น 100%
ตรวจสอบความเข้าใจของคุณ
อ่านคำถามด้านล่าง คิดคำตอบของคุณ จากนั้นคลิกสามเหลี่ยมเพื่อดูคำตอบ
เหตุใด
จึงเป็นตัวเลือกที่ดีกว่า เช่น
คำตอบ:
ความพยายามของเราที่จะเชื่อมโยงความน่าจะเป็นของการวัดกับ inner product ยกกำลังสองหมายความว่าเราต้องการขนาดของเวกเตอร์แต่ละตัวเป็น 1 นั่นคือ สำหรับทุก เนื่องจากความน่าจะเป็นที่สิ่งที่อยู่ในสถานะ จะอยู่ในสถานะ คือ 100% สิ่งนี้เรียกว่า "normalization condition"
เหตุใด
จึงเป็นตัวเลือกที่ดีกว่า เช่น
คำตอบ:
ไม่ใช่ ไม่มีเหตุผลที่เราต้องเลือก ตั้งแต่แรก แต่เป็นข้อตกลง อย่างไรก็ตาม เมื่อเราทำการเลือกนั้น มันกำหนดข้อจำกัดบางอย่างสำหรับการเลือกต่อมา ดูด้านล่าง
จำไว้ว่าในการทดลองข้างต้น เราพบว่า Qubit ที่เริ่มต้นในสถานะ ยังคงอยู่ในสถานะนั้นเมื่อวัดซ้ำ เช่นเดียวกับ ซึ่งหมายความว่า Qubit ที่อยู่ใน มีความน่าจะเป็นเป็นศูนย์ที่จะถูกวัดในสถานะ (ยกเว้นผลกระทบจากสัญญาณรบกวน) การเชื่อมต่อที่จำเป็นระหว่าง inner products และความน่าจะเป็นของการวัดบอกเราว่า
โดยไม่เสียความทั่วไป เราสามารถเขียน state vector จากนั้นเราสามารถเขียน
ข้อกำหนดที่ ที่เรียกว่า "normalization condition" บอกเราว่า สิ่งนี้เพียงอย่างเดียวจำกัดเราที่ สำหรับ ปรากฏว่ามีเหตุผลอื่นสำหรับการเลือก ที่เกินขอบเขตของการแนะนำหัวข้อนี้ ตอนนี้ให้เพียงพอที่ว่า เป็นคำตอบที่ยอมรับได ้หนึ่งข้อ
เราได้ก้าวหน้าไปมากในการวิเคราะห์ของเรา การเลือกรูปแบบสำหรับ state vectors ของเราช่วยให้เราสร้างเมทริกซ์ที่อธิบายบางอย่างเกี่ยวกับปรากฏการณ์ทางกายภาพที่เกิดขึ้นที่นี่ โดยเฉพาะอย่างยิ่ง เนื่องจากการทดลอง Stern-Gerlach ดั้งเดิมวัดการแยกของวิถีโคจรตามองค์ประกอบโมเมนตัมเชิงมุมสปินตามแกน เราต้องการตัวดำเนินการที่อธิบายสิ่งนั้นอย่างแน่ชัด: การเชื่อมต่อที่สำคัญอีกอย่างกับการทดลองคือจากปริมาณการเบี่ยงเบน เวลาเดินทาง และความแข็งแกร่งของสนามแม่เหล็กที่ทราบ เราสามารถกำหนดขนาดขององค์ประกอบ ของสปินได้ แม้ว่าสิ่งนี้ต้องการสมมติฐานมากมายเกี่ยวกับความแม่นยำของการตั้งค่าการทดลอง ที่นี่เราจะเพียงแต่ทำซ้ำว่าองค์ประกอบ z ที่วัดได้ของโมเมนตัมเชิงมุมสปินคือ
จากนั้นเรากำลังมองหาเมทริกซ์ที่มี eigenvalues จริง (ตอบสนองโดยเมทริกซ์ Hermitian) ที่มี eigenvalues สอดคล้องกับองค์ประกอบสปินที่สังเกตได้จากการทดลองเหล่านี้ โดยไม่เสียความทั่วไป เราสามารถเขียน และเราสามารถกำหนด:
รวมกัน และดึงปัจจัยโดยรวมของ ออกมา เราได้
นี่คือตัวดำเนินการ spin-z ที่รู้จักกันดีซึ่งพบในตำราเรียนกลศาสตร์ควอนตัมทั้งหมด มักเห็นสิ่งนี้โดยลบ ออก ซึ่งในกรณีนั้นคือตัวดำเนินการ "Pauli-z" มักแสดงด้วย :
สิ่งนี้มีประโยชน์ เนื่องจากตัวดำเนินการ Pauli นี้ (และเมทริกซ์ที่เกี่ยวข้อง) สามารถอธิบายระบบทางกายภาพจำนวนมากที่เกี่ยวข้องกับสองระดับหรือสองผลลัพธ์ที่เป็นไปได้ของการวัด รวมถึงสถานะของ transmon qubits ในคอมพิวเตอร์ควอนตัม
ก่อนที่เราจะหันไปหาตัวดำเนินการแล ะสถานะอื่นที่เกี่ยวข้องกับสิ่งนี้ เราต้องกล่าวถึงข้อเท็จจริงหนึ่งที่คนจำนวนมากเข้าใจผิด การกระทำของตัวดำเนินการไม่เหมือนกับการวัด ในแง่หนึ่ง คุณอาจพูดว่า "แน่นอนไม่ใช่! อย่างหนึ่งเกิดขึ้นบนกระดาษเป็นส่วนหนึ่งของการคำนวณทางคณิตศาสตร์ และอีกอย่างเกิดขึ้นในห้องปฏิบัติการบนระบบทางกายภาพ" ใช่ นั่นเป็นความจริง แต่มันมากกว่านั้น การวัดองค์ประกอบ ของสปินจะให้สถานะ "spin-up" หรือ "spin-down" เสมอ ไม่ว่าสถานะเริ่มต้นของระบบจะเป็นอย่างไร เราเห็นสิ่งนี้กับอนาล็อกการคำนวณควอนตัม และ เราเริ่มต้นสถานะเป็นการวางแนวสุ่มหลายร้อยแบบ และการวัดให้ หรือ เสมอ สิ่งนี้เรียกว่าการวัด "collapse the state" ไปยัง eigenstate สิ่งนี้ไม่เกิดขึ้นเมื่อคุณนำเมทริกซ์ไปใช้กับสถานะ ลองคำถามด้านล่างเพื่อสำรวจสิ่งนี้
ตรวจสอบความเข้าใจของคุณ
อ่านคำถามด้านล่าง คิดคำตอบของคุณ จากนั้นคลิกสามเหลี่ยมเพื่อดูคำตอบ
สมมติว่าคุณเริ่มต้นด้วยอนุภาคในสถานะสปิน
(a) คุณได้อะไรถ้าคุณกระทำด้วยตัวดำเนินการ บน state vector นี้? (b) คุณได้อะไรถ้าคุณทำการวัดองค์ประกอบ ของสปินของอนุภาคนี้ครั้งเดียว? (c) คุณได้อะไรถ้าคุณเตรียมอนุภาคจำนวนมากที่เหมือนกันกับสถานะนี้และทำการวัดองค์ประกอบ ของสปินหลายพันครั้ง?
คำตอบ:
(a) คุณได้
แค่นั้นแหล่ะ ไม่มีผลลัพธ์การทดลอง คุณเพียงนำเมทริกซ์ไปใช้ก ับเวกเตอร์และได้เวกเตอร์ที่แตกต่างเล็กน้อยซึ่งตอนนี้มีเครื่องหมาย "-" ใหม่ และไม่มีขนาดเป็น 1 อีกต่อไป เนื่องจากมีปัจจัยนำหน้า
(b) คุณจะได้ หรือ สิ่งนี้สอดคล้องกับการสังเกตการฉายภาพสปินบนแกน ของ หรือ ตามลำดับ เราสามารถกำหนดความน่าจะเป็นของแต่ละผลลัพธ์ด้วย เนื่องจาก
แม้ว่าสถานะ spin-up มีโอกาส 20% มากกว่า แต่ผลลัพธ์ทั้งสองเป็นไปได้ และเราจะได้เพียงหนึ่งในสองสถานะเหล่านี้
(c) ประมาณ 60% ของการวัดจะให้อนุภาค spin-up และประมาณ 40% จะให้อนุภาค spin-down ตามความน่าจะเป็นการวัดที่คำนวณในส่วน (b)
ตรวจสอบคำตอบของส่วน (b) และ (c) ของคำถามก่อนหน้าโดยใช้การเปรียบเ ทียบระหว่างสถานะ spin-up ของอะตอมและสถานะ Qubit:
เขียน Circuit ควอนตัมเพื่อสร้างสถานะเริ่มต้นที่ต้องการ จากนั้นใช้ฮาร์ดแวร์จริงหรือ simulator เพื่อตรวจสอบผลลัพธ์ของการวัดครั้งเดียว และจากกลุ่มของการวัดหลายร้อยหรือหลายพันครั้ง
คำตอบ:
#Use the backend sampler for part (b) because it allows us to use a single shot.
from qiskit_aer import AerSimulator
backend_sim = AerSimulator.from_backend(backend)
from qiskit.primitives import BackendSampler
sampler = BackendSampler(backend = backend_sim)
#Create a quantum circuit to initialize the state.
import math
psi = [math.sqrt(3/5),math.sqrt(2/5)]
qc = QuantumCircuit(1,1)
qc.initialize(psi, [0])
#Add measurement to the circuit
qc.measure(0,0)
qc.draw('mpl')
#Set num_shots =1 for part (b) and num_shots = 1000 or more for part (c).
num_shots = 1000
#Run the job and print the result. You should obtain only 0 or 1 in part (b) for a single shot.
#You should obtain a probability distribution with approximately 60% 0 and 40% 1 in part (c)
dist = sampler.run([qc_ibm], shots = num_shots).result()
counts=dist[0].data.c.get_counts()
print(counts)
#You should obtain {0: 599, 1: 401} or something equivalently close to the 60%-40% distribution predicted.
การทดลองที่ห้า: การวัด observables ต่างๆ
จนถึงตอนนี้เราวัดตามแกน z เท่านั้น ในการทดลอง Stern-Gerlach หากเราต้องการวัดตาม เช่น แกน x เราจะวางแนวสนามแม่เหล็กที่ไม่สม่ำเสมอให้ชี้ตามแกน และมองหาการเบี่ยงเบนตาม บนหน้าจอ อย่างไรก็ตาม คอมพิวเตอร์ควอนตัม IBM ได้รับการออกแบบให้วัดตามแกนเดียวเท่านั้น () เพื่อวัดสถานะตาม เราต้องทำ "change of basis" ซึ่งหมายความว่าเราต้องทำการดำเนินการที่นำสถานะตาม ใน Bloch sphere ไปยัง และในทางกลับกัน มีหลายวิธีในการดำเนินการนี้ แต่วิธีที่ต้องการคือ Hadamard gate:
ตรวจสอบความเข้าใจของคุณ
อ่านคำถามด้านล่าง คิดคำตอบของคุณ จากนั้นคลิกสามเหลี่ยมเพื่อดูคำตอบ
แสดงว่า และ
คำตอบ:
แสดงว่า และ
คำตอบ:
# Define registers
qr = QuantumRegister(1, "q")
cr = ClassicalRegister(1, "c")
qc = QuantumCircuit(qr, cr)
# Add a hadamard gate to rotate into the x-basis
qc.h(0)
qc.measure(0, 0)
qc.draw("mpl")
Circuit นี้หมุนระบบของเราเพื่อให้การวัด (ตาม ) บอกเราเกี่ยวกับลักษณะ ก่อนการหมุน เรารู้อยู่แล้วว่าคอมพิวเตอร์ควอนตัมเริ่มต้นสถานะเป็น ซึ่งสอดคล้องกับ มาดูว่าจะเกิดอะไรขึ้นเมื่อเราวัดการฉายภาพสปินตาม สำหรับสถานะที่เริ่มต้นใน เราแสดงขั้นตอนนี้บน simulator เพื่อกระตุ้นให้คุณสำรวจสถิติของ Circuit อื่นที่มีการเริ่มต้นค่าต่างๆ
from qiskit.primitives import StatevectorSampler as Sampler
sampler_sv = Sampler()
job = sampler_sv.run([qc], shots=10000)
print(job.result()[0].data.c.get_counts())
{'1': 4977, '0': 5023}
สิ่งนี้แสดงให้เราเห็นว่าสำหรับ Qubit ที่เริ่มต้นใน (หรือเทียบเท่า สปินใน ) ความน่าจะเป็นของการวัดการฉายภาพตาม หรือ คือประมาณ 50-50 ในบางแง่ สิ่งนี้เข้าใจได้อย่างสมบูรณ์แบบ ท้ายที่สุด ถ้ามีบางสิ่งชี้ตามทิศทาง z มันจะไม่มีความชอบสำหรับ โดยเฉพาะ เราอาจคาดว่าเช่นเดียวกันหากเราเริ่มต้นด้วยสถานะ (หรือ ) มาตรวจสอบ:
# Define registers
qr = QuantumRegister(1, "q")
cr = ClassicalRegister(1, "c")
qc = QuantumCircuit(qr, cr)
# Add a NOT gate and hadamard gate. Measure.
qc.x(0)
qc.h(0)
qc.measure(0, 0)
qc.draw("mpl")
job = sampler_sv.run([qc], shots=10000)
print(job.result()[0].data.c.get_counts())
{'0': 4935, '1': 5065}
ใช่! อีกครั้ง เราพบความน่าจะเป็น 50-50 ของการวัดการฉายภาพตาม ในการเปรียบเทียบกับการวัดตาม เราอาจสงสัยต่อไปว่าอนุภาคที่ collapse เข้าสู่สถานะที่ชัดเจนตาม อาจมีความน่าจะเป็นเป็นศูนย์ที่จะถูกวัดตาม ในภายหลัง มาตรวจสอบ:
from qiskit import QuantumCircuit
# Define registers
qr = QuantumRegister(1, "q")
cr = ClassicalRegister(2, "c")
qc = QuantumCircuit(qr, cr)
# Rotate into x-basis using a Hadamard gate, then make two measurements in succession
qc.h(0)
qc.measure(0, 0)
qc.barrier()
qc.measure(0, 1)
qc.draw("mpl")
job = sampler_sv.run([qc])
print(job.result()[0].data.c.get_counts())
plot_histogram(job.result()[0].data.c.get_counts())
{'00': 504, '11': 520}
ตามที่คาดไว้ เราได้ผลลัพธ์ที่การฉายภาพอยู่ตาม และต่อมาอยู่ตาม อีกครั้ง และเราได้ผลลัพธ์ที่การฉายภาพเริ่มต้นตาม และต่อมาตาม อีกครั้ง เราไม่เห็นกรณีที่การฉายภาพเปลี่ยนจาก เป็น หรือในทางกลับกัน เราสามารถรวบรวมข้อสังเกตของเราและใช้มันเพื่อพัฒนาตัวดำเนินการในรูปแบบเมทริกซ์เพิ่มเติม และ state vectors เพิ่มเติม
เรารู้:
- สถานะที่มีการฉายภาพที่ชัดเจนตาม หรือ มีโอกาส 50% ที่จะพบว่ามีการฉายภาพตาม และโอกาส 50% ที่จะมีการฉายภาพตาม
- สถานะที่มีการฉายภาพที่ชัดเจนตาม มีโอกาสเป็นศูนย์ที่จะถูกวัดตาม ในภายหลัง และในทางกลับกัน
เราสามารถใช้ผลลัพธ์เหล่านี้เพื่อสร้างสถานะที่มีการฉายภาพที่เป็นบวกและชัดเจนตาม (ซึ่งเราเรียก ) และสถานะที่มีการฉายภาพที่เป็นลบและชัดเจนตาม (ซึ่งเราเรียก ) จากสถานะเหล่านั้น เราสามารถสร้างเมทริกซ์ที่สอดคล้องกับ ได้อย่างแน่นอน เช่นเดียวกับที่เราทำกับ เราปล่อยให้สิ่งเหล่านี้เป็นแบบฝึกหัดสำหรับผู้เรียน ในทำนองเดียวกัน คุณสามารถ สร้างการทดลองที่ทำการวัดตามแกน กำหนดเวกเตอร์สำหรับ และ และในที่สุดได้นิพจน์สำหรับ
รวบรวมเวกเตอร์และเมทริกซ์เหล่านี้ทั้งหมดเข้าด้วยกัน เรามี
คำถาม
ผู้สอนสามารถขอเวอร์ชันของ notebook เหล่านี้พร้อมคำเฉลยและคำแนะนำในการวางในหลักสูตรทั่วไปได้โดยกรอกแบบสำรวจสั้นๆ เกี่ยวกับวิธีการใช้ notebook
แนวคิดสำคัญ:
- สำหรับอนุภาค spin-1/2 การวัดการฉายภาพของสปินบนแกนใดๆ สามารถให้เพียงหนึ่งในสองผลลัพธ์ มักเรียกว่า "up" และ "down"
- Qubit สามารถวัดได้ในหนึ่งในสองสถานะเท่านั้น มักเรียกว่า และ
- เราสามารถจำลองการทดลอง Stern-Gerlach บนอนุภาค spin-1/2 โดยใช้ Qubit ในคอมพิวเตอร์ควอนตัม
- การวัดซ้ำของ physical observable เดียวกันของอนุภาค/Qubit เดียวกันจะให้ผลลัพธ์เดียวกัน (ยกเว้นระบบถูกรบกวนโดยสัญญาณรบกวน)
- เราสามารถใช้ผลลัพธ์จากการทดลอง Stern-Gerlach หรือจากการทดลองที่คล้ายคลึงกันกับคอมพิวเตอร์ ควอนตัมเพื่อสร้างระบบของ state vectors และตัวดำเนินการเมทริกซ์ที่อธิบายสปินกลศาสตร์ควอนตัม
คำถาม T/F:
- T/F เริ่มจากการสังเกตการทดลอง การเลือกเวกเตอร์เพื่อแทน ที่ถูกต้องเพียงอย่างเดียวคือ
- T/F ถ้า การเลือกเพียงอย่างเดียวสำหรับ คือ (ถึง global phase)
- T/F อนุภาคที่ถูกวัดให้อยู่ในสถานะ จะยังคงพบในสถานะ เมื่อวัดซ้ำตาม
- T/F อนุภาคที่ถูกวัดให้อยู่ในสถานะ จะยังคงพบในสถานะ เมื่อวัดซ้ำตาม
- T/F อนุภาคที่ถูกวัดให้อยู่ในสถานะ จะพบในสถานะ เสมอเมื่อวัดซ้ำตาม
คำถาม MC:
-
อนุภาคที่เริ่มต้นใน มีความน่าจะเป็นเท่าใดในการถูกวัดในสถานะ ?
- a. 0%
- b. 25%
- c. 50%
- d. 71%
- e. 100%
-
อนุภาคที่เริ่มต้นใน มีความน่าจะเป็นเท่าใดในการถูกวัดในสถานะ ?
- a. 0%
- b. 25%
- c. 50%
- d. 71%
- e. 100%
-
สถานะ ของอนุภาค spin-1/2 มักเชื่อมโยงกับสถานะการคำนวณควอนตัมใด?
- a.
- b.
- c.
- d.
- e. ไม่มีข้อใดข้างต้น
คำถามอภิปราย:
- เพื่อนสามคนกำลังอภิปรายเกี่ยวกับการวัดและตัวดำเนินการควอนตัม เพื่อน A บอกว่า "การวัดตาม และการกระทำด้วยตัวดำเนินการ เป็นสิ่งเดียวกัน" เพื่อน B บอกว่า "พวกมันเป็นขั้นตอนที่แตกต่างกัน แต่ให้ผลลัพธ์เหมือนกัน" เพื่อน C บอกว่า "พวกมันแตกต่างกันอย่างสิ้นเชิง แม้แต่มีผลกระทบต่างกันกับสถานะส่วนใหญ่" คุณเห็นด้วยกับใครและทำไม?
โจทย์ตอบอิสระ:
- จากการสังเกตการทดลองและ syntax ที่เสนอ:
แสดงว่าถึง global phase
เลือก เพื่อให้ได้ผลลัพธ์มาตรฐาน
- จากการสังเกตการทดลองและ syntax ที่เสนอ:
และโดยใช้ผลลัพธ์จากโจทย์ challenge ข้อ 3:
แสดงว่าถึง global phase
กิตติกรรมประกาศ
[1] By Tatoute - Own work, CC BY-SA 4.0, https://commons.wikimedia.org/w/index.php?curid=34095239