Zastanawiałem się, czy istnieje sposób na skomponowanie programu z wieloma obwodami kwantowymi bez ponownej inicjalizacji rejestru dla wartości dla każdego obwodu.
W szczególności chciałbym uruchomić drugi obwód kwantowy po uruchomieniu pierwszego, jak w tym przykładzie:
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'))
Niestety, otrzymuję ten sam wynik dla dwóch przebiegów (tj. Liczba 11
dla B1
i B2
zamiast 11
i 00
dla drugiego, tak jakby B2
był uruchamiany w zupełnie nowym stanie zainicjowanym 00
po B1
.
algorithm
programming
qiskit
asdf
źródło
źródło
Odpowiedzi:
W Qiskit możesz skomponować dwa obwody, aby uzyskać większy obwód. Możesz to zrobić po prostu za pomocą
+
operatora w obwodach.Oto twój program przepisany, aby to zilustrować (uwaga: potrzebujesz do tego najnowszej wersji Qiskit, zaktualizuj za pomocą
pip install -U qiskit
).Widać, że qc3 jest konkatenacją q1 i q2.
Wydajność:
Teraz wydaje się, że chcesz zbadać stan dwukrotnie: raz, gdy kończy się qc1, i raz, gdy kończy się qc2. Możesz to zrobić w symulatorze, wstawiając
snapshot
polecenia. Uratuje to statevector w danym punkcie obwodu. Nie zwija stanu.Możesz teraz wykonać
qc3
na symulatorze.Wydajność: [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}
Tak więc stan wraca do | 00> zgodnie z oczekiwaniami.
źródło
Po wykonaniu pomiaru funkcja falowa stanu kwantowego / rejestru zapada się i traci swoją kwantową naturę. Zastosowanie na nim innego obwodu nie ma sensu.
źródło