ข้ามไปยังเนื้อหาหลัก
โครงการนี้อยู่ในช่วงเบต้า พบข้อผิดพลาด? สร้าง GitHub Issue มีคำถามหรือไอเดีย? ถามใน Discussions — ยินดีรับฟังความคิดเห็น!
คุณภาพการแปลในหน้านี้เป็นอย่างไร?

การเรียงลำดับบิตใน Qiskit SDK

เวอร์ชันของแพ็กเกจ

โค้ดในหน้านี้พัฒนาโดยใช้ requirements ต่อไปนี้ แนะนำให้ใช้เวอร์ชันเหล่านี้หรือใหม่กว่า

qiskit[all]~=2.5.2

ถ้ามีบิต (หรือ Qubit) จำนวน nn ตัว โดยปกติแต่ละบิตจะถูกกำกับหมายเลข 0→n−10 \rightarrow n-1 ซอฟต์แวร์และแหล่งข้อมูลต่างๆ ต้องเลือกวิธีการเรียงลำดับบิตเหล่านี้ทั้งในหน่วยความจำคอมพิวเตอร์และการแสดงผลบนหน้าจอ

ข้อตกลงของ Qiskit​

นี่คือวิธีที่ Qiskit SDK เรียงลำดับบิตในสถานการณ์ต่างๆ

Primitives​

โดยค่าเริ่มต้น Qiskit ใช้รูปแบบการเรียงลำดับบิตแบบ little-endian อย่างไรก็ตาม ค่าเริ่มต้นของ BitArray คือ big (endian) ซึ่งทำให้ผลลัพธ์ของ primitive แตกต่างกันบ้าง ขึ้นอยู่กับว่า primitive นั้นเปลี่ยนการตั้งค่านี้หรือไม่ ตัวอย่างเช่น primitive Sampler และ Estimator ของ IBM® Quantum Compute Service คืนผลลัพธ์แบบ big-endian แต่ Executor คืนผลลัพธ์แบบ little-endian

Quantum Circuit​

คลาส QuantumCircuit เก็บ Qubit ในรายการ (QuantumCircuit.qubits) ดัชนีของ Qubit ในรายการนี้คือ label ของ 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 n−1n-1 จะอยู่ล่างสุด สามารถเปลี่ยนสิ่งนี้ได้ด้วยอาร์กิวเมนต์ reverse_bits ของ QuantumCircuit.draw (ดู การเปลี่ยนลำดับใน Qiskit)

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

จำนวนเต็ม​

เมื่อตีความบิตเป็นตัวเลข บิต 00 คือบิตที่มีนัยสำคัญน้อยที่สุด (least significant bit) และบิต n−1n-1 คือบิตที่มีนัยสำคัญมากที่สุด (most significant bit) ซึ่งเป็นประโยชน์ในการเขียนโค้ดเพราะแต่ละบิตมีค่า 2label2^\text{label} (label คือดัชนีของ Qubit ใน QuantumCircuit.qubits) ตัวอย่างเช่น Circuit ต่อไปนี้เมื่อ execute เสร็จแล้ว บิต 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 ถูกตีความว่าเป็น most significant bit

ตัวอย่างเช่น เซลล์ต่อไปนี้กำหนด Statevector จากสตริงของสถานะ single-qubit ในกรณีนี้ 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 เป็นรายการของจำนวนเชิงซ้อน (amplitudes) Qiskit จัดเรียง amplitude เหล่านี้โดยให้ amplitude ที่ดัชนี xx แทน computational basis state ∣x⟩|x\rangle

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

Gate​

แต่ละ Gate ใน Qiskit สามารถตีความรายการ Qubit ในแบบของตัวเอง แต่ controlled gate มักจะใช้ข้อตกลง (control, target)

ตัวอย่างเช่น เซลล์ต่อไปนี้เพิ่ม controlled-X gate โดยที่ Qubit 00 เป็น control และ Qubit 11 เป็น target

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​

ในการวาด Circuit ด้วย Qubit ในลำดับย้อนกลับ (นั่นคือ Qubit 00 อยู่ล่างสุด) ให้ใช้อาร์กิวเมนต์ 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 เพื่อส่งคืน Circuit ใหม่ที่มี label ของ Qubit ย้อนกลับ (โดยไม่เปลี่ยนแปลง Circuit เดิม)

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

โปรดทราบว่าใน Circuit ใหม่นี้ X-gate กระทำบน Qubit 11

ขั้นตอนถัดไป​

คำแนะนำ