주 콘텐츠로 건너뛰기

Qiskit SDK의 비트 순서

패키지 버전

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

qiskit[all]~=2.3.0

nn개의 비트(또는 Qubit)가 있을 때, 각 비트에는 보통 0n10 \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 n1n-1은 가장 아래쪽 Qubit입니다. QuantumCircuit.drawreverse_bits 인수를 사용하여 이 순서를 변경할 수 있습니다(Qiskit에서 순서 변경하기 참조).

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

정수

비트를 숫자로 해석할 때, 비트 00은 최하위 비트(least significant bit)이고, 비트 n1n-1은 최상위 비트(most significant bit)입니다. 이는 코딩 시 각 비트가 2label2^\text{label} 값을 갖기 때문에 편리합니다(레이블은 QuantumCircuit.qubits에서 Qubit의 인덱스입니다). 예를 들어, 다음 Circuit 실행은 비트 000이고 비트 111인 상태로 종료됩니다. 이는 십진수 정수 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) 리스트를 문자열로 표시하거나 해석할 때, 비트 n1n-1은 가장 왼쪽 비트이고 비트 00은 가장 오른쪽 비트입니다. 이는 숫자를 쓸 때 보통 최상위 숫자를 왼쪽에 쓰기 때문이며, Qiskit에서 비트 n1n-1은 최상위 비트로 해석됩니다.

예를 들어, 다음 셀은 단일 Qubit 상태의 문자열로부터 Statevector를 정의합니다. 이 경우, Qubit 00+|+\rangle 상태이고 Qubit 110|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일 것으로 예상할 수 있지만 실제로는 비트 n1n-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는 0111|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에 작용한다는 점에 주의하세요.

다음 단계

권장 사항