주 콘텐츠로 건너뛰기

Qubit 측정하기

패키지 버전

이 페이지의 코드는 다음 요구 사항을 사용하여 개발되었습니다. 이 버전 이상을 사용하길 권장해요.

qiskit[all]~=2.3.0
qiskit-ibm-runtime~=0.43.1

Qubit의 상태에 대한 정보를 얻으려면, 고전 비트(classical bit)로 _측정_할 수 있습니다. Qiskit에서 측정은 계산 기저(computational basis), 즉 단일 Qubit의 Pauli-ZZ 기저에서 수행됩니다. 따라서 측정은 Pauli-ZZ 고유 상태 0|0\rangle1|1\rangle과의 겹침에 따라 0 또는 1을 산출합니다:

qmeasure{0(outcome+1),with probability p0=q02,1(outcome1),with probability p1=q12.|q\rangle \xrightarrow{measure}\begin{cases} 0 (\text{outcome}+1), \text{with probability } p_0=|\langle q|0\rangle|^{2}\text{,} \\ 1 (\text{outcome}-1), \text{with probability } p_1=|\langle q|1\rangle|^{2}\text{.} \end{cases}

회로 중간 측정

회로 중간 측정(Mid-circuit measurements)은 동적 Circuit의 핵심 구성 요소입니다. qiskit-ibm-runtime v0.43.0 이전에는 measure가 Qiskit에서 유일한 측정 명령어였습니다. 그러나 회로 중간 측정은 종단 측정(Terminal measurements, Circuit 끝에서 수행되는 측정)과 다른 튜닝 요구 사항을 갖습니다. 예를 들어, 회로 중간 측정을 튜닝할 때는 명령어 지속 시간을 고려해야 합니다. 더 긴 명령어일수록 Circuit에 더 많은 노이즈를 발생시키기 때문입니다. 종단 측정 이후에는 명령어가 없으므로 종단 측정의 경우 명령어 지속 시간을 고려할 필요가 없습니다.

qiskit-ibm-runtime v0.43.0에서 MidCircuitMeasure 명령어가 도입되었습니다. 이름에서 알 수 있듯이, 이는 IBM® QPU에서의 회로 중간 측정에 최적화된 새로운 측정 명령어입니다.

참고

MidCircuitMeasure 명령어는 Backend의 supported_instructions에 보고된 measure_2 명령어에 매핑됩니다. 그러나 measure_2는 모든 Backend에서 지원되지는 않습니다. service.backends(filters=lambda b: "measure_2" in b.supported_instructions)를 사용하여 지원되는 Backend를 찾으세요. 향후에 새로운 측정 방식이 추가될 수 있지만, 이것이 보장되지는 않습니다.

Circuit에 측정 적용하기

Circuit에 측정을 적용하는 방법에는 여러 가지가 있습니다:

QuantumCircuit.measure 메서드

measure 메서드를 사용하여 QuantumCircuit을 측정합니다.

예시:

# Added by doQumentation — required packages for this notebook
!pip install -q qiskit qiskit-ibm-runtime
from qiskit import QuantumCircuit

qc = QuantumCircuit(5, 5)
qc.x(0)
qc.x(1)
qc.x(4)
qc.measure(
range(5), range(5)
) # Measures all qubits into the corresponding clbit.
<qiskit.circuit.instructionset.InstructionSet at 0x7fdc54260490>
from qiskit import QuantumCircuit

qc = QuantumCircuit(3, 1)
qc.x([0, 2])
qc.measure(1, 0) # Measure qubit 1 into the classical bit 0.
<qiskit.circuit.instructionset.InstructionSet at 0x7fdc54260820>

Measure 클래스

Qiskit의 Measure 클래스는 지정된 Qubit을 측정합니다.

from qiskit.circuit import Measure

qc = QuantumCircuit(3, 1)
qc.x([0, 1])
qc.append(Measure(), [0], [0]) # measure qubit 0 into clbit 0
<qiskit.circuit.instructionset.InstructionSet at 0x7fdc54260df0>

QuantumCircuit.measure_all 메서드

모든 Qubit을 해당하는 고전 비트로 측정하려면 measure_all 메서드를 사용합니다. 기본적으로 이 메서드는 이러한 측정을 저장하기 위해 ClassicalRegister에 새로운 고전 비트를 추가합니다.

from qiskit import QuantumCircuit

qc = QuantumCircuit(3, 1)
qc.x([0, 2])
qc.measure_all() # Measure all qubits.

QuantumCircuit.measure_active 메서드

유휴 상태가 아닌 모든 Qubit을 측정하려면 measure_active 메서드를 사용합니다. 이 메서드는 측정되는 비유휴 Qubit의 수와 동일한 크기의 새로운 ClassicalRegister를 생성합니다.

from qiskit import QuantumCircuit

qc = QuantumCircuit(3, 1)
qc.x([0, 2])
qc.measure_active() # Measure qubits that are not idle, that is, qubits 0 and 2.

MidCircuitMeasure 메서드

MidCircuitMeasure를 사용하여 회로 중간 측정을 적용합니다(qiskit-ibm-runtime v0.43.0 이상 필요). 회로 중간 측정에 QuantumCircuit.measure를 사용할 수도 있지만, 설계상 MidCircuitMeasure가 일반적으로 더 나은 선택입니다. 예를 들어, QuantumCircuit.measure를 사용하는 것보다 Circuit에 더 적은 오버헤드를 추가합니다.

from qiskit import QuantumCircuit
from qiskit_ibm_runtime import QiskitRuntimeService
from qiskit_ibm_runtime.circuit import MidCircuitMeasure
from qiskit.circuit import Measure

service = QiskitRuntimeService()
backend = service.least_busy(operational=True, simulator=False)

circ = QuantumCircuit(2, 2)
circ.x(0)
circ.append(MidCircuitMeasure(), [0], [0])
# circ.measure([0], [0])
# circ.measure_all()
print(circ.draw(cregbundle=False))
┌───┐┌────────────┐
q_0: ┤ X ├┤0 ├
└───┘│ │
q_1: ─────┤ Measure_2 ├
│ │
c_0: ═════╡0 ╞
└────────────┘
c_1: ═══════════════════
중요 사항
  • 측정을 사용하려면 최소 하나의 고전 레지스터가 있어야 합니다.
  • Sampler 프리미티브는 Circuit 측정이 필요합니다. Estimator 프리미티브에도 Circuit 측정을 추가할 수 있지만 무시됩니다.

다음 단계

권장 사항