นี่คือกระบวนการของฉันสำหรับการคำนวณทางคณิตศาสตร์บนคอมพิวเตอร์ควอนตัม
ขั้นตอนที่ 1: ค้นหาวงจรแบบคลาสสิกที่ทำสิ่งที่คุณสนใจ
ในตัวอย่างนี้ adder เต็ม
ขั้นตอนที่ 2: แปลงเกทคลาสสิกแต่ละตัวให้เป็นเกทแบบพลิกกลับได้
ให้บิตเอาต์พุตของคุณมีอยู่ตั้งแต่เริ่มต้นแล้วเริ่มต้นด้วย CNOTs, CCNOTs และอื่น ๆ
ขั้นตอนที่ 3: ใช้ผลชั่วคราว
หากคุณกำลังทำสิ่งนี้เพิ่มเติมเช่นควบคุมว่าเฟสของ Grover oracle โดย -1 หรือไม่ตอนนี้เป็นเวลาที่จะใช้ Z gate กับ qubit เอาต์พุตของคุณ
ขั้นตอนที่ 4: กำจัดค่ากลางโดยทำสิ่งตรงข้ามกับสิ่งที่คุณทำเพื่อคำนวณ
สิ่งนี้อาจหรือไม่รวมถึงการกำจัดบิตเอาท์พุทขึ้นอยู่กับว่าวงจรเหมาะสมกับอัลกอริทึมโดยรวมของคุณอย่างไร
ขั้นตอนที่ 5: (บางครั้ง) สำหรับแต่ละบิตเอาต์พุตที่คุณเก็บไว้ให้กำจัดบิตอินพุต
และฉันไม่ได้หมายถึง "วางมันลงบนพื้น" ฉันหมายถึงใช้การดำเนินการที่ทำให้พวกเขากลายเป็น 0 อย่างแน่นอน
เมื่อคุณคำนวณc+=a
ให้ทิ้งสำเนาต้นฉบับที่c
มีแนวโน้มว่าจะไม่ดี มันทำลายการเชื่อมโยงกัน ดังนั้นคุณต้องดูวงจรบวกของคุณ (หรืออะไรก็ตาม) และคิดให้ถี่ถ้วนหากมีวิธีใช้บิตเอาต์พุตของคุณเพื่อกำจัดบิตอินพุตของคุณ ตัวอย่างเช่นหลังจากคำนวณc+a
คุณสามารถทำการลบออกนอกสถานที่ชั่วคราวลงใน register r หรือ xor r ใน register ที่เก็บสำเนาที่ไม่ต้องการจากc
นั้นเปลี่ยนกลับการลบชั่วคราว
(ข้อยกเว้นที่น่าสังเกต "ถ้าคุณเก็บเอาท์พุทอย่าเก็บข้อมูลมากนัก" คืออัลกอริธึมของชอร์อัลกอริธึมของชอร์ตกแต่งการป้อนข้อมูลตามวัตถุประสงค์แต่ในวิธีที่เฉพาะเจาะจงมาก
ขั้นตอนที่ 6: มีประสิทธิภาพ
ในขั้นตอนที่ 5 ฉันบอกว่าคุณไม่สามารถคำนวณอินพุตของการเพิ่ม inplace ได้โดยทำการเพิ่มออกนอกสถานที่แล้วตามด้วยการลบนอกสถานที่ชั่วคราว นี่มันโง่ไปหน่อย กระบวนการเพิ่มโดยรวมกำลังจะขยาย 4n qubits (n to hold a
, n to hold c
, n to hold c+a
, n to hold (c+a)-a
) หากคุณฉลาดกว่านี้คุณสามารถใส่ทุกอย่างลงใน2n
qubitsหรือ (ง่ายขึ้นเล็กน้อย) เป็น2n+1
qubits :