Qiskit SDK의 비트 순서
패키지 버전
이 페이지의 코드는 다음 요구 사항을 사용하여 개발되었습니다. 이 버전 이상을 사용하는 것을 권장합니다.
qiskit[all]~=2.3.0
개의 비트(또는 Qubit)가 있을 때, 각 비트에는 보통 의 레이블을 붙입니다. 각 소프트웨어와 리소스는 컴퓨터 메모리 및 화면 표시 시 이 비트들을 어떤 순서로 배열할지 결정해야 합니다.
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 은 가장 위쪽 Qubit이고, Qubit 은 가장 아래쪽 Qubit입니다. QuantumCircuit.draw의 reverse_bits 인수를 사용하여 이 순서를 변경할 수 있습니다(Qiskit에서 순서 변경하기 참조).
qc.x(1)
qc.draw()
q_0: ─────
┌───┐
q_1: ┤ X ├
└───┘
정수
비트를 숫자로 해석할 때, 비트 은 최하위 비트(least significant bit)이고, 비트 은 최상위 비트(most significant bit)입니다. 이는 코딩 시 각 비트가 값을 갖기 때문에 편리합니다(레이블은 QuantumCircuit.qubits에서 Qubit의 인덱스입니다). 예를 들어, 다음 Circuit 실행은 비트 이 0이고 비트 이 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) 리스트를 문자열로 표시하거나 해석할 때, 비트 은 가장 왼쪽 비트이고 비트 은 가장 오른쪽 비트입니다. 이는 숫자를 쓸 때 보통 최상위 숫자를 왼쪽에 쓰기 때문이며, Qiskit에서 비트 은 최상위 비트로 해석됩니다.
예를 들어, 다음 셀은 단일 Qubit 상태의 문자열로부터 Statevector를 정의합니다. 이 경우, Qubit 은 상태이고 Qubit 은 상태입니다.
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)}
가장 왼쪽 비트가 비트 일 것으로 예상할 수 있지만 실제로는 비트 을 나타내기 때문에, 비트 문자열을 해석할 때 간혹 혼란이 생길 수 있습니다.
Statevector 행렬
상태 벡터를 복소수(진폭) 리스트로 나타낼 때, Qiskit은 인덱스 의 진폭이 계산 기저 상태 를 나타내도록 진폭을 정렬합니다.
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 이 제어이고 Qubit 이 타겟인 controlled-X Gate를 추가합니다.
from qiskit import QuantumCircuit
qc = QuantumCircuit(2)
qc.cx(0, 1)
qc.draw()
q_0: ──■──
┌─┴─┐
q_1: ┤ X ├
└───┘
앞서 언급한 Qiskit의 모든 규칙에 따라, 이 CX-Gate는 변환을 수행하므로 다음과 같은 행렬을 갖습니다.
Qiskit에서 순서 변경하기
Qubit를 역순(즉, Qubit 이 맨 아래)으로 Circuit을 그리려면 reverse_bits 인수를 사용하세요. 이는 생성된 다이어그램에만 영향을 미치며 Circuit 자체에는 영향을 주지 않습니다. X-Gate는 여전히 Qubit 에 작용합니다.
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 에 작용한다는 점에 주의하세요.
다음 단계
- Grover 알고리즘 튜토리얼에서 Circuit 사용 예시를 확인하세요.
- QuantumCircuit API 참조 문서를 살펴보세요.