ฉันกำลังแก้ไขปัญหานี้เช่นกัน ในฐานะผู้เริ่มต้นและโปรแกรมเมอร์คลาสสิก (เช่นฉันไม่พูดควอนตัมกลศาสตร์) มันเป็นการยากที่จะเข้าใจแนวคิดโดยไม่มีตัวอย่างที่สมบูรณ์ ฉันได้รับการทำงานร่วมกับไมโครซอฟท์ Q # ฐานข้อมูลตัวอย่างการค้นหา มันเพียงค้นหาดัชนี / คีย์เฉพาะในฐานข้อมูลซึ่งไม่มีประโยชน์มาก ฉันได้ขยายตัวอย่างเพื่อค้นหารายการค่าในฐานข้อมูลและส่งคืนคีย์ที่เกี่ยวข้อง
เช่นเดียวกับตัวอย่างของคุณมี "key register" สองบิตสำหรับดัชนีและการลงทะเบียน two-qubit แยกสำหรับค่า นอกจากนี้ยังมี "qubit ที่ทำเครื่องหมายไว้" ที่ห้าซึ่งมาจากตัวอย่างของ Microsoft เพื่อระบุว่าเมื่อใดที่พบค่าที่ต้องการ กุญแจและค่าต่าง ๆ ที่เกี่ยวข้องผ่านพัวพัน นั่นแสดงให้เห็นได้ดีที่สุดด้วยวงจร คลิกที่นี่เพื่อดูวงจรมุมแหลมที่เกิดขึ้นจริง
โปรดทราบว่าวงจรนี้มีเพียงออราเคิล ไม่ได้ใช้อัลกอริทึมของ Grover ทั้งหมด
- qubits สองอันดับแรกคือการลงทะเบียนคีย์สองรายการถัดไปคือการลงทะเบียนค่าและ qubit ด้านล่างคือ qubit ที่ทำเครื่องหมายไว้
- ส่วนแรกทำการลงทะเบียนคีย์ในชุดข้อมูลแบบซ้อนโดยใช้ประตู Haramard ตามที่อัลกอริทึมของ Grover กำหนด
- ส่วนที่สองคือส่วนที่เกี่ยวข้องกับค่าผ่านทางพัวพัน แต่ละคีย์จะถูกโยงเข้ากับค่าที่สอดคล้องกันในการลงทะเบียนค่าโดยใช้ (ต่อต้าน -) ควบคุม X ประตู ดังนั้นเมื่อการลงทะเบียนคีย์เป็น 0 ดังนั้นการลงทะเบียนค่าจะถูกตั้งค่าเป็น 3 เมื่อคีย์เป็น 1 ค่าจะถูกตั้งค่าเป็น 2 และอื่น ๆ
- ส่วนที่สามของวงจรคือการค้นหาพยากรณ์ การลงทะเบียนค่าจะยุ่งกับ qubit ที่ทำเครื่องหมายไว้ ในตัวอย่างนี้ค่าที่ต้องการคือ 2 เมื่อการลงทะเบียนค่ามี 2 qubit ที่ทำเครื่องหมายไว้จะถูกตั้งค่าเป็น 1
- อัลกอริทึมของโกรเวอร์ดูที่การลงทะเบียนคีย์และทำเครื่องหมายควิบิต พยากรณ์ค้นหาดูที่การลงทะเบียนค่าและตั้งค่า qubit ที่ทำเครื่องหมายไว้ สิ่งนี้จะทำให้คีย์ 1 ถูกขยายเมื่อค่าเป็น 2
เป็นเรื่องที่น่าสนใจที่จะทราบว่าคีย์และค่าต่าง ๆ ไม่ได้ถูกจัดเก็บไว้ใน qubits แต่จะอยู่ในวงจร / โปรแกรม คุณสามารถพูดได้ว่ามันไม่ใช่ฐานข้อมูลจริงๆ มันเป็นเหมือนคำสั่ง switch / case แต่มีคำสั่งที่สามารถเรียกใช้ทับค่าได้
สำหรับรายละเอียดเพิ่มเติมคำเตือนและ Q # รหัสดูพื้นที่เก็บข้อมูล GitHub ของฉัน
แก้ไข:สิ่งที่ฉันเข้าใจได้ดีขึ้นตั้งแต่ตอบกลับ ... คุณต้องย้อนกลับ / เลิกวงจรเป็นส่วนหนึ่งของการวนซ้ำแต่ละครั้ง ในรหัส Q # การเรียก Adjoint StatePreparationOracle () ภายในการดำเนินการ ReflectStart () จะจัดการสิ่งนี้ดังนั้นฉันจึงไม่ต้องทำอย่างชัดเจน ฉันไม่รู้ว่า Qiskit มีคุณสมบัติที่คล้ายกันหรือไม่ หากฉันแปลภาษาถูกต้องแล้วนี่คือวงจรที่สมบูรณ์สำหรับตัวอย่างด้านบน