Мне было интересно, есть ли способ составить программу с несколькими квантовыми цепями без повторной инициализации регистра в для каждой схемы.
В частности, я хотел бы запустить второй квантовый контур после запуска первого, как в этом примере:
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
.
Ответы:
В Qiskit вы можете составить две схемы, чтобы сделать большую схему. Вы можете сделать это просто с помощью
+
оператора на цепях.Вот ваша программа, переписанная, чтобы проиллюстрировать это (примечание: для этого вам нужна последняя версия Qiskit, обновите с помощью
pip install -U qiskit
).Вы можете видеть, что qc3 является объединением q1 и q2.
Урожайность:
Теперь вы, кажется, хотите проверить состояние дважды: один раз, когда заканчивается qc1, и один раз, когда заканчивается qc2. Вы можете сделать это в симуляторе, вставив
snapshot
команды. Это сохранит вектор состояния в заданной точке схемы. Это не развал государства.Теперь вы можете выполнить
qc3
на симуляторе.Выходы: [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>, как и ожидалось.
источник
После выполнения измерения волновая функция квантового состояния / регистра разрушается и теряет свою квантовую природу. Не имеет смысла применять другую схему на нем.
источник