มาลองเล่น “ควอนตัมคอมพิวเตอร์”

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

ผมขอเชิญชวนมาลองเล่น “ควอนตัมคอมพิวเตอร์จำลอง” ซึ่งตอนนี้ผมได้ลองเล่นของสองเจ้าคือ ของ IBM และของ Google ซึ่งก็เชิญคุณๆ เข้าไปศึกษากันดูได้เลยที่

  • IBM Quantum Experience เป็นเว็บให้ทดลองสร้างวงจรควอนตัมบนคอมพิวเตอร์จำลองหรือ simulator และยังสามารถส่งไปรันบน “ควอนตัมคอมพิวเตอร์ของจริง” ขนาด 5 คิวบิตของ IBM ได้ด้วย เว็บนี้ UI สวย ใช้งานง่าย ในเว็บนี้ยังเขียน tutorial ช่วยให้เข้าใจหลักการของควอนตัมคอมพิวเตอร์ได้ดีมาก และตัว simulator ก็สามารถแสดงผลการคำนวณเป็น Bloch sphere ช่วยให้ได้ feel ของความน่าจะเป็นเชิงซ้อนได้อย่างดี ข้อเสียของเว็บนี้คือเราสามารถสร้างวงจรควอนตัมได้แบบง่ายๆ เท่านั้น ไม่สามารถเขียนโปรแกรมเป็น control flow ได้
  • Quantum Computing Playground จาก Google เป็นเว็บให้ทดลองเขียนโปรแกรมควอนตัมและนำไปรันบน simulator ซึ่งรับได้ 22 คิวบิต มีตัวอย่าง Quantum Algorithm ให้ศึกษา ตัว simulator รองรับการเขียนโปรแกรมในภาษาระดับสูง มี control flow มีแม้กระทั่ง debugger จึงสามารถลองสร้าง algorithm จริงจังบนเว็บนี้ได้ ข้อเสีย(สำหรับผมนะ)คือกราฟ distribution มันเยอะไปดูค่อนข้างยาก อ้อ และต้องรันเว็บนี้บน Chrome เท่านั้นด้วย

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

ควอนตัมคอมพิวเตอร์คืออะไรแน่
สำหรับคนที่ใหม่จริงๆ ถ้าลอง search หาคำว่า “ควอนตัม” จะเจอกับบริบทที่มากมายจนพาสับสนไปหมด ผมขอสรุปให้ฟังดังนี้

  • ถ้าพูดถึง Quantum เฉยๆ จะหมายถึงเรื่องการแผ่รังสีของวัตถุดำซึ่งมาเป็นเม็ดอนุภาค มีค่าพลังงานเท่ากับค่าคงที่ของพลังค์คูณความถี่
  • ถ้าพูดถึง Quantum Mechanics จะพูดเรื่องหลักความไม่แน่นอนของไฮเซนเบิร์ก ว่ามันไม่แน่นอนที่จะวัดตำแหน่งและโมเมนตัมของอนุภาคในคราวเดียวกัน ถ้าอันหนึ่งแม่นอีกอันหนึ่งจะไม่แม่น (คนละเรื่องกับความไม่แน่นอนเพราะสังขารไม่เที่ยง หรือความไม่แน่นอนของอนาคต) และเลยไปถึงเรื่องสมบัติการเป็นทั้งคลื่นและอนุภาค, สถานะ Superposition, การยุบสถานะเมื่อทำการวัดค่า, ฟังค์ชันคลื่นของชโรดิงเงอร์
  • ส่วน Quantum Theory หรือ Quantum Computing อันนี้จะเป็นการนำเอาคณิตศาสตร์จาก Quantum Mechanics มาต่อยอด สร้างเป็นโลกการคำนวณอีกชนิดหนึ่ง อารมณ์เดียวกับโลกการคำนวณของลาปลาซหรือฟูเรียร์ เป็นเรื่องของคณิตศาสตร์ล้วนๆ ซึ่งที่จริงเอาไปใช้กับอะไรก็ได้ ไม่จำเป็นต้องเป็นเรื่องทางฟิสิกส์ แต่ด้วยคณิตศาสตร์นี่เองก็ทำให้เราสามารถย้อนกลับไปทำนายพฤติกรรมของอนุภาคทางฟิสิกส์ได้เหมือนกัน เช่นเรื่อง Entanglement, Teleportation(หมายถึงการส่งข่าวสารระยะไกล ไม่ใช่เคลื่อนย้ายมวลสาร)

Quantum Computer คือแนวคิดที่จะเอาคณิตศาสตร์ที่ได้จากทฤษฎี Quantum Computing มาสร้างเป็นเครื่องคำนวณจริงๆ ซึ่งผมเชื่อว่าในอนาคต โปรแกรมเมอร์อาจจะรู้แค่หลักการคำนวณควอนตัมคอมพิวติ้ง คิดควอนตัมอัลกอริทึมเป็นก็พอแล้ว ไม่ต้องไปปวดหัวกับปริศนาของกลศาสตร์ควอนตัมหลายอย่างเช่น หลักความไม่แน่นอน, Paradox ของ Teleport เหมือนกับโปรแกรมเมอร์ทุกวันนี้คงไม่รู้หรอกว่าต้องมีการโด๊ปสารกึ่งตัวนำเพื่อนำมาสร้างทรานซิสเตอร์อย่างไร

อัพเดตแถมให้อีกคำนึงคือ Quantum Cryptography ซึ่งฟังดูเผินๆ อาจนึกว่าเป็นควอนตัมอัลกอริทึมประเภทหนึ่ง จริงๆ แล้วไม่ใช่อัลกอริทึม แต่เป็นเทคนิคในการส่งข้อมูล โดยนำคุณสมบัติของกลศาสตร์ควอนตัมเช่น superposition, คุณสมบัติห้ามสำเนา (no-cloning) มาใช้เพื่อเพิ่มความปลอดภัยในการสื่อสารให้มากขึ้น อธิบายภาษาไอทีคืออันนี้เป็นเรื่องของ Data Link Layer มากกว่า Presentation Layer

ควอนตัมคอมพิวเตอร์ต่างจากคอมพิวเตอร์ปกติอย่างไร
ตอนนี้ยังบอกแน่ไม่ได้ว่าอนาคตจะเป็นอย่างไร แต่จากความเป็นไปได้ ณ ขณะนี้ ผมคิดว่าควอนตัมคอมพิวเตอร์ มันก็จะทำงานเหมือนคอมพิวเตอร์อย่างทุกวันนี้นั่นแหละ คือเป็นโมเดลคอมพิวเตอร์แบบ Von Neumann มี I/O, มีหน่วยความจำ, มีหน่วยคำนวณ และประมวลผลทีละคำสั่ง
แต่หน่วยคำนวณนอกจากจะคำนวณตรรกะหรือเลขคณิตได้แล้ว ยังคำนวณคณิตศาสตร์แบบควอนตัมได้ด้วย, หน่วยความจำและรีจิสเตอร์ก็ต้องมีส่วนที่เก็บเป็นคิวบิตนอกเหนือจากบิตธรรมดาได้ด้วย, และสุดท้ายต้องรับ I/O เป็นคิวบิตนอกเหนือจากบิตธรรมดาได้

qpuควอนตัมคอมพิวเตอร์น่าจะเหมือนคอมพิวเตอร์ในยุคปัจจุบันแต่เพิ่มหน่วยประมวลผลคณิตศาสตร์ควอนตัมเข้ามา
Memory, I/O ต้องใช้สิ่งที่เกิด Superposition ได้ (เช่น สปิน, ระดับพลังงาน หรือ โพลาไรซ์) ไม่ใช่แค่ระดับแรงดัน Hi-Lo

แนวคิดเป็นอย่างนี้ แต่ส่วนประกอบเกี่ยวกับควอนตัมอาจจะเอามารวมกับคอมพิวเตอร์ธรรมดาได้ไม่ง่ายนัก เราจะเจออุปสรรคตั้งแต่การทำสถานะ superposition ซึ่งมันอ่อนไหวมาก จนต้องเอาคิวบิตไปแช่ตู้เย็นเพื่อให้สัญญาณรบกวนน้อยที่สุด การ transform quantum state ก็เป็นเรื่องยาก ในคอมพิวเตอร์ธรรมดาการสลับบิต 0-1 เป็นธรรมดา แต่การปรับสถานะควอนตัมเป็นเรื่องที่ต้องยุ่งกับ entanglement ของคิวบิตทั้งระบบ เรายังต้องผจญกับปัญหาการสูญเสียอาพันธ์ (decoherence) คือคิวบิตทำงานเป็นจังหวะได้อยู่พักเดียว ก็งอแงไม่อยู่ในระเบียบ แล้วยังมีปัญหา no-cloning ทำให้การตรวจจับและแก้ไขข้อผิดพลาด (error correction) ในคิวบิตวุ่นวายกว่าคอมพิวเตอร์ธรรมดา
อย่างไรก็ตามส่วนประกอบของควอนตัมคอมพิวเตอร์หลายอย่างก็สามารถทำในห้องทดลองได้แล้ว เพียงแต่มันยังไม่เสถียร และยังไม่สามารถยัดเข้ามาใส่กล่องชิ้นเล็กๆ เพื่อขายได้ ในปัจจุบันควอนตัมคอมพิวเตอร์ของ IBM มีส่วนประกอบแค่หน่วยคำนวณกับรีจิสเตอร์ขนาด 5 คิวบิต ส่วนควอนตัมคอมพิวเตอร์ของ D-Wave เท่าที่ผมเข้าใจเค้าไม่ได้ใช้สถาปัตยกรรมแบบนี้เลย จึงมีความเป็น “เครื่องจักร” มากกว่าคอมพิวเตอร์

หน่วยคำนวณควอนตัม
เทียบกับคอมพิวเตอร์ทุกวันนี้ เรามีวิชาตรรกศาสตร์ มีค่า Boolean มีการคำนวณ AND, OR, NOT ฯลฯ เราก็เอามาทำเป็นบิตในวงจรไฟฟ้าและ Logic Gate สำหรับ AND, OR, NOT ซึ่งสุดท้ายก็สามารถเรียกใช้ในระดับสูงได้ด้วย instruction AND, OR, NOT เป็นต้น
ซับซ้อนขึ้นมาอีกนิด เราก็เอาบิตหลายๆ บิตมาต่อกัน มองให้เป็นตัวเลขฐานสอง เราก็จะสามารถมี instruction เลขคณิตอย่าง ADD, SUB, MUL, DIV ได้ หรือซับซ้อนกว่านั้นอีกก็คือเข้ารหัสเพื่อการคำนวณเลขทศนิยม มี instruction FADD, FSUB, FMUL, FDIV เป็นต้น
การคำนวณควอนตัมก็เช่นเดียวกัน เราจะมีรีจิสเตอร์แบบใหม่ซึ่งประกอบด้วยคิวบิตแทนบิตธรรมดา และเราก็จะมี Quantum Gate เพื่อการคำนวณแบบควอนตัม เช่น Hadamard, Pauli, C-Not, Toffoli ฯลฯ ซึ่งสุดท้ายก็จะไปเป็น instruction ให้เรียกใช้ได้

คิวบิต (Quantum bit หรือ qubit)
สิ่งที่ถูกกล่าวถึงมากที่สุดเมื่อพูดถึงควอนตัมคอมพิวเตอร์ก็คือคิวบิต พลังอันน่าอัศจรรย์ที่ถูกกล่าวถึงอย่างเช่น มันสามารถอยู่ในสถานะ Superposition ซึ่งเป็น 1 และ 0 ได้พร้อมกัน หากนำคิวบิตหลายตัวมาเรียงต่อกัน n ตัว เราจะสามารถประมวลผล 2n กรณีได้ในขั้นตอนเดียว คำกล่าวนี้จริงหรือไม่จริงอย่างไร เดี๋ยวค่อยพูดกันอีกที ตอนนี้ผมอยากจะลงรายละเอียดว่าการคำนวณแบบควอนตัมคืออะไร

  • ดังที่บอกว่าคิวบิตสามารถเป็น 1 และ 0 ได้พร้อมๆ กัน อธิบายให้ละเอียดอีกนิดคือ มันอยู่ในสถานะที่กึ่งๆ โดยเราสามารถบอกความน่าจะเป็นเมื่อถูกวัดผล (Measure) ออกมาได้ เช่น น่าจะเป็น “1” อยู่ 0.5, น่าจะเป็น “0” อยู่ 0.5
  • สถานะกึ่งๆ ที่ว่าคือสถานะควอนตัม จริงๆ แล้วมันก็คือ “ความน่าจะเป็นเชิงซ้อน” ซึ่งอยู่เบื้องหลังความน่าจะเป็นจำนวนจริงที่เรามองเห็น (ถ้าคุณเรียนเรื่องไฟฟ้ากระแสสลับมา คุณจะไม่แปลกใจเลยว่าโลกแห่งความจริงที่เราเห็นทุกวันนี้ มันมีจำนวนจินตภาพที่มองไม่เห็นคอยชักใยอยู่เบื้องหลัง) ตัวอย่างความน่าจะเป็นเชิงซ้อน เช่น น่าจะเป็น “1” อยู่ 0.707i, น่าจะเป็น “0” อยู่ -0.707i
    ทางคณิตศาสตร์เขียนสัญลักษณ์ได้ว่า
    |\psi\rangle = 0.707i|0\rangle - 0.707i|1\rangle
    เครื่องหมาย|...\rangle เรียกว่าเคท (Ket) หมายถึงสถานะควอนตัม เช่น|\psi\rangle ในที่นี้คือสถานะของสิ่งที่กำลังกล่าวถึงอยู่|0\rangle คือสถานะซึ่งเป็น “0”,|1\rangle คือสถานะซึ่งเป็น “1”

  • จากสถานะควอนตัมตัวอย่างข้างต้นสามารถคำนวณออกมาเป็นความน่าจะเป็นในโลกจริงโดยการหา Modulus Square หรือเอาขนาดมายกกำลังสอง ก็คือเอา 0.707i หรือ -0.707i มา absolute แล้วยกกำลังสอง ก็จะได้ความน่าจะเป็นเท่ากับ 0.5 เหมือนกันทั้งสถานะ “0” และ “1”

จะเห็นได้ว่าสถานะควอนตัมของคิวบิต มาจากตัวแปรสองตัวคือ coefficient ของ “0” และ “1” ซึ่งนักคณิตศาสตร์เค้าคำนวณแล้วบอกว่าสามารถนำเสนอออกมาเป็นภาพของลูกศรชี้อยู่ภายในทรงกลมสามมิติ ซึ่งก็มีตัวแปรสองตัวเหมือนกันคือมุมกวาดในแนวราบและแนวตั้ง ทรงกลมที่นำเสนอภาพของคิวบิตนี้เรียกว่าทรงกลมของบล็อฅ หรือ Bloch sphere ตัวอย่างเป็นแบบภาพด้านล่าง
bloch-sphere
ยังไงก็อย่าสับสน Bloch sphere เป็นภาพการนำเสนอสถานะควอนตัมแบบหนึ่งเท่านั้น ไม่ใช่ภาพของอนุภาคที่เอามาสร้างคิวบิต และไม่ได้บอกถึงเทคโนโลยี ว่าเราเอาอะไร(เช่น สปิน, ระดับพลังงาน หรือ โพลาไรซ์) มาใช้เป็นสถานะของคิวบิต

ลงตัวอย่างให้ดูอีกนิดว่าสถานะควอนตัมแบบต่างๆ จะสามารถให้ความน่าจะเป็นและภาพของ Bloch sphere อย่างไรได้บ้าง

สถานะ ความน่าจะเป็น
“0” : “1”
Bloch sphere ข้อสังเกต Bloch sphere
|0\rangle 1 : 0 bloch1 ตำแหน่ง +Z คือตำแหน่งของ pure state “0”
|1\rangle 0 : 1 bloch2 ตำแหน่ง -Z คือตำแหน่งของ pure state “1”
0.707i|0\rangle + 0.707i|1\rangle 0.5 : 0.5 bloch3 แท่งสีแดงมีโอกาสเท่าๆ กันที่จะ “ล้ม” ไปทางด้านบนหรือด้านล่างก็ได้
0.707i|0\rangle - 0.707i|1\rangle 0.5 : 0.5 bloch4 ข้อนี้แม้จะมีสถานะควอนตัมที่ต่างจากข้อบน แต่เมื่อคำนวณแล้วได้ความน่าจะเป็นเท่ากัน
(.85+.35i)|0\rangle +(.15+.35i)|1\rangle .85 : .15 bloch5 แท่งสีแดงดูแล้วมีโอกาสล้มไปทางด้านบนมากกว่า ซึ่งก็สอดคล้องกับความน่าจะเป็นที่โอกาสเกิด “0” มากกว่า

 

ควอนตัมเกต
เทียบกับคอมพิวเตอร์ปัจจุบันอีกสักครั้ง เรามี operator AND, OR, NOT ไว้จัดการกับค่า Boolean, เรามี operator ADD, SUB, MUL, DIV ไว้จัดการกับตัวเลข ดังนั้นเราก็ควรจะมี quantum operator อยู่ชุดหนึ่งไว้จัดการ quantum state ของคิวบิตของเรา ซึ่งมันก็มีทั้ง operator ประเภทไว้จัดการกับคิวบิตเดียว, สองคิวบิต, สามคิวบิต เป็นต้น
พวก quantum operator เหล่านี้ ว่าง่ายๆ คือมันจะวุ่นวายอยู่กับการ “หมุน” แท่งสีแดงของ Bloch sphere ไปในทิศทางต่างๆ ลักษณะเดียวกับที่ logic operator วุ่นวายอยู่กับการสลับค่า 0 กับ 1 แต่ในควอนตัมเราทำได้ละเอียดกว่า มีทั้งพลิก 180 องศา มีทั้งพลิก 90 องศา พลิกซ้าย พลิกขวา ทำได้หมด

ตัวอย่าง quantum gate

  • Hadamard Gate สัญลักษณ์คือ H-gate
    สำหรับทำให้ pure state กลายเป็น superposition หรือย้อนกลับ กล่าวคือมันสามารถพลิกแท่งสีแดงจากแนวตั้งเป็นแนวราบได้ เอาให้ชัดคือทำการหมุนรอบแกน Y 90 องศา ตามด้วยหมุนรอบแกน X 180 องศา ดังนั้น pure state “0” หรือ “+Z” จะถูกหมุนไปเป็น “+X” และถ้า H อีกครั้งมันจะหมุนกลับไปที่ “0” หรือ “+Z”, หรือถ้าตั้งต้นจาก pure state “1” หรือ “-Z” จะถูกหมุนไปเป็น state “-X” และถ้า H อีกครั้งมันจะหมุนกลับไปที่ “-Z”

    H-sampleตัวอย่าง state “+Z” ผ่าน H gate หนึ่งครั้งจะกลายเป็น state “+X” และถ้าผ่าน H gate อีกหนึ่งครั้งจะกลับเป็น state “+Z”

     

  • Pauli-X, Pauli-Y, Pauli-Z Gate สัญลักษณ์คือ XYZ-gate
    สำหรับหมุนแท่งสีแดงไป 180 องศาในแกน X, Y, Z ตามลำดับ

    X-sampleตัวอย่าง state “+Z” ผ่าน X gate หนึ่งครั้งจะกลายเป็น state “-Z” และถ้าผ่าน X gate อีกหนึ่งครั้งจะกลับเป็น state “+Z”

     

  • C-Not หรือ Controlled-Not Gate สัญลักษณ์คือ CNot-gate
    มันก็คือ Not Gate นี่แหละ (หมุน 180 องศา แกน X) แต่เพิ่ม control qubit เข้ามาหนึ่งเส้น หากเส้น control เป็น “0” เส้น input จะไม่ถูก NOT, หากเส้น control เป็น “1” เส้น input จะถูก NOT เป็นต้น (คล้ายกับ XOR)

และก็ยังมี operator อื่นๆ อย่าง S Gate ไว้หมุน 90 องศาแกน Z, T Gate ไว้หมุน 45 องศาแกน Z, หรือ Toffoli Gate ก็คือ Controlled-Not Gate แบบที่มีเส้น control สองคิวบิต เป็นต้น

ควอนตัมอัลกอริทึม
ลองมาดูว่าควอนตัมอัลกอริทึมมันจะมีการเอาคิวบิตมาใช้ประโยชน์อย่างไร ควอนตัมอัลกอริทึมที่ดังๆ ก็อย่างเช่น Deutsch-Jozsa’s Algorithm สำหรับทดสอบ constant function, Grover’s Algorithm สำหรับค้นหา item ใน unsorted list, และ Shor’s Algorithm สำหรับแยก factor ตัวเลข ควอนตัมอัลกอริทึมเหล่านี้ล้วนแต่แสดงให้เห็นว่ามันสามารถทำงานได้เร็วกว่าอัลกอริทึมปกติในโจทย์แบบเดียวกัน
จะขอยกตัวอย่าง Grover’s Algorithm ก่อน เอาแบบคร่าวๆ คือ

  • Grover’s Algorithm เค้าบอกว่าเป็นควอนตัมอัลกอริทึมที่เอาไว้ search item ใน unsorted list ซึ่งโดยทั่วไปจะใช้เวลาเต็มที่เท่ากับO(N) แต่เมื่อทำในควอนตัมอัลกอริทึมแล้วจะใช้เวลาเต็มที่เพียงO(\sqrt{N})
  • ลักษณะของโจทย์คือ ต้องการคำตอบออกมาเป็นตัวเลข เช่น จากเลข 0-255 (สมมติว่า 8 คิวบิต) ก็ต้องบอกออกมาว่า item ที่ต้องการอยู่ที่เลขเท่าไหร่ เรามองได้ว่า list เจ้าปัญหาของเราคือฟังค์ชันตัวหนึ่งซึ่งจะให้ค่าเท่ากับ 1 ก็ต่อเมื่อ “ทาย” ตำแหน่งของ item ถูก ถ้าไม่เช่นนั้นจะให้ค่าเท่ากับ 0
  • โปรแกรมเริ่มต้นด้วยการใช้ Hadamard เตรียมเจ้า 8 คิวบิตนี้ให้กลายเป็น superposition ก่อน หมายความว่า เลขที่ออกอาจจะได้เลข 0-255 เลขใดเลขหนึ่งก็ได้ โอกาสเท่ากันทั้งหมด
  • จากนั้นวนลูป ทำการใส่ superposition เข้าไปใน oracle ของฟังค์ชันเจ้าปัญหา (oracle หมายถึงสิ่งที่ช่วยนำเอาผลของฟังค์ชันเข้าไปสวมในวงจรควอนตัมได้) แล้วใช้เทคนิค Amplitude Amplification ซึ่งมันจะ transform 8 คิวบิตนี้ ให้เกิดเป็นตัวเลขที่เป็นคำตอบ ทำอย่างนี้สัก{\pi\over 4}\sqrt{N} ครั้ง ความน่าจะเป็นของตัวเลขที่เป็นคำตอบก็จะแหลมโด่งขึ้นมา ก็จะสามารถบอกตัวเลขที่ถูกต้องจาก 0-255 ได้

คิวบิตที่อยู่ในสถานะ superposition คือความน่าจะเป็นในการออกผลอยู่เอียงๆ ระหว่าง 0 กับ 1 สิ่งที่โปรแกรมทำคือพลิกคิวบิตแต่ละตัวไปมา โดยมีผลจากฟังค์ชันปัญหาในแต่ละรอบลูปช่วยทำให้สถานะของคิวบิตเอนไปทางคำตอบมากขึ้น สุดท้ายเมื่อต้องการทราบผลก็ต้องทำการวัดคิวบิตทั้ง 8 ตัวให้เกิดเป็นค่าขึ้นมาจริงๆ ซึ่งตอนวัดนี้เองจะมีการสุ่มเข้ามาเกี่ยวข้องด้วย ดังนั้นเป็นไปได้ว่าเรารันโปรแกรม 100 ครั้ง แต่อาจได้ผลถูกต้อง 95 ครั้ง โปรแกรมลักษณะนี้เรียกว่า stochastic ไม่ใช่ deterministic คือบางทีมันก็เอาแน่ไม่ได้นะแต่ส่วนใหญ่จะถูก ประมาณนั้น
ถ้าเราดูดีๆจะเห็นว่า superposition ไม่ได้ทำการแตกตัว 2n ไปหาคำตอบ เทคนิคของควอนตัมไม่ได้อยู่ที่การทำ parallel processing แต่ใช้วิธีปรับความน่าจะเป็นเชิงซ้อนของคิวบิต ทำให้คิวบิตเข้าใกล้คำตอบมากขึ้น ดังนั้นคำพูดที่ว่าควอนตัมคอมพิวเตอร์จะทำงานขนาด 2n ได้ในขั้นตอนเดียวจึงไม่ถูกนัก ยิ่งไปกว่านั้นจะเห็นว่าเรามีการป้อน superposition เข้าไปใน oracle ของฟังค์ชันปัญหาของเรา ซึ่งแปลว่าต้องมีการโมเดลฟังค์ชันใหม่ให้ตอบสนอง superposition ได้ด้วย ซึ่งอาจจะไม่ใช่เรื่องง่ายสำหรับโจทย์บางอย่าง
สรุปคือ ในทางทฤษฎีแล้ว ควอนตัมอัลกอริทึมสามารถที่จะทลายข้อจำกัดบางอย่างของอัลกอริทึมธรรมดาได้จริง แต่ไม่ใช่ว่าทุกปัญหาจะสามารถนำไปใช้กับควอนตัมอัลกอริทึมได้ และที่ควอนตัมอัลกอริทึมทำงานได้เร็วกว่าเพราะมันสามารถใช้มิติเชิงซ้อนในการเดินทางเข้าสู่คำตอบไม่ใช่เพราะว่ามันแยกร่างไปหาคำตอบพร้อมกัน

แล้วเราลองเล่นอะไรดูได้บ้าง
หัวข้อที่แล้วกล่าวถึงควอนตัมอัลกอริทึมที่ค่อนข้างเลิศหรู หัวข้อนี้เรามาลองเล่นควอนตัมอัลกอริทึมง่ายๆ แต่มหัศจรรย์ไม่แพ้กันดูดีกว่า นั่นคือ Deutsch’s Algorithm โจทย์ก็คือ สมมติเรามีฟังค์ชันอยู่สี่แบบ ซึ่งรับ input บิตเดียว และให้ output บิตเดียว

f1 ให้ค่า 0 เสมอ จัดว่าเป็น constant function
f2 ให้ค่า 1 เสมอ จัดว่าเป็น constant function
f3 ให้ค่าเท่ากับ input เสมอ จัดว่าเป็น balance function
f4 ให้ค่าตรงข้ามกับ input เสมอ จัดว่าเป็น balance function

ถ้าอยู่ๆ เราจับฟังค์ชันขึ้นมาตัวนึง โดยไม่รู้ว่ามันคือฟังค์ชันตัวไหน แล้วถามว่ามันเป็น constant function หรือไม่ ต้องทำอย่างไร เอาง่ายๆ ก็คือป้อน 0 ใส่ฟังค์ชันเข้าไปแล้วดูผล จากนั้นป้อน 1 ใส่ฟังค์ชันเข้าไปแล้วดูผล ถ้าได้ผลเหมือนเดิม ก็ตอบได้ว่าเป็น constant function นี่คือวิธีการของคอมพิวเตอร์ปกติ
เชื่อหรือไม่ว่าควอนตัมอัลกอริทึมสามารถทดสอบ constant function ได้โดยป้อน input เข้าฟังค์ชันเพียงครั้งเดียว
วิธีการคือต้องทำวงจรควอนตัมเป็นแบบนี้

deutsch-algorithm
ทางซ้ายสุดคือเราป้อน pure state “0” และ “1” ผ่าน Hadamard gate แล้วนำไปเข้า Uf หรือ oracle ของฟังค์ชันปัญหาของเรา จากนั้นเอาแค่ผลลัพธ์จาก x’ ไป Hadamard อีกครั้งหนึ่งแล้ววัดผล หากได้ “0” แสดงว่าเป็น constant function หากได้ “1” แสดงว่าเป็น balance function
ป้อนครั้งเดียวรู้ผลเลย มันเป็นไปได้อย่างไร !!

ก่อนอื่นขอย้อนมาตรง Uf ก่อน ว่าฟังค์ชันเรามัน in/out บิตเดียว ทำไมในรูปต้องทำเป็น 2 บิต ที่เป็นแบบนี้เพราะวงจรควอนตัมจำเป็นอย่างยิ่งจะต้องคำนวณเดินหน้าและถอยหลังได้ ภาษาคณิตศาสตร์เรียกว่า unitary (สังเกตว่าสัญลักษณ์ของควอนตัมเกต จะไม่บอกทิศทางว่าเข้าทางไหนออกทางไหน เพราะป้อนเข้าทางไหนก็ควรทำงานได้) ดังนั้นเราจึงต้องมีส่วนประกอบซึ่งเป็น unitary และยังให้ผลแบบเดียวกับฟังค์ชันได้ คือตัว oracle ซึ่งมันต้องให้ข้อมูลได้ทั้ง output และ input ของฟังค์ชัน จึงเป็นบิตที่เกินมา
กำหนดให้x'=x และy'=y \bigoplus f(x) ดังนั้นตัว Uf จะทำงานเหมือนฟังค์ชันในกรณีที่จับ y เป็น 0 แล้วป้อน input เข้าที่ x แล้วผลของ f(x) ก็จะไปออกที่ y’ (เพราะ 0 XOR อะไรก็ได้ค่านั้น)

ถ้าเราลองส่องลงไปดูให้เห็นข้างใน Uf หรือ oracle ของฟังค์ชันทั้งสี่แบบ จะโมเดลได้วงจรประมาณนี้

f1f2f3f4_circuitf1, f2 ไม่เกี่ยวพันกับ x เลย แต่ f3 และ f4 เกี่ยวพันกับ x (entangle)

เราลองมาไล่ดูว่าเกิดอะไรขึ้นเมื่อเราคำนวณวงจรควอนตัมสำหรับฟังค์ชันแต่ละแบบ

ฟังค์ชัน สถานะที่จุด b
|x, y\rangle
สถานะที่จุด c
|x', y'\rangle
สถานะที่จุด d คำอธิบาย
f1 |+, -\rangle |+, -\rangle |0\rangle y’ ไม่เกี่ยวพันกับ x แม้แต่น้อย
f2 |+, -\rangle |+, -\rangle |0\rangle y’ ไม่เกี่ยวพันกับ x แม้แต่น้อย
f3 |+, -\rangle |-, -\rangle |1\rangle y’ เกี่ยวพันกับ x ส่งผลให้เกิดการ control ย้อนกลับ x’ กลายเป็น “-“
f4 |+, -\rangle |-, -\rangle |1\rangle y’ เกี่ยวพันกับ x ส่งผลให้เกิดการ control ย้อนกลับ x’ กลายเป็น “-“

หมายเหตุ ขอเรียกสถานะ|+X\rangle และ|-X\rangle สั้นๆ ว่า|+\rangle และ|-\rangle

จะเห็นว่ากุญแจสำคัญคือคำว่า “control ย้อนกลับ” มันคืออะไร โผล่มาได้อย่างไร
สิ่งที่ผมไม่ได้บอกไปก่อนหน้านี้ก็คือพฤติกรรมของ C-Not gate เมื่อป้อน superposition เข้าไปแทน pure state มันจะ control ย้อนกลับ จากเดิมสาย x ควบคุมสาย y จะกลายเป็นสาย y ควบคุมสาย x ทำให้สถานะของ x เปลี่ยนจาก “+” เป็น “-” พฤติกรรมแปลกประหลาดของควอนตัมเกตตัวนี้นักคณิตศาสตร์ไม่ได้อุปโลกน์ขึ้นมาเอง แต่มันเกิดจาก C-Not มี transformation matrix ที่เมื่อใส่ความน่าจะเป็นเชิงซ้อนของ superposition เข้าไป จะทำให้เกิดพฤติกรรมพัวพันดังกล่าวขึ้นจริงๆ

\left[\begin{array}{cccc}  1 & 0 & 0 & 0       \\  0 & 1 & 0 & 0       \\  0 & 0 & 0 & 1       \\  0 & 0 & 1 & 0  \end{array}\right]
Transformation matrix ของ C-Not gate บน pure state basis
จะทำให้เกิดการ control ย้อนกลับ หากป้อน superposition ใน hadamard basis เข้าไป
ดูแต่ตาไม่รู้หรอกต้องไปลองคำนวณดู

การพัวพัน (entanglement) ที่ทำให้เกิดการเปลี่ยนของสถานะตรงจุด x’ นี้เองคือสิ่งที่ทำให้เราแยกแยะระหว่าง constant/balance function ได้ นี่คืออีกหนึ่งเทคนิคที่มีเฉพาะในการคำนวณแบบควอนตัม ถึงตรงนี้ผมก็ขี้เกียจอธิบายต่อแล้ว เอาเป็นว่าลองไปต่อวงจรควอนตัมเล่นดู แล้ววัดดูทีละจุดว่าได้ผลจริงตามทฤษฎีหรือไม่ โดยถ้าเล่นในเว็บของ IBM ก็ต่อวงจรประมาณนี้

test-quantum-circuitsต่อวงจรแล้วลองวัดผลดูทั้งแบบ state distribution และแบบ bloch sphere เพื่อความสนุกสนาน

หรือถ้าเล่นในเว็บของ Google ก็เขียนโค้ดแบบนี้

VectorSize 6 // Lowest qubits allowed by simulator
SetViewMode 1
Display "|yx><br>|0> is |00>, |1> is |01>, |2> is |10>, |3> is |11>"

SigmaX 1

Hadamard 0
Hadamard 1

//CNot 0, 1
//SigmaX 1

Hadamard 0

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

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

%d bloggers like this: