Оператор IF в OpenQASM в IBM Quantum Experience
Это простая схема, представленная в книге Морана «Освоение квантовых вычислений с IBM QX», чтобы продемонстрировать, как if работает в OpenQASM:
OPENQASM 2.0;
include "qelib1.inc";
qreg q[5]; // Quantum Register
creg c[5]; // Classical Register
x q[0];
measure q[0] -> c[0];
if (c==1) x q[1];
measure q[1] -> c[1];
А вот так визуально схема выглядит в IBM QX Circuit Composer:
В книге говорится, что в конце схемы классический регистр должен читать 00011, потому что после первого измерения он содержит значение 1 (в виде десятичного числа), таким образом удовлетворяя условию if . Однако, когда я тестирую эту точную схему в IBM QX's Circuit Composer, результат показывает 00001 со 100% вероятностью.
Достаточно интересно, что при if (c==1)изменении if (c==0)на результат теперь будет 00011 со 100% вероятностью, что я не считаю логически правильным.
Чем должно быть объяснение этого несоответствия? В книге утверждается, что оператор if не поддерживается IBM QX (по состоянию на январь 2019 г.), так может ли это быть своего рода ошибкой?
Любая помощь будет оценена по достоинству.
Ответы
Думаю, это действительно ошибка в IQX.Этому есть объяснение, но оно немного неясное. Это будет объяснено позже.
Ваш код правильный:
Вот результат в Qiskit.
С c==1:
from qiskit import *
qc = QuantumCircuit.from_qasm_str("""
OPENQASM 2.0;
include "qelib1.inc";
qreg q[5]; // Quantum Register
creg c[5]; // Classical Register
x q[0];
measure q[0] -> c[0];
if (c==1) x q[1];
measure q[1] -> c[1];
""")
qc.draw('mpl')
backend = BasicAer.get_backend('qasm_simulator')
execute(qc,backend).result().get_counts()
{'00011': 1024}
С c==0:
from qiskit import *
qc = QuantumCircuit.from_qasm_str("""
OPENQASM 2.0;
include "qelib1.inc";
qreg q[5]; // Quantum Register
creg c[5]; // Classical Register
x q[0];
measure q[0] -> c[0];
if (c==0) x q[1];
measure q[1] -> c[1];
""")
qc.draw('mpl')
backend = BasicAer.get_backend('qasm_simulator')
execute(qc,backend).result().get_counts()
{'00001': 1024}
Почему это не работает с визуализациями IQX
В документации IQX есть примечание для визуализаций :
Ключевая часть:
Визуализации не отражают никаких измерительных операций в вашей цепи.
Это означает, что ваш measureоператор игнорируется, и ваш код остается таким:
x q[0];
if (c==1) x q[1];
Начальное состояние c- 0. Следовательно, как раз в x q[0];результате 00001.
Когда вы изменили на c==0, тогда схема будет x q[0]; x q[1];, в результате чего 00011.
Я поговорил с разработчиками IQX, и они работают над лучшим решением, чтобы не пропускать измерения молча. Вы по-прежнему можете запускать свою программу в IQX, используя серверную часть симулятора, и результат будет правильным. Эта проблема возникает только в визуализациях на стороне клиента, поскольку они основаны на векторах состояний.