IBM Quantum Experience에서 OpenQASM의 IF 문
이 입증 모란의 책 "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 월 현재)에서 지원되지 않는다고 주장하는데 , 이것이 일종의 버그일까요?
어떤 도움을 주시면 감사하겠습니다.
답변
실제로 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에서 프로그램을 계속 실행할 수 있으며 결과는 올바른 결과가됩니다. 이 문제는 상태 벡터 기반이므로 클라이언트 측 시각화에서만 나타납니다.