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

การใช้งาน Qiskit

ในบทเรียนก่อนหน้า เราได้ดูคลาส Statevector และ Operator ใน Qiskit เป็นครั้งแรก และใช้พวกมันจำลองการดำเนินการและการวัดบน Qubit เดี่ยว ในส่วนนี้ เราจะใช้คลาสเหล่านี้เพื่อสำรวจพฤติกรรมของหลาย Qubit

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

_needed = {"numpy": "numpy", "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 __version__

print(__version__)
2.1.1

เราจะเริ่มด้วยการนำเข้าคลาส Statevector และ Operator รวมถึงฟังก์ชัน square root จาก NumPy ต่อจากนี้ โดยทั่วไปเราจะจัดการนำเข้าทั้งหมดที่จำเป็นก่อนในแต่ละบทเรียน

from qiskit.quantum_info import Statevector, Operator
from numpy import sqrt

ผลคูณเทนเซอร์​

คลาส Statevector มีเมธอด tensor ซึ่งคืนค่าผลคูณเทนเซอร์ของ Statevector นั้นกับอีกตัวที่ส่งเข้ามาเป็นอาร์กิวเมนต์ อาร์กิวเมนต์จะถูกตีความเป็นตัวประกอบเทนเซอร์ทางขวา

ตัวอย่างเช่น ด้านล่างเราสร้างเวกเตอร์สถานะสองอันที่แทน ∣0⟩\vert 0\rangle และ ∣1⟩\vert 1\rangle และใช้เมธอด tensor เพื่อสร้างเวกเตอร์ใหม่ ∣ψ⟩=∣0⟩⊗∣1⟩\vert \psi\rangle = \vert 0\rangle \otimes \vert 1\rangle สังเกตว่าเราใช้เมธอด from_label เพื่อกำหนดสถานะ ∣0⟩\vert 0\rangle และ ∣1⟩\vert 1\rangle แทนที่จะกำหนดเอง

zero = Statevector.from_label("0")
one = Statevector.from_label("1")
psi = zero.tensor(one)
display(psi.draw("latex"))

∣01⟩ |01\rangle

label ที่อนุญาตอื่นๆ รวมถึง "+" และ "-" สำหรับสถานะ plus และ minus รวมถึง "r" และ "l" (ย่อมาจาก "right" และ "left") สำหรับสถานะ

∣+i⟩=12∣0⟩+i2∣1⟩and∣−i⟩=12∣0⟩−i2∣1⟩.\vert {+i} \rangle = \frac{1}{\sqrt{2}} \vert 0 \rangle + \frac{i}{\sqrt{2}} \vert 1 \rangle \qquad\text{and}\qquad \vert {-i} \rangle = \frac{1}{\sqrt{2}} \vert 0 \rangle - \frac{i}{\sqrt{2}} \vert 1 \rangle.

ในที่นี้ "+", "-" หรือ "right" และ "left" มาจากบริบทของสปินในกลศาสตร์ควอนตัม ซึ่งองค์ประกอบของสปินอาจชี้ไปทางซ้ายหรือขวาในการทดลอง ไม่ได้หมายถึง Qubit ขวาสุดหรือซ้ายสุดในระบบที่มีหลาย Qubit นี่คือตัวอย่างของผลคูณเทนเซอร์ของ ∣+⟩\vert {+} \rangle และ ∣−i⟩\vert {-i} \rangle

plus = Statevector.from_label("+")
minus_i = Statevector.from_label("l")
phi = plus.tensor(minus_i)
display(phi.draw("latex"))

12∣00⟩−i2∣01⟩+12∣10⟩−i2∣11⟩\frac{1}{2} |00\rangle- \frac{i}{2} |01\rangle+\frac{1}{2} |10\rangle- \frac{i}{2} |11\rangle

ทางเลือกหนึ่งคือใช้การดำเนินการ ^ สำหรับ tensor product ซึ่งให้ผลลัพธ์เหมือนกัน

display((plus ^ minus_i).draw("latex"))

12∣00⟩−i2∣01⟩+12∣10⟩−i2∣11⟩\frac{1}{2} |00\rangle- \frac{i}{2} |01\rangle+\frac{1}{2} |10\rangle- \frac{i}{2} |11\rangle

คลาส Operator ก็มีเมธอด tensor เช่นกัน (รวมถึงเมธอด from_label) ดังที่เห็นในตัวอย่างต่อไปนี้

H = Operator.from_label("H")
Id = Operator.from_label("I")
X = Operator.from_label("X")
display(H.tensor(Id).draw("latex"))
display(H.tensor(Id).tensor(X).draw("latex"))
[220220022022220−2200220−22] \begin{bmatrix} \frac{\sqrt{2}}{2} & 0 & \frac{\sqrt{2}}{2} & 0 \\ 0 & \frac{\sqrt{2}}{2} & 0 & \frac{\sqrt{2}}{2} \\ \frac{\sqrt{2}}{2} & 0 & - \frac{\sqrt{2}}{2} & 0 \\ 0 & \frac{\sqrt{2}}{2} & 0 & - \frac{\sqrt{2}}{2} \\ \end{bmatrix} [0220002200220002200000022000220022000220022000−220022000−2200000022000−220022000−220] \begin{bmatrix} 0 & \frac{\sqrt{2}}{2} & 0 & 0 & 0 & \frac{\sqrt{2}}{2} & 0 & 0 \\ \frac{\sqrt{2}}{2} & 0 & 0 & 0 & \frac{\sqrt{2}}{2} & 0 & 0 & 0 \\ 0 & 0 & 0 & \frac{\sqrt{2}}{2} & 0 & 0 & 0 & \frac{\sqrt{2}}{2} \\ 0 & 0 & \frac{\sqrt{2}}{2} & 0 & 0 & 0 & \frac{\sqrt{2}}{2} & 0 \\ 0 & \frac{\sqrt{2}}{2} & 0 & 0 & 0 & - \frac{\sqrt{2}}{2} & 0 & 0 \\ \frac{\sqrt{2}}{2} & 0 & 0 & 0 & - \frac{\sqrt{2}}{2} & 0 & 0 & 0 \\ 0 & 0 & 0 & \frac{\sqrt{2}}{2} & 0 & 0 & 0 & - \frac{\sqrt{2}}{2} \\ 0 & 0 & \frac{\sqrt{2}}{2} & 0 & 0 & 0 & - \frac{\sqrt{2}}{2} & 0 \\ \end{bmatrix}

เช่นเดียวกับในกรณีเวกเตอร์ การดำเนินการ ^ ก็เทียบเท่ากัน

display((H ^ Id ^ X).draw("latex"))
[0220002200220002200000022000220022000220022000−220022000−2200000022000−220022000−220] \begin{bmatrix} 0 & \frac{\sqrt{2}}{2} & 0 & 0 & 0 & \frac{\sqrt{2}}{2} & 0 & 0 \\ \frac{\sqrt{2}}{2} & 0 & 0 & 0 & \frac{\sqrt{2}}{2} & 0 & 0 & 0 \\ 0 & 0 & 0 & \frac{\sqrt{2}}{2} & 0 & 0 & 0 & \frac{\sqrt{2}}{2} \\ 0 & 0 & \frac{\sqrt{2}}{2} & 0 & 0 & 0 & \frac{\sqrt{2}}{2} & 0 \\ 0 & \frac{\sqrt{2}}{2} & 0 & 0 & 0 & - \frac{\sqrt{2}}{2} & 0 & 0 \\ \frac{\sqrt{2}}{2} & 0 & 0 & 0 & - \frac{\sqrt{2}}{2} & 0 & 0 & 0 \\ 0 & 0 & 0 & \frac{\sqrt{2}}{2} & 0 & 0 & 0 & - \frac{\sqrt{2}}{2} \\ 0 & 0 & \frac{\sqrt{2}}{2} & 0 & 0 & 0 & - \frac{\sqrt{2}}{2} & 0 \\ \end{bmatrix}

เราสามารถทำให้สถานะรวมวิวัฒน์ไปด้วยการดำเนินการรวมได้ตามที่คาดไว้ — เช่นเดียวกับที่เราเห็นสำหรับระบบเดี่ยวในบทเรียนก่อนหน้า ตัวอย่างเช่น โค้ดต่อไปนี้คำนวณสถานะ (H⊗I)∣ϕ⟩(H\otimes I)\vert\phi\rangle สำหรับ ∣ϕ⟩=∣+⟩⊗∣−i⟩\vert\phi\rangle = \vert + \rangle \otimes \vert {-i}\rangle (ซึ่งนิยามไว้แล้วด้านบน)

display(phi.evolve(H ^ Id).draw("latex"))

22∣00⟩−2i2∣01⟩\frac{\sqrt{2}}{2} |00\rangle- \frac{\sqrt{2} i}{2} |01\rangle

นี่คือโค้ดที่กำหนดการดำเนินการ CXCX และคำนวณ CX∣ψ⟩CX \vert\psi\rangle สำหรับ ∣ψ⟩=∣+⟩⊗∣0⟩\vert\psi\rangle = \vert + \rangle \otimes \vert 0 \rangle เพื่อความชัดเจน นี่คือการดำเนินการ CXCX ที่ Qubit ทางซ้ายเป็น control และ Qubit ทางขวาเป็น target ผลลัพธ์คือ Bell state ∣ϕ+⟩\vert\phi^{+}\rangle

CX = Operator([[1, 0, 0, 0], [0, 1, 0, 0], [0, 0, 0, 1], [0, 0, 1, 0]])
psi = plus.tensor(zero)
display(psi.evolve(CX).draw("latex"))

22∣00⟩+22∣11⟩\frac{\sqrt{2}}{2} |00\rangle+\frac{\sqrt{2}}{2} |11\rangle

การวัดบางส่วน​

ในบทเรียนก่อนหน้า เราใช้เมธอด measure เพื่อจำลองการวัดเวกเตอร์สถานะควอนตัม เมธอดนี้คืนค่าสองรายการ: ผลการวัดที่จำลอง และ Statevector ใหม่จากการวัดนั้น

โดยปกติ measure วัด Qubit ทั้งหมดในเวกเตอร์สถานะ เราสามารถระบุรายการของจำนวนเต็มเป็น argument เพื่อวัดเฉพาะ Qubit ที่มี index นั้น เพื่อแสดงให้เห็น โค้ดด้านล่างสร้างสถานะ

∣w⟩=∣001⟩+∣010⟩+∣100⟩3\vert w\rangle = \frac{\vert 001\rangle + \vert 010\rangle + \vert 100\rangle}{\sqrt{3}}

และวัด Qubit หมายเลข 0 ซึ่งเป็น Qubit ขวาสุด (Qiskit นับ Qubit เริ่มจาก 0 จากขวาไปซ้าย เราจะกลับมาที่ข้อตกลงการนับนี้ในบทเรียนถัดไป)

w = Statevector([0, 1, 1, 0, 1, 0, 0, 0] / sqrt(3))
display(w.draw("latex"))

result, state = w.measure([0])
print(f"Measured: {result}\nState after measurement:")
display(state.draw("latex"))

result, state = w.measure([0, 1])
print(f"Measured: {result}\nState after measurement:")
display(state.draw("latex"))

33∣001⟩+33∣010⟩+33∣100⟩\frac{\sqrt{3}}{3} |001\rangle+\frac{\sqrt{3}}{3} |010\rangle+\frac{\sqrt{3}}{3} |100\rangle

Measured: 0
State after measurement:

22∣010⟩+22∣100⟩\frac{\sqrt{2}}{2} |010\rangle+\frac{\sqrt{2}}{2} |100\rangle

Measured: 00
State after measurement:

∣100⟩ |100\rangle