QISKit'te tek kuantum programında birden çok kuantum devre oluşturma


9

Her devre için kayıt yeniden başlatılmadan çoklu kuantum devreleri olan bir program oluşturmanın bir yolu olup olmadığını merak ediyordum .0

Özellikle, bu örnekte olduğu gibi, ilkini çalıştırdıktan sonra ikinci bir kuantum devresini çalıştırmak istiyorum:

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

Ne yazık ki, ne olsun yani bir sayım (iki çalışmanın da aynı sonucu 11için B1ve B2yerine 11ve 00sanki saniyeliğine B2üzerinde başlatılmış tamamen yeni durumuna çalıştırılır 00sonra B1.


1
Yani, birden fazla parçadan oluşan uzun bir devre istediğinizi anlayabilir miyim ve her parçadan sonra çıktıyı görmek mi istiyorsunuz?
James Wootton

Evet. Bana devreleri veren bir kod tabanım olduğunu hayal edin ve onları bir bulmaca olarak oluşturmak istiyorum :)
asdf

(önlem sadece beklenen davranış olmadığını göstermek için orada)
asdf

Yanıtlar:


2

Qiskit'te daha büyük bir devre yapmak için iki devre oluşturabilirsiniz. Bunu sadece +devrelerdeki operatörü kullanarak yapabilirsiniz .

Programınız bunu göstermek için yeniden yazılmıştır (not: bunun için Qiskit'in en son sürümüne ihtiyacınız var, yükseltme yapın 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'ün q1 ve q2'nin bir birleşimi olduğunu görebilirsiniz.

print(qc3.qasm())

Verim:

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

Şimdi, durumu iki kez araştırmak istiyorsunuz: bir kez qc1'in bittiği yerde ve bir kez qc2 sona erdiğinde. snapshotKomutları ekleyerek bunu bir simülatörde yapabilirsiniz . Bu, statevektörü devrede belirli bir noktaya kaydedecektir. Devleti yıkmaz.

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

Artık qc3bir simülatörde çalıştırabilirsiniz .

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

Verimler: [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}

Devlet beklendiği gibi | 00> 'ya geri döner.


0

Bir ölçüm yaptıktan sonra, kuantum durumunun / kaydının dalga fonksiyonu çöker ve kuantum doğasını kaybeder. Üzerine başka bir devre uygulamak mantıklı değil.


Elbette, ancak ölçüyü kaldırırsam, 1 alırken 00 almayı beklerim. Ölçü, ikinci devreye, kubitler 11'e başlamış olarak başlamak istediğimi göstermek içindir.
asdf

Gerçekten de dalga fonksiyonumun kuantum halde çökmesini ve bu şekilde olmasını istemiyorsanız 00 değil ...
asdf

2
@Vidya çöktüğünü anlıyorum ama önceki devrenin daraltılmış çıkışına başka bir devre uygulamak mantıklı olmayacak.
JanVdA
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.