Tổng hợp nhiều mạch lượng tử trong chương trình lượng tử đơn trong QISKit


9

Tôi đã tự hỏi nếu có một cách để soạn một chương trình với nhiều mạch lượng tử mà không có thanh ghi được khởi tạo lại ở cho mỗi mạch.0

Cụ thể, tôi muốn chạy một mạch lượng tử thứ hai sau khi chạy mạch thứ nhất, như trong ví dụ này:

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'))

Thật không may, những gì tôi nhận được là kết quả tương tự cho hai lần chạy (tức là số đếm 11cho B1B2thay vì 1100cho lần thứ hai, như thể B2được chạy trên trạng thái hoàn toàn mới được khởi tạo 00sau đó B1.


1
Vì vậy, tôi có thể hiểu nó như bạn muốn một mạch dài bao gồm nhiều phần, và bạn muốn có thể thấy đầu ra sau mỗi phần?
James Wootton

Đúng. Hãy tưởng tượng tôi có một cơ sở mã cung cấp cho tôi các mạch và tôi muốn có thể soạn chúng thành một câu đố :)
asdf

(biện pháp là có để chỉ cho bạn thấy đó không phải là hành vi dự kiến)
asdf

Câu trả lời:


2

Trong Qiskit, bạn có thể kết hợp hai mạch để tạo ra một mạch lớn hơn. Bạn có thể làm điều này đơn giản bằng cách sử dụng +toán tử trên các mạch.

Đây là chương trình của bạn được viết lại để minh họa điều này (lưu ý: bạn cần phiên bản mới nhất của Qiskit cho việc này, nâng cấp với 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

Bạn có thể thấy rằng qc3 là sự kết hợp của q1 và q2.

print(qc3.qasm())

Sản lượng:

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

Bây giờ, bạn dường như muốn thăm dò trạng thái hai lần: một lần khi qc1 kết thúc và một lần khi qc2 kết thúc. Bạn có thể làm điều này trong một trình giả lập bằng cách chèn snapshotcác lệnh. Điều này sẽ lưu statevector tại một điểm nhất định trong mạch. Nó không sụp đổ nhà nước.

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

Bây giờ bạn có thể thực hiện qc3trên một trình giả lập.

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

Năng suất: [0. + 0.j 0. + 0.j 0. + 0.j 1. + 0.j] [1. + 0.j 0. + 0.j 0. + 0.j 0. + 0.j] {'00': 1024}

Vì vậy, nhà nước trở lại | 00> như mong đợi.


0

Khi bạn thực hiện phép đo, hàm sóng của trạng thái lượng tử / thanh ghi sẽ sụp đổ và nó mất bản chất lượng tử. Nó không có ý nghĩa để áp dụng một mạch khác trên nó.


Chắc chắn là chắc chắn, nhưng nếu tôi loại bỏ biện pháp này, tôi sẽ mong nhận được 00, trong khi tôi nhận được 1. Biện pháp này chỉ để cho thấy rằng tôi muốn bắt đầu mạch thứ hai với các qubit được khởi tạo thành 11.
asdf

Quả thực tôi muốn hàm sóng của mình sụp đổ ở trạng thái lượng tử chứ không phải 00 nếu bạn muốn nó được đặt theo cách đó ...
asdf

2
@Vidya Tôi hiểu rằng nó bị sập nhưng tôi không đồng ý rằng việc áp dụng một mạch khác vào đầu ra bị sập của mạch trước đó sẽ không có ý nghĩa gì.
JanVdA
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.