Оператор IF в OpenQASM в IBM Quantum Experience

Sep 25 2020

Это простая схема, представленная в книге Морана «Освоение квантовых вычислений с 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 г.), так может ли это быть своего рода ошибкой?

Любая помощь будет оценена по достоинству.

Ответы

2 luciano Sep 25 2020 at 19:12

Думаю, это действительно ошибка в 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, используя серверную часть симулятора, и результат будет правильным. Эта проблема возникает только в визуализациях на стороне клиента, поскольку они основаны на векторах состояний.