การเขียนวงจรควอนตัมหลายตัวในโปรแกรมควอนตัมเดี่ยวใน QISKit


9

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

โดยเฉพาะฉันต้องการเรียกใช้วงจรควอนตัมที่สองหลังจากใช้วงจรแรกดังตัวอย่างนี้:

qp = QuantumProgram()
qr = qp.create_quantum_register('qr',2)
cr = qp.create_classical_register('cr',2)

qc1 = qp.create_circuit('B1',[qr],[cr])
qc1.x(qr)

qc1.measure(qr[0], cr[0])
qc1.measure(qr[1], cr[1])

qc2 = qp.create_circuit('B2', [qr], [cr])
qc2.x(qr)
qc2.measure(qr[0], cr[0])
qc2.measure(qr[1], cr[1])

#qp.add_circuit('B1', qc1)
#qp.add_circuit('B2', qc2)

pprint(qp.get_qasms())

result = qp.execute()

print(result.get_counts('B1'))
print(result.get_counts('B2'))

แต่น่าเสียดายที่สิ่งที่ฉันได้รับคือผลเหมือนกันสำหรับทั้งสองวิ่ง (เช่นการนับ11สำหรับB1และB2แทน11และ00เป็นครั้งที่สองเช่นถ้าB2มีการเรียกใช้ในรัฐใหม่ที่สมบูรณ์แบบเริ่มต้นบนหลัง00B1


1
ฉันสามารถเข้าใจได้ไหมว่าคุณต้องการวงจรยาวหนึ่งประกอบด้วยหลายส่วนและคุณต้องการเห็นผลลัพธ์หลังจากแต่ละส่วน
James Wootton

ใช่. ลองนึกภาพฉันมีฐานรหัสที่ให้วงจรและฉันต้องการที่จะสามารถเขียนพวกเขาเป็นตัวต่อได้ :)
asdf

(ตัวชี้วัดอยู่ที่นั่นเพียงเพื่อแสดงให้คุณเห็นว่าไม่ใช่พฤติกรรมที่คาดหวัง)
asdf

คำตอบ:


2

ใน Qiskit คุณสามารถเขียนสองวงจรเพื่อสร้างวงจรที่ใหญ่ขึ้น คุณสามารถทำได้โดยใช้ตัว+ดำเนินการบนวงจร

นี่คือโปรแกรมของคุณเขียนใหม่เพื่อแสดงสิ่งนี้ (หมายเหตุ: คุณต้องมีรุ่นล่าสุดของ Qiskit สำหรับเรื่องนี้อัพเกรดด้วยpip install -U qiskit)

from qiskit import *
qr = QuantumRegister(2)
cr = ClassicalRegister(2)
qc1 = QuantumCircuit(qr, cr)
qc1.x(qr)

qc2 = QuantumCircuit(qr, cr)
qc2.x(qr)

qc3 = qc1 + qc2

คุณจะเห็นว่า qc3 เป็นการต่อเชื่อม q1 และ q2

print(qc3.qasm())

อัตราผลตอบแทน:

OPENQASM 2.0;
include "qelib1.inc";
qreg q0[2];
creg c0[2];
x q0[0];
x q0[1];
x q0[0];
x q0[1];

ตอนนี้คุณดูเหมือนจะต้องการสอบสวนสถานะสองครั้ง: ครั้งหนึ่งเมื่อสิ้นสุด qc1 และอีกครั้งเมื่อจบ qc2 คุณสามารถทำได้ในตัวจำลองโดยการแทรกsnapshotคำสั่ง สิ่งนี้จะช่วยประหยัดสถานะของนักแสดง ณ จุดใดจุดหนึ่งในวงจร มันไม่ยุบรัฐ

from qiskit.extensions.simulator import *
qc1.snapshot('0')    # save the snapshot in slot "0"
qc2.snapshot('1')    # save the snapshot in slot "1"
qc2.measure(qr, cr)  # measure to get final counts

qc3 = qc1 + qc2

ตอนนี้คุณสามารถรันqc3โปรแกรมจำลอง

job = execute(qc3, 'local_qasm_simulator')
result = job.result()
print(result.get_snapshot('0'))
print(result.get_snapshot('1'))
print(result.get_counts())

อัตราผลตอบแทน: [0. + 0.j 0. + 0.j 0. + 0.j 1. + 0.j] [1. + 0.j 0. + 0.j 0. + 0.j 0. + 0.j 0. + 0.j] {'00': 1024}

ดังนั้นรัฐจึงกลับไปที่ | 00> ตามที่คาดไว้


0

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


แน่นอนว่า แต่ถ้าฉันลบการวัดออกฉันคาดหวังว่าจะได้ 00 ในขณะที่ฉันได้ 1 การวัดเป็นเพียงการแสดงให้เห็นว่าฉันต้องการเริ่มวงจรที่สองโดย qubits เริ่มต้นที่ 11
asdf

แน่นอนว่าฉันต้องการให้ wavefunction ของฉันยุบในสถานะควอนตัมและไม่ใช่ 00 หากคุณต้องการให้เป็นเช่นนั้น ...
asdf

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