อัลกอริทึมควอนตัมตัวอย่างมีประโยชน์สำหรับการสาธิตภาษา


9

ฉันกำลังมองหาอัลกอริทึมควอนตัมซึ่งฉันสามารถใช้เพื่อสาธิตไวยากรณ์ของภาษาควอนตัมที่แตกต่างกัน คำถามของฉันคล้ายกับสิ่งนี้อย่างไรก็ตามสำหรับฉัน "ดี" หมายถึง:

  • สิ่งที่สามารถอธิบายได้ใน 1-2 ย่อหน้าและควรเข้าใจง่าย
  • ควรใช้องค์ประกอบเพิ่มเติมของ "การเขียนโปรแกรมควอนตัม - โลก" (ฉันหมายความว่าอัลกอริทึมควรใช้ค่าคงที่แบบดั้งเดิม, การวัด, เงื่อนไข, qregisters, โอเปอเรเตอร์และอื่น ๆ ให้มากที่สุด)
  • อัลกอริทึมควรมีขนาดเล็ก (ความยาวสูงสุด 15-25 pseudocode-line)

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


ความต้องการของคุณเป็นเช่นนั้นหรือไม่ที่ควรเป็น "อัลกอริทึม" ที่มีอินพุตคลาสสิกและเอาต์พุตคลาสสิกและมีข้อดี / ข้อแตกต่างที่ชัดเจนจากวิธีที่อัลกอริธึมคลาสสิกแบบเทียบเท่าทำงานได้หรือไม่
DaftWullie

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

ยินดีต้อนรับสู่ Quantum Computing SE! เพียงเพื่อตรวจสอบเกณฑ์ในการตอบคำถามที่ดีที่สุดของคุณคือรหัสหลอกที่สั้นที่สุดหรือไม่?
Mithrandir24601

1
@ Mithrandir24601 ขอบคุณ! ใช่อย่างนั้น
klenium

คำตอบ:


3

ฉันแนะนำให้ดูที่ eigenvalue / eigenvector การประเมินโปรโตคอล มีความยืดหยุ่นมากมายในการทำให้ปัญหาง่ายหรือยากเท่าที่คุณต้องการ

เริ่มต้นด้วยการยกสองพารามิเตอร์และkคุณต้องการที่จะออกแบบ -qubit รวม,ที่มีลักษณะเฉพาะของรูปแบบสำหรับจำนวนเต็มQตรวจสอบให้แน่ใจว่าอย่างน้อยหนึ่งค่าลักษณะเฉพาะของผู้ที่มีความเป็นเอกลักษณ์และเรียกว่า\ยังให้แน่ใจว่ารัฐสินค้าง่ายพูดมีไม่ใช่ศูนย์ทับซ้อนกับวิคเตอร์ของ eigenvalue \nknUe2πiq/2kqω|0nω

โดยมีจุดมุ่งหมายที่จะดำเนินการตามขั้นตอนวิธีการขั้นตอนการประมาณค่าเกี่ยวกับเรื่องนี้ได้รับการบอกค่าและถูกมอบหมายกับการแสดงผลเวกเตอร์ที่วิคเตอร์ที่สอดคล้องกับค่าเฉพาะ\โดยทั่วไปนี้จะประกอบด้วยวงจรของ qubits (ยกเว้นกรณีที่คุณต้องการที่จะใช้ ancillas controlled- )k|ψωn+kU

งานนี้เป็นดังนี้:

  • จัดตั้งสองทะเบียนหนึ่งใน qubits และอีกหนึ่ง qubits ( ใช้การลงทะเบียนควอนตัม )kn

  • ทุก qubit จะเริ่มต้นในรัฐ|( เริ่มต้นการลงทะเบียนควอนตัม )|0

  • ใช้ Hadamard กับแต่ละ qubit ในการลงทะเบียนครั้งแรก ( ประตู qubit เดียว )

  • จาก qubitในการลงทะเบียนครั้งแรก, ใช้ control- , กำหนดเป้าหมายไปที่การลงทะเบียนครั้งที่สอง ( ประตูที่ควบคุมด้วย qubit หลายตัว )rU2r

  • ใช้การแปลงฟูริเยร์ผกผันในการลงทะเบียนครั้งแรกและวัดทุก qubit ของการลงทะเบียนครั้งแรกในมาตรฐาน เหล่านี้สามารถนำมารวมกันดำเนินการกึ่งคลาสสิกฟูเรียร์ ( การวัดและการส่งต่อข้อมูลแบบคลาสสิค )

  • สำหรับผลการวัดที่ถูกต้องลงทะเบียนที่สองอยู่ในสภาพที่ต้องการ||ψ

สำหรับความเรียบง่ายที่คุณสามารถเลือก ,ดังนั้นคุณจำเป็นต้องมีเมทริกซ์รวมกับค่าลักษณะเฉพาะ1 ฉันจะใช้บางอย่างเช่น ที่หมายถึงการควบคุมแบบไม่ มีไอเกนนิวเตอร์เพียงตัวเดียวที่มี eigenvalue -1 ซึ่งคือ , และคุณ สามารถยุ่งเกี่ยวกับตัวเลือกของและเพื่อสำรวจการใช้งานโดยใช้การแยกส่วนในแง่ของชุด Universal Gate (ฉันอาจตั้งให้นี่เป็นปัญหาเบื้องต้น) จากนั้น controlled-n=2k=14×4±1

(U1U2)C(U1U2),
C|ψ=(U1U2)|1(|0|1)/2U1U2UUสามารถติดตั้งได้อย่างง่ายดายเพียงแค่เปลี่ยนประตูควบคุม - ไม่ใช่ด้วยประตูควบคุมที่ควบคุมไม่ได้ (Toffoli) ในที่สุดการแปลงฟูริเยร์ผกผันก็เป็นเพียงประตู Hadamard

สำหรับบางสิ่งที่ซับซ้อนกว่านี้ให้ใส่และแทนที่ด้วยสแควร์รูทของ swap gate, ด้วยและ{2}k=3C

(1000012i200i21200001)
ω=e±iπ/4|ψ=(U1U2)(|01±|10)/2

3

ดูเหมือนว่าคุณต้องการควอนตัม "Hello World" รุ่นควอนตัมที่ตรงไปตรงมาที่สุดของเรื่องนี้ก็คือการเขียนข้อความที่เข้ารหัสแบบไบนารีHello Worldในการลงทะเบียนของ qubits แต่จะต้องมี ~ 100 qubits และยาวเกินขีด จำกัด สูงสุดของคุณสำหรับความยาวรหัส

งั้นลองเขียนข้อความสั้น ๆ มาเขียน;)กันเราต้องการสตริงความยาว 16 บิตโดยเฉพาะโดยใช้การเข้ารหัส ASCII

;)  =  00111011 00101001

ใช้ QISKit คุณทำได้โดยใช้รหัสต่อไปนี้

from qiskit import QuantumProgram
import Qconfig

qp = QuantumProgram()
qp.set_api(Qconfig.APItoken, Qconfig.config["url"]) # set the APIToken and API url

# set up registers and program
qr = qp.create_quantum_register('qr', 16)
cr = qp.create_classical_register('cr', 16)
qc = qp.create_circuit('smiley_writer', [qr], [cr])

# rightmost eight (qu)bits have ')' = 00101001
qc.x(qr[0])
qc.x(qr[3])
qc.x(qr[5])

# second eight (qu)bits have 00111011
# these differ only on the rightmost two bits
qc.x(qr[9])
qc.x(qr[8])
qc.x(qr[11])
qc.x(qr[12])
qc.x(qr[13])

# measure
for j in range(16):
    qc.measure(qr[j], cr[j])

# run and get results
results = qp.execute(["smiley_writer"], backend='ibmqx5', shots=1024)
stats = results.get_counts("smiley_writer")

แน่นอนว่านี่ไม่ใช่ควอนตัมมาก ดังนั้นคุณสามารถซ้อนทับอิโมติคอนสองตัวแทนได้ ตัวอย่างที่ง่ายที่สุดคือการซ้อนทับ) กับ 8) เนื่องจากสตริงบิตสำหรับสิ่งเหล่านี้จะแตกต่างกันเฉพาะใน qubits 8 และ 9

;)  =  00111011 00101001
8)  =  00111000 00101001

ดังนั้นคุณสามารถแทนที่เส้น

qc.x(qr[9])
qc.x(qr[8])

จากด้านบนด้วย

qc.h(qr[9]) # create superposition on 9
qc.cx(qr[9],qr[8]) # spread it to 8 with a cnot

Hadamard สร้างการทับซ้อนของ0และ1และ cnot ทำให้เป็นการทับซ้อนของ00และ11บนสอง qubits นี่คือการทับซ้อนที่จำเป็นเท่านั้นสำหรับและ;)8)

หากคุณต้องการเห็นการใช้งานจริงของสิ่งนี้สามารถพบได้ในบทช่วยสอน QISKit (การเปิดเผยเต็มรูปแบบ: เขียนโดยฉัน)


ฉันได้รับ 404 สำหรับลิงค์นั้น คุณย้ายไฟล์ไปที่อื่นหรือไม่?
klenium

ดูเหมือนว่าบทช่วยสอนจะได้รับการอัพเดต ฉันเปลี่ยนลิงค์ดังนั้นจึงควรใช้งานได้ในขณะนี้
James Wootton

1

ฉันจะเสนอตัวสร้างตัวเลขสุ่ม (สมบูรณ์) 1 บิต มันง่ายนิดเดียว:

คุณเริ่มต้นด้วย qubit เดียวในสถานะเริ่มต้นปกติ |0. จากนั้นคุณใช้ประตู HadamardH ซึ่งก่อให้เกิดการซ้อนทับที่เท่าเทียมกันของ |0 และ |1. สุดท้ายคุณก็วัดควิบิตนี้เพื่อให้ได้ 0 หรือ 1 ซึ่งแต่ละอันมีโอกาส 50%

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