Grover-Algorithm ใช้กับฐานข้อมูลอย่างไร


12

คำถาม

ฉันต้องการที่จะใช้โกรเวอร์-อัลกอริทึมในการค้นหาฐานข้อมูลไม่ได้เรียงลำดับสำหรับองค์ประกอบxxตอนนี้คำถามเกิดขึ้นฉันจะเริ่มต้นดัชนีและมูลค่าของฐานข้อมูลด้วย qubits ได้อย่างไร

ตัวอย่าง

  • สมมติว่าฉันมี4 qubits ดังนั้น24=16ค่าคลาสสิกสามารถถูกแมป
  • ฐานข้อมูลไม่ได้เรียงลำดับของฉันdมีองค์ประกอบดังต่อไปนี้: d[Value]=[3,2,0,1] ]
  • ฉันต้องการค้นหาx=2d=10b=|10
  • วิธีการของฉัน: ดัชนีฐานข้อมูลdกับd[(Index, Value)]=[(0,3),(1,2),(2,0),(3,1)] ] ลงทะเบียน0และ1สำหรับดัชนีและลงทะเบียน2และ3สำหรับค่า จากนั้นใช้ Grover-Algorithm เพื่อลงทะเบียน2และ3(Value) . สิ่งนี้เป็นจริงได้หรือไม่? มีวิธีอื่นหรือไม่?

สิ่งที่ฉันดำเนินการแล้ว ( บน GitHub )

"อัลกอรึทึม - อัลกอรึทึมที่มี 2-, 3-, 4-Qubits" แต่สิ่งที่มันทำได้ง่าย: บิตจะเริ่มต้นได้ด้วย|0 , oracle จะทำเครื่องหมายวิธีแก้ปัญหาของฉันx (ซึ่งเป็นเพียงตัวเลขเช่น2d=10b ), ส่วน Grover จะเพิ่มความน่าจะเป็นขององค์ประกอบที่เลือกxและลดความน่าจะเป็นอื่น ๆ ทั้งหมดแล้ว qubits จะถูกอ่านออกโดย แมปกับบิตคลาสสิก เราปล่อยให้กระบวนการนี้เรียกหลายครั้งในการสืบทอดและทำให้ได้รับการกระจายความน่าจะเป็นที่น่าจะเป็นสูงสุดมีองค์ประกอบของเราขอxx

เอาต์พุตจะเหมือนกับที่ทำเครื่องหมายไว้ใน oracle เสมอ ฉันจะสร้างข้อมูลเพิ่มเติมจากผลลัพธ์ได้อย่างไรโดยที่ฉันไม่รู้เวลาที่สร้าง oracle

คำตอบ:


9

ฉันกำลังแก้ไขปัญหานี้เช่นกัน ในฐานะผู้เริ่มต้นและโปรแกรมเมอร์คลาสสิก (เช่นฉันไม่พูดควอนตัมกลศาสตร์) มันเป็นการยากที่จะเข้าใจแนวคิดโดยไม่มีตัวอย่างที่สมบูรณ์ ฉันได้รับการทำงานร่วมกับไมโครซอฟท์ Q # ฐานข้อมูลตัวอย่างการค้นหา มันเพียงค้นหาดัชนี / คีย์เฉพาะในฐานข้อมูลซึ่งไม่มีประโยชน์มาก ฉันได้ขยายตัวอย่างเพื่อค้นหารายการค่าในฐานข้อมูลและส่งคืนคีย์ที่เกี่ยวข้อง

เช่นเดียวกับตัวอย่างของคุณมี "key register" สองบิตสำหรับดัชนีและการลงทะเบียน two-qubit แยกสำหรับค่า นอกจากนี้ยังมี "qubit ที่ทำเครื่องหมายไว้" ที่ห้าซึ่งมาจากตัวอย่างของ Microsoft เพื่อระบุว่าเมื่อใดที่พบค่าที่ต้องการ กุญแจและค่าต่าง ๆ ที่เกี่ยวข้องผ่านพัวพัน นั่นแสดงให้เห็นได้ดีที่สุดด้วยวงจร คลิกที่นี่เพื่อดูวงจรมุมแหลมที่เกิดขึ้นจริง

คีย์ / ค่า Oracle Circuit

โปรดทราบว่าวงจรนี้มีเพียงออราเคิล ไม่ได้ใช้อัลกอริทึมของ 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 มีคุณสมบัติที่คล้ายกันหรือไม่ หากฉันแปลภาษาถูกต้องแล้วนี่คือวงจรที่สมบูรณ์สำหรับตัวอย่างด้านบน


ขอบคุณ! นั่นคือสิ่งที่ฉันกำลังมองหา
alex

ดังนั้นสำหรับ Grover-Part: ฉันต้องทำแอมพลิฟายเออร์กับการลงทะเบียนคีย์เท่านั้น (2 qubits ในตัวอย่างนี้) พวกเขาเชื่อมต่อกับ qubit ที่ทำเครื่องหมายไว้ได้อย่างไร
alex

ตามตัวอย่าง # # "อัลกอริทึมของโกรเวอร์ต้องมีการสะท้อนเกี่ยวกับสถานะที่ทำเครื่องหมายและสถานะเริ่มต้น" ดังนั้นคุณต้องดำเนินการทั้ง qubit ที่ทำเครื่องหมายและการลงทะเบียนคีย์ หากคุณปฏิบัติตามรหัสในการดำเนินการ QuantumSearch () คุณจะเห็นว่า ReflectMarked () นั้นถูกเรียกโดยใช้เพียงควิบิตที่ทำเครื่องหมายไว้ ReflectZero () จะเรียกในภายหลังด้วยการรวมกันของ qubit ที่ทำเครื่องหมายไว้และการลงทะเบียนคีย์ นอกจากนี้โปรดดูการแก้ไขด้านบน
Joel Leach

3

n=4

i|i|d(i)
f(i)=2

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


ขอบคุณสำหรับการตอบกลับของคุณ! ดังนั้น Grover-Algorithm จึงไม่เหมาะสำหรับการค้นหาฐานข้อมูล ผมพบว่าคำถามที่เกี่ยวข้องที่นี่
alex

มีรหัสหลอก (หรือรหัส Qiskit) เพื่อแก้ปัญหาการค้นหาฐานข้อมูลนี้หรือไม่?
alex

คุณจะต้องมอง แต่ควรหาได้ง่ายในกรอบ
cnada

3

คุณต้องแปลง oracle เพื่อเก็บฐานข้อมูลด้วยเช่นกัน Oracle ทั่วไป (Phase Inversion) จะมี oracle ย่อยสองตัวที่จะดู วงจรอัลกอริทึมของโกรเวอร์ทั่วไปสำหรับการค้นหาฐานข้อมูล

sub-oracle แรกที่ต้องเตรียมคือวงจรหน่วยความจำซึ่งตรงกันข้ามกับ QRAM ที่เก็บข้อมูลควอนตัม (สถานะ) ในร่างกายของมันวงจรหน่วยความจำ (อาร์เรย์) นี้จัดทำขึ้นเพื่อเก็บเฉพาะข้อมูลแบบคลาสสิกในกรอบ ตัวอย่างของวงจรดังกล่าวที่เก็บอาร์เรย์ของไบนารี [010, 110, 100, 011] แสดงอยู่ด้านล่าง: ตัวอย่างสำหรับวงจรหน่วยความจำ สำหรับข้อมูลเพิ่มเติมอ่านบทความนี้

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.