IBM Quantum Experience에서 OpenQASM의 IF 문

Sep 25 2020

이 입증 모란의 책 "IBM QX와 마스터 양자 컴퓨팅"에 도입 된 간단한 회로 얼마나 경우 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 (10 진수)을 유지하므로 if 조건 을 충족하기 때문 입니다. 그러나 IBM QX의 Circuit Composer에서이 정확한 회로를 테스트하면 결과 에 100 % 확률로 00001 이 표시 됩니다.

흥미롭게도를 if (c==1)로 변경 if (c==0)하면 결과는 이제 100 % 확률로 00011 이되며 논리적으로 옳지 않다고 생각합니다.

이 불일치에 대한 설명은 무엇입니까? 이 책은 if 문이 IBM QX (2019 년 1 월 현재)에서 지원되지 않는다고 주장하는데 , 이것이 일종의 버그일까요?

어떤 도움을 주시면 감사하겠습니다.

답변

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에서 프로그램을 계속 실행할 수 있으며 결과는 올바른 결과가됩니다. 이 문제는 상태 벡터 기반이므로 클라이언트 측 시각화에서만 나타납니다.