วิธีตั้งโปรแกรมคอมพิวเตอร์ควอนตัม

วิธีตั้งโปรแกรมคอมพิวเตอร์ควอนตัม

เครดิตฟรี

คอมพิวเตอร์ควอนตัมเป็นคอมพิวเตอร์ชนิดใหม่ที่แปลกประหลาด พวกมันเผาผลาญจักรวาลคู่ขนานจำนวนที่คิดไม่ถึงเพื่อเรียกใช้โปรแกรมได้เร็วขึ้น และใช้หลักการที่ทำให้แม้แต่ไอน์สไตน์สับสน พวกเขาเป็นกล่องมหัศจรรย์ที่จะทิ้งกล่องทรานซิสเตอร์โง่ ๆ ของคุณไว้ในฝุ่น

สล็อต

นั่นคือสิ่งที่บทความวิทยาศาสตร์ยอดนิยมอาจจะบอกคุณอยู่ดี พวกเขาประสบความสำเร็จอย่างไม่ต้องสงสัยในการทำให้เทคโนโลยีใหม่นี้ฟังดูน่าตื่นเต้น แต่พวกเขายังสามารถทำให้การคำนวณควอนตัมดูเหมือนเป็นศิลปะที่ลึกลับซึ่งมอบให้กับนักวิทยาศาสตร์ที่ฉลาดที่สุดเท่านั้น แน่นอนว่าไม่ใช่สิ่งที่สำหรับคนทั่วไปในการเขียนโปรแกรมต้องกังวล!
ฉันไม่คิดว่านี่เป็นความจริงเลย และด้วยบริษัทอย่าง IBM และ Google ที่ผลิตอุปกรณ์ควอนตัม ถึงเวลาเริ่มเล่นการเขียนโปรแกรมควอนตัมแล้ว
คุณไม่จำเป็นต้องทำอะไรแฟนซีในตอนเริ่มต้น คุณสามารถเริ่มต้นการเดินทางสู่การเขียนโปรแกรมควอนตัมได้จากที่เดียวกับพวกเราหลายคนเริ่มต้นการเดินทางสู่การเขียนโปรแกรมปกติ: โดยการสร้างเกม
ไม่ต้องกังวล คุณไม่จำเป็นต้องมีคอมพิวเตอร์ควอนตัมเป็นของตัวเอง โปรแกรมควอนตัมอย่างง่ายสามารถจำลองบนคอมพิวเตอร์ปกติได้อย่างง่ายดาย นอกจากนี้เรายังสามารถยืมเวลาบางส่วนในอุปกรณ์ควอนตัมจริงต้องขอบคุณประสบการณ์ IBM Q
นี่เป็นบทความแรกในชุดบทความที่ฉันอธิบายบางโปรแกรมง่ายๆ ที่สร้างโดยใช้ quantum SDK ของ IBM แต่ละลำจะเป็นเรือประจัญบานเวอร์ชันที่มีในตัวเอง โดยมีกระบวนการควอนตัมง่ายๆ ที่ใช้ในการปรับใช้กลไกเกมพื้นฐาน
เหล่านี้เป็นหนึ่งในเกมแรกที่สร้างขึ้นสำหรับคอมพิวเตอร์ควอนตัม ฉันจะแสดงรายละเอียดอันน่าสะพรึงกลัวของโค้ดเบื้องหลังเกม หวังว่าคุณจะสามารถเริ่มทดลองกับการเขียนโปรแกรมควอนตัมได้เช่นกัน
คอมพิวเตอร์ควอนตัมคืออะไร?
ก่อนที่เราจะเริ่มต้นโปรแกรม เราต้องการข้อมูลพื้นฐานบางอย่าง ฉันจะไม่บอกคุณทุกอย่างเกี่ยวกับการคำนวณควอนตัม เราพอจะเข้าใจแล้วว่าเกิดอะไรขึ้นในเกมของเรา
คอมพิวเตอร์ปกติใช้บิต: ตัวแปรที่มีค่าที่เป็นไปได้เพียงสองค่า เรามักจะเรียกพวกเขา0และ1แม้ว่าในบริบทของพีชคณิตแบบบูลที่เราอาจจะเรียกพวกเขาและTrue Falseไม่สำคัญว่าเราเรียกว่าอะไร จุดสำคัญคือมีเพียงสองสถานะ
ด้วยบิตเราสามารถดำเนินการบูลีนอย่างง่าย ๆ เช่น NOT AND และ OR เหล่านี้เป็นองค์ประกอบพื้นฐานของการคำนวณ ด้วยสิ่งเหล่านี้เราสามารถทำได้ทุกอย่าง ตัวแปรใด ๆ ที่ซับซ้อนกว่าบิต (เช่น int หรือ float) เป็นเพียงการรวบรวมหลายบิต การดำเนินการใด ๆ ที่ซับซ้อนกว่า AND หรือ NOT นั้นแท้จริงแล้วเป็นเพียงการดำเนินการหลายอย่างที่ติดกัน ในระดับพื้นฐานที่สุด นี่คือสิ่งที่คอมพิวเตอร์ทั่วไปเป็น
คอมพิวเตอร์ควอนตัมใช้ควอนตัมบิตหรือคิวบิต ค่าเหล่านี้ยังมีค่าที่เป็นไปได้สองค่าซึ่งเราสามารถเรียกได้0และ1. แต่กฎของกลศาสตร์ควอนตัมยังให้ความเป็นไปได้อื่นๆ อีกด้วย ซึ่งเราเรียกว่าสถานะการทับซ้อน
ในความรู้สึกบางรัฐซ้อนเป็นค่าที่มีอยู่วิธีส่วนระหว่างขั้วของและ0 1เราสามารถนึกภาพควิบิตเป็นทรงกลมโดยมี0และ1นั่งบนเสาตรงข้าม สถานะการซ้อนทับคือจุดที่เป็นไปได้อื่นๆ บนพื้นผิว
เช่นเดียวกับ 0 และ 1 รูปภาพนี้ยังระบุสถานะการซ้อนที่สำคัญสองสามสถานะ หนึ่งเรียกว่าu3(0.5*pi,0,0) |0⟩. เป็นที่ยอมรับว่าไม่ใช่ชื่อที่ติดหูนัก แต่เราจะมาดูความหมายที่แท้จริงในบทความนี้
วิธีคิดเกี่ยวกับ qubits นี้ทำให้ดูเหมือนเป็นตัวแปรต่อเนื่อง เราสามารถแสดงจุดใดๆ บนพื้นผิวของทรงกลม (เช่น จุด ψ ในภาพ) โดยใช้พิกัดเชิงขั้วที่มีมุมเพียงสองสามมุม (θ และ φ) ดังนั้น คุณจะได้รับการอภัยเพราะคิดว่าควิบิตเป็นเพียงทุ่นคู่หนึ่ง ในแง่หนึ่งก็คือ แต่ในอีกความหมายหนึ่งที่แม่นยำกว่านั้นไม่ใช่
ความแตกต่างที่สำคัญคือเราไม่สามารถดึงข้อมูลไบนารีออกจาก qubit ได้มากไปกว่าข้อมูลไบนารี กฎฟิสิกส์ป้องกันเราจากการค้นหาว่าพวกเขากำลังทำอะไรอยู่ เราไม่สามารถถาม qubit สำหรับรายละเอียดที่แน่นอนของสถานะการซ้อนทับได้ เราสามารถบังคับให้เลือกระหว่างจุดตรงข้ามสองจุดบนทรงกลมเท่านั้น ( ไลค์0และ1) หากเป็นอย่างอื่นนอกเหนือจากสองสถานะนี้ ก็จะต้องสุ่มเลือกอย่างใดอย่างหนึ่ง
ดังนั้น qubit จึงมีคุณสมบัติบางอย่างของตัวแปรต่อเนื่อง และคุณสมบัติบางอย่างของตัวแปรที่ไม่ต่อเนื่อง ในความเป็นจริงมันเป็นทั้ง เป็นตัวแปรควอนตัม
เราจะทำอย่างไรกับ qubits?
เกมเรือประจัญบานที่เราสร้างในวันนี้นั้นอิงจากตัวแปรของญี่ปุ่น ในเรื่องนี้ เรือทุกลำใช้พื้นที่เพียงช่องเดียว แต่บางลำรับการโจมตีมากกว่าที่จะจมมากกว่าลำอื่น เราจะมีเรือรบหนึ่งลำที่สามารถจมได้ด้วยระเบิดลูกเดียว เรือลำหนึ่งต้องการสองและอีกลำหนึ่งต้องการสาม
เพื่อจำลองสิ่งนี้บนคอมพิวเตอร์ควอนตัม เราสามารถใช้ qubit สำหรับเรือแต่ละลำ 0สามารถระบุสถานะได้ด้วยเรือรบที่ไม่บุบสลายอย่างสมบูรณ์ และ1ด้วยเรือลำที่ถูกทำลาย สถานะการทับซ้อนจะสอดคล้องกับการเดินทางของเรือไปสู่ความพินาศ
เรือรบที่ถูกทำลายโดยการโจมตีครั้งเดียวจะค่อนข้างง่ายในการจำลอง เราสามารถเริ่มต้นได้ใน state 0จากนั้นใช้ NOT เมื่อถูกโจมตี เมื่อเราพบมันในสภาพ1เราจะรู้ว่ามันถูกทำลายไปแล้ว
มาดูวิธีการใช้กระบวนการง่ายๆ นี้กับคอมพิวเตอร์ควอนตัมกัน เราจะไม่กังวลเกี่ยวกับเรือรบลำอื่น ๆ หรืออินพุตและเอาต์พุตในขณะนี้
ในการดำเนินการนี้ เราจะใช้ QISKit quantum SDK เพื่อตั้งค่าโปรแกรมควอนตัม นี่คือสคริปต์ที่เริ่มต้นเรือรบ วางระเบิด แล้วดูว่าเรือยังลอยอยู่หรือไม่
ขั้นแรก นี่คือการกำหนดบิตทั้งหมดที่เราต้องการ ทั้งควอนตัมและปกติ qในตัวอย่างนี้เราได้กำหนดคิวบิตเดียวในการลงทะเบียนที่เรียกว่า เราอ้างถึง qubit นี้ในรหัสว่าq[0]. cตั้งแต่เอาท์พุทจะต้องอยู่ในความสุขข้อมูลปกติมนุษย์สามารถอ่านเรายังกำหนดบิตปกติในการลงทะเบียนเพียงครั้งเดียวที่เรียกว่า
qubit จะเริ่มต้นโดยอัตโนมัติในรัฐq[0] 0เนื่องจากเป็นสถานะที่เราต้องการเริ่มต้น ไม่จำเป็นต้องมีการเตรียมการเพิ่มเติม

สล็อตออนไลน์

ต่อไป เราต้องการใช้q[0] = 0เรือลำนี้ซึ่งเป็นเรือที่ไม่บุบสลายอย่างสมบูรณ์ และดำเนินการไม่ ด้วยบิตปกติและภาษาการเขียนโปรแกรมปกติ เราอาจใช้สิ่งนี้เป็นq[0] = !q[0](สำหรับ C++) หรือq[0] = not q[0](สำหรับ Python) ใน QISKit สามารถทำได้หลายวิธี ง่ายที่สุดคือการใช้การดำเนินการที่เรียกว่าxและy. ต่อไปนี้คือตัวอย่างวิธีใช้งาน โดยมีบรรทัด C++ และ Python ที่เทียบเท่ากันเพื่อเปรียบเทียบ
q[0] = !q[0]; \ A สไตล์ C++ ไม่ใช่
q[0] = ไม่ใช่ q[0] # สไตล์ Python ไม่ใช่
qc.x( q[0] ) # สไตล์ QISKit ไม่ใช่
qc.y( q[0] ) # อีกรูปแบบหนึ่งของ QISKit ไม่ใช่
มีความแตกต่างบางอย่างระหว่างxและyเราจะต้องจัดการกับวันหนึ่ง แต่ไม่ใช่วันนี้.
คุณอาจจะได้สังเกตเห็นว่าค่าxมิได้yปรากฏในก่อนหน้านี้ QISKit ข้อมูลโค้ด เรามี u3(pi,0,0) แทน นี่เป็นอีกวิธีหนึ่งในการนำ NOT
qc.u3(math.pi,0,0, q[0]) # ยังอีกรูปแบบหนึ่งของ QISKit ไม่
การดำเนินการนี้เทียบเท่ากับy. แต่u3เป็นการดำเนินการที่ซับซ้อนโดยทั่วไป มีข้อโต้แย้งสามข้อ และโดยการเปลี่ยนแปลง เราสามารถทำสิ่งอื่นได้
โปรดทราบว่าเมื่อใช้งานการดำเนินการนี้ใน QISKit จะได้รับอาร์กิวเมนต์ที่สี่ ซึ่งเป็น qubit ที่เรากำลังนำไปใช้กับ

jumboslot

อาร์กิวเมนต์แรกคือมุมที่แสดงเป็นเรเดียน มันคือมุมที่เราจะหมุนทรงกลมของควิบิตไปรอบๆ pi มุม (หรือmath.piเมื่อใช้งานใน Python) สอดคล้องกับ 180 ° ซึ่งหมายความว่าเราพลิกทรงกลมทั้งหมดกลับหัวกลับหาง 0ย้ายไป1และ1ย้ายไป0ที่ ซึ่งเป็นสาเหตุที่การดำเนินการนี้ทำหน้าที่เป็นไม่ ในการทำครึ่ง NOT เราสามารถใช้ครึ่งมุมนี้ได้: u3(0.5*pi,0,0).
ตอนนี้เรายังมีอีกวิธีในการทำ NOT บน qubit ของเรา: เราสามารถทำได้ครึ่ง NOT สองครั้ง

สไตล์ QISKit อื่นไม่ใช่

qc.u3(math.pi/2,0,0, q[0])
qc.u3(math.pi/2,0,0, q[0])
นอกจากนี้เรายังสามารถทำหนึ่งในสามของไม่สามหรือหนึ่งในสี่ของการไม่ตามด้วยครึ่งไม่แล้วสองในแปดของการไม่ คุณได้รับความคิด
บรรทัดสุดท้ายของข้อมูลโค้ด QISKit ของเราคือ
qc.measure( q[0], c[0] )
ในนี้เราวัด qubit เราบอกได้เลยq[0]ว่าต้องตัดสินใจว่าจะเป็น: 0หรือ1. ผลลัพธ์จะถูกเก็บไว้ในc[0]พร้อมที่จะดูโดยสมองที่ไม่ใช่ควอนตัมของเรา หรือประมวลผลโดยคอมพิวเตอร์ที่ไม่ใช่ควอนตัมของเรา ค่าของc[0]คือผลลัพธ์ของการคำนวณนี้
ถ้าเราไม่ได้ทำอะไรเลยระหว่างการเริ่มต้นและการวัด…
q = QuantumRegister(1)
c = ClassicalRegister(1)
qc = QuantumCircuit(q, c)
qc.measure( q[0], c[0] )
… c[0] = 0ผลที่ควรจะเป็นเสมอ
ถ้าเราไม่ทำ…
q = QuantumRegister(1)
c = ClassicalRegister(1)
qc = QuantumCircuit(q, c)
qc.u3(math.pi,0,0, q[0])
qc.measure( q[0], c[0] )
..ผลที่ได้ควรจะเป็นc[0]=1..

slot

ลักษณะความน่าจะเป็นนี้จะทำให้เกิดการคำนวณควอนตัมเล็กน้อย มีการสุ่มเพิ่มเติมในอุปกรณ์ปัจจุบันเนื่องจากเสียงรบกวน แม้ว่าสิ่งนี้จะอยู่ในระดับต่ำตามปกติ แต่เราก็ยังต้องคำนึงถึงการมีอยู่ของมัน ดังนั้นบางครั้งเราจะได้รับ a 1เมื่อเราควรได้รับ a 0และในทางกลับกัน