주 콘텐츠로 건너뛰기
이 프로젝트는 베타 단계입니다. 버그를 발견하셨나요? GitHub 이슈 만들기. 질문이나 아이디어가 있으신가요? Discussions에서 질문하기 — 피드백을 기다립니다!
이 페이지의 번역 품질은 어떻습니까?

Qiskit SDK의 비트 순서

패키지 버전

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

qiskit[all]~=2.6.1

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

Qiskit 규칙​

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

프리미티브​

기본적으로 Qiskit은 리틀 엔디언 비트 순서 규칙을 따라요. 하지만 BitArray의 기본값은 big(엔디언)이어서, 프리미티브가 이 설정을 변경하는지 여부에 따라 프리미티브 출력에 차이가 생겨요. 예를 들어 IBM® Quantum Compute Service의 Sampler와 Estimator 프리미티브는 빅 엔디언 결과를 반환하지만, Executor는 리틀 엔디언 결과를 반환해요.

Quantum Circuit​

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

# Added by doQumentation — installs the packages this notebook needs if they are missing
import importlib.util

_needed = {"qiskit": "qiskit"}
_missing = [pip for module, pip in _needed.items()
if importlib.util.find_spec(module) is None]
# One at a time, so a package that fails to install does not block the others
for _pip in _missing:
%pip install -q {_pip}
if not _missing:
print("\u2713 All required packages are installed")
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 행렬​

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에 작용한다는 점에 주의하세요.

다음 단계​

권장 사항