คอมโพเนนต์หลักของโปรแกรม Q# คืออะไร
ก่อนที่คุณจะเขียนโปรแกรมควอนตัมของคุณเอง สิ่งสําคัญคือต้องเข้าใจโครงสร้างและส่วนประกอบของภาษาโปรแกรม Q#
ในหน่วยนี้ คุณจะได้เรียนรู้เกี่ยวกับส่วนประกอบพื้นฐานของโปรแกรม Q#
การดําเนินการ Main
ทุกโปรแกรม Q# ต้องมีการดําเนินการอย่างน้อยหนึ่งรายการ คอมไพเลอร์ Q# เริ่มเรียกใช้โปรแกรมจากการดําเนินการจุดเริ่มต้น ซึ่งเป็น Main การดําเนินการตามค่าเริ่มต้น ตัวอย่างเช่น โปรแกรม Q# ต่อไปนี้มีการดําเนินการที่เรียกว่า Main สร้างคิวบิตและส่งคืนการวัดสถานะของคิวบิต:
// This operation is the entry point to your program because it's name is Main
operation Main() : Result {
use q = Qubit();
return M(q);
}
โค้ด Q# ของคุณไม่สามารถทํางานได้หากไม่มีการดําเนินการจุดเริ่มต้น หากคุณต้องการใช้การดําเนินการอื่นนอกเหนือจาก Main เป็นจุดเริ่มต้น ให้ใช้แอตทริบิว @EntryPoint() ต์ ตัวอย่างเช่น โค้ดต่อไปนี้ให้ชื่อ MeasureOneQubitที่สื่อความหมายมากขึ้นแก่การดําเนินการก่อนหน้านี้ และกําหนดการดําเนินการนั้นเป็นจุดเริ่มต้นของโปรแกรม Q# ของคุณ:
// The @EntryPoint() attribute tells the compiler to start running your code from this operation
@EntryPoint()
operation MeasureOneQubit() : Result {
use q = Qubit();
return M(q);
}
ชนิด
Q# มีชนิดข้อมูลที่มีอยู่แล้วภายในจํานวนมากที่คุณอาจคุ้นเคยอยู่แล้ว เช่น Int, Double, และ BoolString Q# ยังมีประเภทที่เฉพาะเจาะจงสําหรับการประมวลผลควอนตัม เช่น Qubit และResult
ตัวอย่างเช่น การดําเนินการส่งMeasureOneQubitResultกลับค่าชนิด
Resultประเภทแสดงสถานะของคิวบิตเมื่อวัดคิวบิต และสามารถมีค่าอย่างใดอย่างZeroOneหนึ่ง หรือ
ไลบรารีควอนตัม
Q# มาพร้อมกับไลบรารีหลายตัวที่มีฟังก์ชันและการดําเนินการเพื่อช่วยคุณเขียนโปรแกรมควอนตัม เมื่อต้องการเรียกใช้ฟังก์ชันหรือการดําเนินการจากไลบรารี ให้ใช้คําสําคัญและ import ระบุเนมสเปซของไลบรารี ตัวอย่างเช่น เมื่อต้องการใช้ Message ฟังก์ชันจาก Std.Intrinsic เนมสเปซในไลบรารีควอนตัมมาตรฐาน ให้ใช้รหัสต่อไปนี้:
// import all functions and operations from Std.Intrinsic
import Std.Intrinsic.*;
operation Main() : Unit {
// call the Message function from Std.Intrinsic
Message("Hello quantum world!");
}
เครื่องหมายดอกจันหมายความว่าคุณนําเข้าฟังก์ชันทั้งหมดจาก Std.Intrinsic เนมสเปซ หรือคุณสามารถนําเข้าเฉพาะ Message ฟังก์ชัน:
// import only the Message function from Std.Intrinsic
import Std.Intrinsic.Message;
operation Main() : Unit {
// call the Message function from Std.Intrinsic
Message("Hello quantum world!");
}
Note
ใน Q# ชนิดหมายความว่า Unit ฟังก์ชันหรือการดําเนินการไม่ส่งกลับค่า สําหรับข้อมูลเพิ่มเติมเกี่ยวกับชนิดใน Q# โปรดดู ระบบชนิด
หากต้องการสํารวจไลบรารีมาตรฐาน Q# โปรดดูข้อมูลอ้างอิง API
การจัดสรรคิวบิต
ในการจัดสรรคิวบิตใน Q# ให้ใช้ use คําหลักและ Qubit ประเภท คิวบิตที่คุณจัดสรรด้วยคีย์เวิร์ดจะ use เริ่มต้นในสถานะ $\ket{0}$ เสมอ
คุณสามารถจัดสรรคิวบิตเดียวหรือหลายคิวบิตในอาร์เรย์คิวบิต นี่คือตัวอย่างที่จัดสรรคิวบิตเดียวในตัวแปร q1 และอาร์เรย์ของห้าคิวบิตใน q5:
use q1 = Qubit(); // Allocate one qubit
use q5 = Qubit[5]; // Allocate five qubits
การวัดคิวบิต
ใน Q# การดําเนินการ Measure ดําเนินการวัดแบบร่วมของหนึ่งโคบิทหรือมากกว่าในฐาน Pauli ที่ระบุ ซึ่งสามารถ PauliXPauliYหรือ PauliZได้
Measureการดําเนินการส่งResultกลับชนิดที่มีค่าเป็น Zero หรือOne
เมื่อต้องการทําการวัดในพื้นฐานการคํานวณ $\lbrace\ket{0},\ket{1}\rbrace$ คุณยังสามารถใช้การดําเนินการนี้ M ได้อีกด้วย
Mการดําเนินการเทียบเท่ากับMeasureการดําเนินการใน Pauli-Z ดังนั้นจึงM([qubit])ทํางานเหมือนกับMeasure([PauliZ], [qubit])ทุกประการ อย่างไรก็ตาม การดําเนินการยอมรับ M เฉพาะคิวบิตเดียวเป็นอินพุต ไม่ใช่อาร์เรย์คิวบิต
รีเซ็ตคิวบิต
ใน Q# คิวบิตต้องอยู่ในสถานะ $\ket{0}$ จึงจะปล่อยได้ เมื่อคุณใช้คิวบิตเสร็จแล้ว ให้เรียกใช้ Reset การดําเนินการเพื่อรีเซ็ตคิวบิตเป็นสถานะ $\ket{0}$ ตัวอย่างเช่น โค้ดต่อไปนี้จัดสรรคิวบิต วัดสถานะของคิวบิต แล้วรีเซ็ตคิวบิต:
operation Main() : Result {
use q = Qubit();
let result = M(q);
// Reset the qubit so that you can release it
Reset(q);
return result;
}