การใช้งาน 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 นั้นกับอีกตัวที่ส่งเข้ามาเป็นอาร์กิวเมนต์
อาร์กิวเมนต์จะถูกตีความเป็นตัวประกอบเทนเซอร์ทางขวา
ตัวอย่างเช่น ด้านล่างเราสร้างเวกเตอร์สถานะสองอันที่แทน และ และใช้เมธอด tensor เพื่อสร้างเวกเตอร์ใหม่
สังเกตว่าเราใช้เมธอด from_label เพื่อกำหนดสถานะ และ แทนที่จะกำหนดเอง
zero = Statevector.from_label("0")
one = Statevector.from_label("1")
psi = zero.tensor(one)
display(psi.draw("latex"))
label ที่อนุญาตอื่นๆ รวมถึง "+" และ "-" สำหรับสถานะ plus และ minus รวมถึง "r" และ "l" (ย่อมาจาก "right" และ "left") สำหรับสถานะ
ในที่นี้ "+", "-" หรือ "right" และ "left" มาจากบริบทของสปินในกลศาสตร์ควอนตัม ซึ่งองค์ประกอบของสปินอาจชี้ไปทางซ้ายหรือขวาในการทดลอง ไม่ได้หมายถึง Qubit ขวาสุดหรือซ้ายสุดในระบบที่มีหลาย Qubit นี่คือตัวอย่างของผลคูณเทนเซอร์ของ และ
plus = Statevector.from_label("+")
minus_i = Statevector.from_label("l")
phi = plus.tensor(minus_i)
display(phi.draw("latex"))
ทางเลือกหนึ่งคือใช้การดำเนินการ ^ สำหรับ tensor product ซึ่งให้ผลลัพธ์เหมือนกัน
display((plus ^ minus_i).draw("latex"))
คลาส 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"))
เช่นเดียวกับในกรณีเวกเตอร์ การดำเนินการ ^ ก็เทียบเท่ากัน
display((H ^ Id ^ X).draw("latex"))
เราสามารถทำให้สถานะรวมวิวัฒน์ไปด้วยการดำเนินการรวมได้ตามที่คาดไว้ — เช่นเดียวกับที่เราเห็นสำหรับระบบเดี่ยวในบทเรียนก่อนหน้า ตัวอย่างเช่น โค้ดต่อไปนี้คำนวณสถานะ สำหรับ (ซึ่งนิยามไว้แล้วด้านบน)
display(phi.evolve(H ^ Id).draw("latex"))
นี่คือโค้ดที่กำหนดการดำเนินการ และคำนวณ สำหรับ เพื่อความชัดเจน นี่คือการดำเนินการ ที่ 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"))
การวัดบางส่วน
ในบทเรียนก่อนหน้า เราใช้เมธอด measure เพื่อจำลองการวัดเวกเตอร์สถานะควอนตัม
เมธอดนี้คืนค่าสองรายการ: ผลการวัดที่จำลอง และ Statevector ใหม่จากการวัดนั้น
โดยปกติ measure วัด Qubit ทั้งหมดในเวกเตอร์สถานะ
เราสามารถระบุรายการของจำนวนเต็มเป็น argument เพื่อวัดเฉพาะ Qubit ที่มี index นั้น
เพื่อแสดงให้เห็น โค้ดด้านล่างสร้างสถานะ
และวัด 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"))
Measured: 0
State after measurement:
Measured: 00
State after measurement: