ในบทเรียนก่อนหน้า เราได้ดูคลาส Statevector และ Operator ใน Qiskit เป็นครั้งแรก และใช้พวกมันจำลองการดำเนินการและการวัดบน Qubit เดี่ยว
ในส่วนนี้ เราจะใช้คลาสเหล่านี้เพื่อสำรวจพฤติกรรมของหลาย Qubit
!pip install -q numpy qiskit
from qiskit import __version__
print(__version__)
เราจะเริ่มด้วยการนำเข้าคลาส Statevector และ Operator รวมถึงฟังก์ชัน square root จาก NumPy
ต่อจากนี้ โดยทั่วไปเราจะจัดการนำเข้าทั้งหมดที่จำเป็นก่อนในแต่ละบทเรียน
from qiskit.quantum_info import Statevector, Operator
from numpy import sqrt
Tensor products
คลาส Statevector มีเมธอด tensor ซึ่งคืนค่า tensor product ของ Statevector นั้นกับอีกอันหนึ่งที่ระบุเป็น argument
argument ถูกตีความเป็น tensor factor ทางขวา
ตัวอย่างเช่น ด้านล่างเราสร้างเวกเตอร์สถานะสองอันที่แทน ∣0⟩ และ ∣1⟩, และใช้เมธอด tensor เพื่อสร้างเวกเตอร์ใหม่ ∣ψ⟩=∣0⟩⊗∣1⟩
สังเกตว่าเราใช้เมธอด from_label เพื่อกำหนดสถานะ ∣0⟩ และ ∣1⟩ แทนที่จะกำหนดเอง
zero = Statevector.from_label("0")
one = Statevector.from_label("1")
psi = zero.tensor(one)
display(psi.draw("latex"))
∣01⟩
label ที่อนุญาตอื่นๆ รวมถึง "+" และ "-" สำหรับสถานะ plus และ minus รวมถึง "r" และ "l" (ย่อมาจาก "right" และ "left") สำหรับสถานะ
∣+i⟩=21∣0⟩+2i∣1⟩and∣−i⟩=21∣0⟩−2i∣1⟩.
ที่นี่ "+", "-" หรือ "right" และ "left" มาจากบริบทของสปินเชิงกลควอนตัม ซึ่งองค์ประกอบของสปินอาจชี้ไปทางซ้ายหรือขวาในการทดลอง ไม่ได้หมายถึง Qubit ขวาสุดหรือซ้ายสุดในระบบที่มีหลาย Qubit นี่คือตัวอย่างของ tensor product ของ ∣+⟩ และ ∣−i⟩
plus = Statevector.from_label("+")
minus_i = Statevector.from_label("l")
phi = plus.tensor(minus_i)
display(phi.draw("latex"))
21∣00⟩−2i∣01⟩+21∣10⟩−2i∣11⟩
ทางเลือกหนึ่งคือใช้การดำเนินการ ^ สำหรับ tensor product ซึ่งให้ผลลัพธ์เหมือนกัน
display((plus ^ minus_i).draw("latex"))
21∣00⟩−2i∣01⟩+21∣10⟩−2i∣11⟩
คลาส 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
0220002200220002200000022000220022000220022000−220022000−2200000022000−220022000−220
เช่นเดียวกับในกรณีเวกเตอร์ การดำเนินการ ^ ก็เทียบเท่ากัน
display((H ^ Id ^ X).draw("latex"))
0220002200220002200000022000220022000220022000−220022000−2200000022000−220022000−220
สถานะรวมสามารถ evolve โดยใช้การดำเนินการรวมตามที่คาดหวัง — เช่นเดียวกับที่เราเห็นสำหรับระบบเดี่ยวในบทเรียนก่อนหน้า
ตัวอย่างเช่น โค้ดต่อไปนี้คำนวณสถานะ (H⊗I)∣ϕ⟩ สำหรับ ∣ϕ⟩=∣+⟩⊗∣−i⟩ (ซึ่งนิยามไว้แล้วด้านบน)
display(phi.evolve(H ^ Id).draw("latex"))
22∣00⟩−22i∣01⟩
นี่คือโค้ดที่กำหนดการดำเนินการ CX และคำนวณ CX∣ψ⟩ สำหรับ ∣ψ⟩=∣+⟩⊗∣0⟩ เพื่อความชัดเจน นี่คือการดำเนินการ CX ที่ Qubit ทางซ้ายเป็น control และ Qubit ทางขวาเป็น target ผลลัพธ์คือ Bell state ∣ϕ+⟩
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⟩
การวัดบางส่วน
ในบทเรียนก่อนหน้า เราใช้เมธอด measure เพื่อจำลองการวัดเวกเตอร์สถานะควอนตัม
เมธอดนี้คืนค่าสองรายการ: ผลการวัดที่จำลอง และ Statevector ใหม่จากการวัดนั้น
โดยปกติ measure วัด Qubit ทั้งหมดในเวกเตอร์สถานะ
เราสามารถระบุรายการของจำนวนเต็มเป็น argument เพื่อวัดเฉพาะ Qubit ที่มี index นั้น
เพื่อแสดงให้เห็น โค้ดด้านล่างสร้างสถานะ
∣w⟩=3∣001⟩+∣010⟩+∣100⟩
และวัด 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⟩
Measured: 0
State after measurement:
22∣010⟩+22∣100⟩
Measured: 00
State after measurement:
∣100⟩