주 콘텐츠로 건너뛰기

Qiskit SDK의 비트 순서

패키지 버전

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

qiskit[all]~=2.5.2

nn개의 비트(또는 qubit)가 있을 때, 각 비트에는 보통 0→n−10 \rightarrow n-1의 레이블을 붙입니다. 각 소프트웨어와 리소스는 컴퓨터 메모리 및 화면 표시 시 이 비트들을 어떤 순서로 배열할지 결정해야 합니다.

Qiskit 규칙​

다음은 Qiskit SDK가 다양한 시나리오에서 비트를 정렬하는 방법입니다.

Quantum Circuit​

QuantumCircuit 클래스는 Qubit를 리스트(QuantumCircuit.qubits)에 저장합니다. 이 리스트에서 Qubit의 인덱스가 해당 Qubit의 레이블을 정의합니다.

# Added by doQumentation — required packages for this notebook
!pip install -q qiskit
from qiskit import QuantumCircuit, QuantumRegister
from qiskit.circuit import Qubit

qc = QuantumCircuit(2)
qc.qubits[0] # qubit "0"

Qubit(QuantumRegister(2, "q"), 0)
<Qubit register=(2, "q"), index=0>

Circuit 다이어그램​

Circuit 다이어그램에서 qubit 00은 가장 위쪽 Qubit이고, qubit n−1n-1은 가장 아래쪽 Qubit입니다. QuantumCircuit.draw의 reverse_bits 인수를 사용하여 이 순서를 변경할 수 있습니다(Qiskit에서 순서 변경하기 참조).

qc.x(1)
qc.draw()
q_0: ─────
┌───┐
q_1: ┤ X ├
└───┘

정수​

비트를 숫자로 해석할 때, 비트 00은 최하위 비트(least significant bit)이고, 비트 n−1n-1은 최상위 비트(most significant bit)입니다. 이는 코딩 시 각 비트가 2label2^\text{label} 값을 갖기 때문에 편리합니다(레이블은 QuantumCircuit.qubits에서 Qubit의 인덱스입니다). 예를 들어, 다음 Circuit 실행은 비트 00이 0이고 비트 11이 1인 상태로 종료됩니다. 이는 십진수 정수 2로 해석됩니다(측정 확률 1.0).

from qiskit.primitives import StatevectorSampler as Sampler

qc.measure_all()

job = Sampler().run([qc])
result = job.result()
print(f" > Counts: {result[0].data.meas.get_counts()}")
> Counts: {'10': 1024}

문자열​

비트(또는 qubit) 리스트를 문자열로 표시하거나 해석할 때, 비트 n−1n-1은 가장 왼쪽 비트이고 비트 00은 가장 오른쪽 비트입니다. 이는 숫자를 쓸 때 보통 최상위 숫자를 왼쪽에 쓰기 때문이며, Qiskit에서 비트 n−1n-1은 최상위 비트로 해석됩니다.

예를 들어, 다음 셀은 단일 qubit 상태의 문자열로부터 Statevector를 정의합니다. 이 경우, qubit 00은 ∣+⟩|+\rangle 상태이고 qubit 11은 ∣0⟩|0\rangle 상태입니다.

from qiskit.quantum_info import Statevector

sv = Statevector.from_label("0+")
sv.probabilities_dict()
{np.str_('00'): np.float64(0.4999999999999999),
np.str_('01'): np.float64(0.4999999999999999)}

가장 왼쪽 비트가 비트 00일 것으로 예상할 수 있지만 실제로는 비트 n−1n-1을 나타내기 때문에, 비트 문자열을 해석할 때 간혹 혼란이 생길 수 있습니다.

Statevector 행렬​

상태 벡터를 복소수(진폭) 리스트로 나타낼 때, Qiskit은 인덱스 xx의 진폭이 계산 기저 상태 ∣x⟩|x\rangle를 나타내도록 진폭을 정렬합니다.

print(sv[1]) # amplitude of state |01>
print(sv[2]) # amplitude of state |10>
(0.7071067811865475+0j)
0j

Gate​

Qiskit의 각 Gate는 qubit 리스트를 고유한 방식으로 해석할 수 있지만, 제어 Gate는 보통 (control, target) 규칙을 따릅니다.

예를 들어, 다음 셀은 qubit 00이 제어이고 qubit 11이 타겟인 controlled-X Gate를 추가합니다.

from qiskit import QuantumCircuit

qc = QuantumCircuit(2)
qc.cx(0, 1)
qc.draw()
q_0: ──■──
┌─┴─┐
q_1: ┤ X ├
└───┘

앞서 언급한 Qiskit의 모든 규칙에 따라, 이 CX-Gate는 ∣01⟩↔∣11⟩|01\rangle \leftrightarrow |11\rangle 변환을 수행하므로 다음과 같은 행렬을 갖습니다.

(1000000100100100)\begin{pmatrix} 1 & 0 & 0 & 0 \\ 0 & 0 & 0 & 1 \\ 0 & 0 & 1 & 0 \\ 0 & 1 & 0 & 0 \\ \end{pmatrix}

Qiskit에서 순서 변경하기​

Qubit를 역순(즉, qubit 00이 맨 아래)으로 Circuit을 그리려면 reverse_bits 인수를 사용하세요. 이는 생성된 다이어그램에만 영향을 미치며 Circuit 자체에는 영향을 주지 않습니다. X-Gate는 여전히 qubit 00에 작용합니다.

from qiskit import QuantumCircuit

qc = QuantumCircuit(2)
qc.x(0)
qc.draw(reverse_bits=True)
q_1: ─────
┌───┐
q_0: ┤ X ├
└───┘

reverse_bits 메서드를 사용하면 Qubit의 레이블이 역전된 새 Circuit을 반환할 수 있습니다(원본 Circuit은 변경되지 않습니다).

qc.reverse_bits().draw()
q_0: ─────
┌───┐
q_1: ┤ X ├
└───┘

이 새 Circuit에서 X-Gate는 qubit 11에 작용한다는 점에 주의하세요.

다음 단계​

권장 사항