Instruction IF dans OpenQASM sur IBM Quantum Experience

Sep 25 2020

Ceci est un circuit simple , introduit dans le livre de Moran « Mastering Quantum Computing avec IBM QX » pour montrer comment si les travaux en 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];

Et voici à quoi ressemble le circuit dans IBM QX Circuit Composer:

Le livre indique qu'à la fin du circuit, le registre classique devrait lire 00011 car après la première mesure, il détient la valeur 1 (en nombre décimal), satisfaisant ainsi la condition if . Cependant, lorsque je teste ce circuit exact dans Circuit Composer d'IBM QX, le résultat montre 00001 avec une probabilité de 100%.

Fait intéressant, quand if (c==1)est changé en if (c==0), le résultat est maintenant 00011 avec une probabilité de 100%, ce que je ne pense pas logiquement correct.

Quelle devrait être l'explication de cet écart? Le livre soutient que l' instruction if n'est pas prise en charge par IBM QX (à partir de janvier 2019), cela pourrait-il donc être une sorte de bogue?

Toute aide serait appréciée.

Réponses

2 luciano Sep 25 2020 at 19:12

Je pense que c'est, en effet, un bogue dans IQX.Il y a une explication à cela, mais c'est un peu obscur. Cela sera expliqué plus tard.

Votre code est correct:

Voici le résultat dans Qiskit.

Avec 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}

Avec 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}

Pourquoi cela ne fonctionne pas sur les visualisations IQX

Il y a une note dans la documentation IQX pour les visualisations :

La partie clé est:

Les visualisations ne reflètent aucune opération de mesure dans votre circuit.

Cela signifie que votre measuredéclaration est ignorée, laissant votre code comme ceci:

x q[0];
if (c==1) x q[1];

L'état initial de cest 0. Par conséquent, il en x q[0];résulte simplement 00001.

Lorsque vous êtes passé à c==0, alors le circuit est x q[0]; x q[1];, résultant en 00011.

J'ai parlé avec les développeurs IQX et ils travaillent sur une meilleure solution pour éviter de sauter des mesures en silence. Vous pouvez toujours exécuter votre programme dans IQX en utilisant un backend de simulateur et le résultat sera le bon. Ce problème n'apparaît que dans les visualisations côté client, car elles sont basées sur des vecteurs d'état.