Составление нескольких квантовых цепей в одной квантовой программе в 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выполняется в совершенно новом состоянии, инициализированном 00после B1.


1
Так могу ли я понять, что вы хотите иметь одну длинную цепь, состоящую из нескольких частей, и хотите, чтобы вы могли видеть результат после каждой части?
Джеймс Вуттон

да. Представьте, что у меня есть кодовая база, которая дает мне схемы, и я хочу иметь возможность составлять их в виде головоломки :)
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] {'00': 1024}

Таким образом, состояние возвращается к | 00>, как и ожидалось.


0

После выполнения измерения волновая функция квантового состояния / регистра разрушается и теряет свою квантовую природу. Не имеет смысла применять другую схему на нем.


Конечно, но если я уберу меру, я ожидаю получить 00, а я получу 1. Мера просто для того, чтобы показать, что я хочу запустить второй цикл с кубитами, инициализированными в 11.
asdf

Действительно , я хочу , чтобы мой волновой разрушаться в квантовом состоянии , а не 00 , если вы хотите поместить таким образом ...
ASDF

2
@Vidya Я понимаю, что он рушится, но я не согласен, что не имеет смысла применять другую схему к свернутому выходу предыдущей схемы.
JanVdA
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.