การแปลงฟูเรียเชิงควอนตัม
โมดูล Qiskit in Classrooms นี้ต้องการให้นักเรียนมี Python environment ที่ใช้งานได้พร้อมติดตั้งแพ็กเกจต่อไปนี้:
qiskitv2.1.0 หรือใหม่กว่าqiskit-ibm-runtimev0.40.1 หรือใหม่กว่าqiskit-aerv0.17.0 หรือใหม่กว่าqiskit.visualizationnumpypylatexenc
สำหรับการตั้งค่าและติดตั้งแพ็กเกจข้างต้น ดู คู่มือติดตั้ง Qiskit เพื่อรันงานบนคอมพิวเตอร์ควอนตัมจริง นักเรียนต้องสร้างบัญชี IBM Quantum® โดยทำตามขั้นตอนในคู่มือ ตั้งค่าบัญชี IBM Cloud
โมดูลนี้ผ่านการทดสอบและใช้เวลา QPU ไป 13 วินาที ตัวเลขนี้เป็นค่าประมาณ ปริมาณการใช้งานจริงของคุณอาจแตกต่างกัน
# Added by doQumentation — required packages for this notebook
!pip install -q numpy qiskit qiskit-aer qiskit-ibm-runtime
# Uncomment and modify this line as needed to install dependencies
#!pip install 'qiskit>=2.1.0' 'qiskit-ibm-runtime>=0.40.1' 'qiskit-aer>=0.17.0' 'numpy' 'pylatexenc'
บทนำ
การแปลงฟูเรีย (Fourier transform) เป็นเครื่องมือที่ใช้กันทั่วไปมากในคณิตศาสตร์ ฟิสิกส์ การประมวลผลสัญญาณ การบีบอัดข้อมูล และสาขาอื่นๆ อีกมากมาย การแปลงฟูเรียเชิงควอนตัม ที่ตั้งชื่อได้ตรงไปตรงมา เป็นพื้นฐานของอัลกอริทึมควอนตัมที่สำคัญที่สุดบางตัว
วันนี้ หลังจากทบทวนการแปลงฟูเรียแบบคลาสสิก เราจะพูดถึงวิธีที่เรานำการแปลงฟูเรียเชิงควอนตัมไปใช้บนคอมพิวเตอร์ควอนตัม จากนั้นเราจะหารืออยู่กับหนึ่งในการประยุกต์ใช้การแปลงฟูเรียเชิงควอนตัมกับอัลกอริทึมที่เรียกว่า phase estimation algorithm การประมาณเฟสเชิงควอนตัมเป็นซับรูทีนในอัลกอริทึมการแยกตัวประกอบที่มีชื่อเสียงของ Shor ซึ่งบางครั้งเรียกว่า "มงกุฎแก้วของการประมวลผลเชิงควอนตัม" โมดูลนี้ก้าวไปสู่โมดูลอีกตัวเกี่ยวกับอัลกอริทึมของ Shor แต่ยังออกแบบให้ยืนหยัดได้ด้วยตัวเอง การแปลงฟูเรียเชิงควอนตัมเป็นอัลกอริทึมที่น่าสนใจและมีประโยชน์ในตัวมันเอง!
การแปลงฟูเรียแบบคลาสสิก
ก่อนที่เราจะก้าวเข้าสู่การแปลงฟูเรียเชิงควอนตัม มาทบทวนเวอร์ชันแบบคลาสสิกก่อน การแปลงฟูเรียเป็นวิธีการแปลงจาก "ฐาน" หนึ่งไปยังอีกฐานหนึ่ง คุณสามารถคิดสองฐานเป็นมุมมองที่ต่างกันของปัญหาเดียวกัน ทั้งคู่เป็นวิธีที่ถูกต้องในการแสดงฟังก์ชัน แต่อย่างใดอย่างหนึ่งอาจให้ข้อมูลเชิงลึกมากกว่าขึ้นอยู่กับปัญหาที่มี ตัวอย่างของคู่ฐานที่เชื่อมต่อด้วยการแปลงฟูเรีย ได้แก่ ตำแหน่งและโมเมนตัม และเวลาและความถี่
มาดูตัวอย่างว่าการแปลงฟูเรียอาจช่วยให้เราหาว่าเครื่องดนตรีกำลังเล่นโน้ตใดโดยพิจารณาจาก waveform เสียง โดยทั่วไป เราเห็น waveform ที่แสดงในฐานเวลา นั่นคือ แอมพลิจูดของคลื่นแสดงเป็นฟังก์ชันของเวลา

เราสามารถแปลงฟูเรีย waveform นี้เพื่อไปจากฐานเวลาสู่ฐานความถี่:

ในฐานความถี่ เราสามารถเห็นยอดแหลมชัดเจนที่ประมาณ 260 Hz นั่นคือโน้ต C กลาง!
ตอนนี้ คุณอาจจะสามารถระบุได้ว่ากำลังเล่น C กลางโดยไม่ต้องใช้การแปลงฟูเรีย แต่ถ้าเล่นหลายโน้ตพร้อมกันล่ะ? waveform จะซับซ้อนขึ้นเมื่อเราพล็อตในฐานเวลา:

แต่สเปกตรัมความถี่ระบุยอดแหลมสามยอดอย่างชัดเจน:

นี่เป็นคอร์ด C major กำลังเล่นโน้ต C, E และ G
การวิเคราะห์ฟูเรียประเภทนี้สามารถช่วยให้เราดึงองค์ประกอบความถี่ของสัญญาณที่ซับซ้อนประเภทใดก็ได้
การแปลงฟูเรียแบบไม่ต่อเนื่อง
การแปลงฟูเรียมีประโยชน์สำหรับการประยุกต์ใช้การประมวลผลสัญญาณมากมาย แต่ในการประยุกต์ใช้งานจริงส่วนใหญ่ (รวมถึงตัวอย่างเพลงที่เราใช้ด้านบน) เราต้องการแปลงชุดข้อมูล จุดแบบไม่ต่อเนื่อง ไม่ใช่ฟังก์ชันต่อเนื่อง ในกรณีนี้ เราใช้ การแปลงฟูเรียแบบไม่ต่อเนื่อง (DFT) DFT กระทำบน vector และแมปไปยัง vector ตามสูตร:
โดยที่เรานิยาม (สังเกตว่ามี convention อื่นที่มีเครื่องหมายลบในเลขชี้กำลัง ดังนั้นควรระวังเมื่อเห็น DFT ในที่อื่น) จำว่า เป็นฟังก์ชันคาบ ด้วยคาบ ดังนั้น โดยการคูณด้วยฟังก์ชันนี้ การแปลงฟูเรียจึงเป็นวิธีแยก (แบบไม่ต่อเนื่อง) ฟังก์ชัน ออกเป็นการรวมเชิงเส้นของฟังก์ชันคาบที่ประกอบขึ้น โดยแต่ละตัวมีคาบ
การแปลงฟูเรียเชิงควอนตัม
ตอนนี้ เราเห็นแล้วว่าการแปลงฟูเรียถูกใช้เพื่อแสดงฟังก์ชันเป็นการรวมเชิงเส้นของชุด "ฟังก์ชันฐาน" ใหม่ การแปลงฐานถูกทำกับสถานะ Qubit เป็นประจำเช่นกัน ตัวอย่างเช่น สถานะของ Qubit เดี่ยว สามารถแสดงในฐาน computational พร้อมสถานะฐาน และ หรือในฐาน พร้อมสถานะฐาน และ ทั้งสองถูกต้องเท่าเทียมกัน แต่อย่างใดอย่างหนึ่งอาจเป็นธรรมชาติกว่าขึ้นอยู่กับประเภทของปัญหาที่พยายามแก้
สถานะ Qubit ยังสามารถแสดงในฐานฟูเรียที่สถานะแสดงในรูปของการรวมเชิงเส้นของสถานะฐานฟูเรีย แทนสถานะฐาน computational ปกติ ในการทำเช่นนี้ คุณต้องนำการแปลงฟูเรียเชิงควอนตัม (QFT) ไปใช้:
โดยที่ ดังที่กล่าวข้างต้น และ คือจำนวนสถานะฐานในระบบควอนตัมของคุณ สังเกตว่าเนื่องจากตอนนี้เราทำงานกับ Qubit Qubit ให้ สถานะฐาน ดังนั้น ที่นี่ สถานะฐานเขียนเป็นตัวเลขเดี่ยว โดยที่ มีค่าตั้งแต่ ถึง แต่โดยทั่วไปคุณอาจเห็นสถานะฐานแสดงเป็น , , , ..., โดยแต่ละหลักไบนารีแสดงสถานะของ Qubit 0 ถึง จากขวาไปซ้าย มีวิธีง่ายๆ ในการแปลงสถานะไบนารีเหล่านี้เป็นตัวเลขเดี่ยว: แค่ถือว่ามันเป็นเลขฐานสอง! ดังนั้น , , , และต่อเนื่องไปจนถึง
สร้างสัญชาตญาณสำหรับสถานะฐานฟูเรีย
ดังนั้น เพิ่งอธิบายไปแล้วว่าสถานะฐาน computational คืออะไรและเรียงลำดับอย่างไร: พวกมันคือชุดของสถานะที่แต่ละ Qubit อยู่ใน 0 หรือ 1 และเราเรียงลำดับจากสถานะที่ Qubit ทั้งหมดเป็น 0 ถึงสถานะที่ทั้งหมดเป็น 1
แต่เราจะเข้าใจสถานะฐาน ฟูเรีย ได้อย่างไร? สถานะฐานฟูเรียทั้งหมดเป็นซูเปอร์โพสิชันที่เท่ากันของสถานะฐาน computational ทั้งหมด แต่แต่ละสถานะต่างกันจากอื่นในความเป็นคาบของ เฟส ของส่วนประกอบ เพื่อทำความเข้าใจสิ่งนี้มากขึ้น มาดูสถานะฐานฟูเรียสี่ตัวของระบบสอง Qubit กัน สถานะฟูเรียต่ำสุดคือสถานะที่เฟสไม่เปลี่ยนแปลงเลย:
เราสามารถแสดงสถานะนี้โดยการพล็อตแอมพลิจูดเชิงซ้อนของแต่ละเทอม เส้นสีแดงช่วยให้เห็นว่าเฟสของแอมพลิจูดนี้วนรอบระนาบเชิงซ้อนอย่างไรในฐานะฟังก์ชันของสถานะฐาน computational สำหรับ เฟสคงที่:

สถานะฐานฟูเรียถัดไปคือสถานะที่เฟสของส่วนประกอบวนรอบจาก ถึง เพียงครั้งเดียว:
และเราสามารถเห็นการวนนี้ในกราฟแอมพลิจูดเชิงซ้อนเทียบสถานะฐาน computational:

ดังนั้น แต่ละสถานะมีเฟสที่สูงกว่าสถานะก่อนหน้า เรเดียน เมื่อเรียงลำดับตามปกติ เนื่องจากในตัวอย่างนี้เรามีสี่สถานะฐาน () สถานะฐานถัดไปวนรอบจาก 0 ถึง สองครั้ง:

สุดท้าย องค์ประกอบฟูเรียสูงสุดคือสถานะที่มีเฟสแปรผันเร็วที่สุด สำหรับตัวอย่างสอง Qubit ของเรา มันคือสถานะที่เฟสวนรอบจาก 0 ถึง สามครั้ง:

โดยทั่วไป สำหรับสถานะ -Qubit จะมีสถานะฐานฟูเรีย ตัว ซึ่งความถี่ในการแปรผันของเฟสมีช่วงตั้งแต่คงที่สำหรับ ถึงแปรผันรวดเร็วสำหรับ โดยวนครบ รอบรอบ ตลอดซูเปอร์โพสิชันของสถานะ ดังนั้น เมื่อเรา QFT สถานะควอนตัม เราก็กำลังทำการวิเคราะห์พื้นฐานเดียวกับที่เราทำสำหรับ waveform เพลงในบทนำ เราระบุองค์ประกอบความถี่ฟูเรียที่มีส่วนในการสร้างสถานะควอนตัมที่สนใจ
ลอง QFT ตัวอย่าง
มาลองสร้างสัญชาตญาณสำหรับการแปลงฟูเรียเชิงควอนตัมต่อไปโดยสร้างสถานะในฐาน computational แล้วดูว่าเกิดอะไรขึ้นเมื่อเรานำ QFT ไปใช้กับมัน สำหรับตอนนี้ เราจะถือว่า QFT เป็นกล่องดำที่เรานำมาใช้โดยใช้ QFTGate จาก ไลบรารี Circuit ของ Qiskit ในภายหลัง เราจะดูภายในเพื่อดูวิธีที่มันถูกใช้งาน
เราเริ่มต้นด้วยการโหลดแพ็กเกจที่จำเป็นและเลือกอุปกรณ์สำหรับรัน Circuit:
import numpy as np
from qiskit import QuantumCircuit
from qiskit.visualization import plot_histogram
from qiskit.circuit.library import QFTGate
# Load the Qiskit Runtime service
from qiskit_ibm_runtime import QiskitRuntimeService
# Load the Runtime primitive and session
from qiskit_ibm_runtime import SamplerV2 as Sampler
service = QiskitRuntimeService()
# Use the least busy backend
# backend = service.least_busy(operational=True, simulator=False, min_num_qubits = 127)
backend = service.backend("ibm_pinguino2")
print(backend.name)
ibm_pinguino2
หากคุณไม่มีเวลาที่พร้อมใช้งานในบัญชีหรือต้องการใช้ simulator ด้วยเหตุผลใดก็ตาม คุณสามารถรันเซลล์ด้านล่างเพื่อตั้งค่า simulator ที่จำลองอุปกรณ์ควอนตัมที่เราเลือกด้านบน:
# Load the backend sampler
from qiskit.primitives import BackendSamplerV2
# Load the Aer simulator and generate a noise model based on the currently-selected backend.
from qiskit_aer import AerSimulator
from qiskit_aer.noise import NoiseModel
noise_model = NoiseModel.from_backend(backend)
# Define a simulator using Aer, and use it in Sampler.
backend_sim = AerSimulator(noise_model=noise_model)
sampler_sim = BackendSamplerV2(backend=backend_sim)
# Alternatively, load a fake backend with generic properties and define a simulator.
from qiskit.providers.fake_provider import GenericBackendV2
backend_gen = GenericBackendV2(num_qubits=18)
sampler_gen = BackendSamplerV2(backend=backend_gen)
สถานะฐาน computational เดี่ยว
ก่อนอื่น มาลองแปลงสถานะฐาน computational เดี่ยว เราจะเริ่มด้วยการสร้างสถานะ computational แบบสุ่ม:
# Step 1: Map
qubits = 4
N = 2**qubits
qc = QuantumCircuit(qubits)
# flip state of random qubits to put in a random single computational basis state
for i in range(1, qubits):
if np.random.randint(0, 2):
qc.x(i)
# make a copy of the above circuit. (to be used when we apply the QFT in next part)
qc_qft = qc.copy()
qc.measure_all()
qc.draw("mpl")
# Step 2: Transpile
from qiskit.transpiler.preset_passmanagers import generate_preset_pass_manager
target = backend.target
pm = generate_preset_pass_manager(target=target, optimization_level=3)
qc_isa = pm.run(qc)
# Step 3: Run the job on a real quantum computer OR try fake backend
sampler = Sampler(mode=backend)
pubs = [qc_isa]
# Run the job on real quantum device
job = sampler.run(pubs, shots=1000)
res = job.result()
counts = res[0].data.meas.get_counts()
# OR Run the job on the Aer simulator with noise model from real backend
# job = sampler_sim.run([qc_isa])
# res = job.result()
# counts = res[0].data.meas.get_counts()
# Step 4: Post-Process
plot_histogram(counts)
ตอนนี้ มา Fourier transform สถานะนี้ด้วย QFTGate:
# Step 1: Map
qc_qft.compose(QFTGate(qubits), inplace=True)
qc_qft.measure_all()
qc_qft.draw("mpl")
# Step 2: Transpile
from qiskit.transpiler.preset_passmanagers import generate_preset_pass_manager
target = backend.target
pm = generate_preset_pass_manager(target=target, optimization_level=3)
qc_isa = pm.run(qc_qft)
# Step 3: Run the job on a real quantum computer - try fake backend
sampler = Sampler(mode=backend)
pubs = [qc_isa]
# Run the job on real quantum device
job = sampler.run(pubs, shots=1000)
res = job.result()
counts = res[0].data.meas.get_counts()
# OR Run the job on the Aer simulator with noise model from real backend
# job = sampler_sim.run([qc_isa])
# res = job.result()
# counts = res[0].data.meas.get_counts()
# Step 4: Post-Process
plot_histogram(counts)
จะเห็นว่าเราวัดจำนวนประชากรของแต่ละสถานะให้มากหรือน้อยเท่ากัน โดยคำนึงถึง noise ในการทดลองและสถิติ ดังนั้น หากคุณนำ QFT ไปใช้กับสถานะฐาน computational เดี่ยว ผลลัพธ์คือซูเปอร์โพสิชันที่เท่ากันของสถานะทั้งหมด หากคุณคุ้นเคยกับการแปลงฟูเรีย สิ่งนี้น่าจะไม่น่าแปลกใจ หลักการพื้นฐานอย่างหนึ่งที่ช่วยให้เราสร้างการเชื่อมต่อเชิงสัญชาตญาณระหว่างฟังก์ชันและการแปลงฟูเรียคือความกว้างของฟังก์ชันแปรผกผันกับความกว้างของการแปลงฟูเรีย ดังนั้น สิ่งที่แปลมากในเวลา เช่น pulse สั้นมาก จะต้องใช้ช่วงความถี่กว้างในการสร้าง pulse นั้น สัญญาณนั้นจะกว้างมากใน Fourier space
ข้อเท็จจริงนี้จริงๆ แล้วเกี่ยวข้องกับความไม่แน่นอนเชิงควอนตัม! หลักความไม่แน่นอนของ Heisenberg มักระบุเป็น ดังนั้นหากความไม่แน่นอนใน () มีขนาดเล็ก ความไม่แน่นอนในโมเมนตัม () ต้องมีขนาดใหญ่ และในทางกลับกัน ปรากฏว่าการแปลงจากฐานตำแหน่ง ไปยังฐานโมเมนตัม ทำโดยการแปลงฟูเรีย
หมายเหตุ: โปรดจำไว้ว่าเรากำลังวัดประชากรในแต่ละสถานะฐาน ดังนั้นเราสูญเสียข้อมูลเกี่ยวกับเฟสสัมพัทธ์ระหว่างส่วนต่างๆ ของซูเปอร์โพสิชัน ดังนั้น ขณะที่ QFT ของสถานะฐาน computational เดี่ยวจะให้การกระจายประชากรสม่ำเสมอกว่าสถานะฐานทั้งหมดเช่นกัน เฟส จะไม่จำเป็นต้องเหมือนกัน
สถานะฐาน computational สอง
ตอนนี้ มาดูกันว่าเกิดอะไรขึ้นเมื่อเราเตรียมซูเปอร์โพสิชันของสถานะฐาน computational คุณคิดว่าการแปลงฟูเรียจะมีลักษณะอย่างไรในกรณีนี้?
มาเลือกซูเปอร์โพสิชัน:
# Step 1: Map
qubits = 4
N = 2**qubits
qc = QuantumCircuit(qubits)
# To make this state, we just need to apply a Hadamard to the last qubit
qc.h(qubits - 1)
qc_qft = qc.copy()
qc.measure_all()
qc.draw("mpl")
# First, let's go through steps 2-4 for the first circuit, qc
# Step 2: Transpile
from qiskit.transpiler.preset_passmanagers import generate_preset_pass_manager
target = backend.target
pm = generate_preset_pass_manager(target=target, optimization_level=3)
qc_isa = pm.run(qc)
# Step 3: Run the job on a real quantum computer - try fake backend
sampler = Sampler(mode=backend)
pubs = [qc_isa]
# Run the job on real quantum device
job = sampler.run(pubs, shots=1000)
res = job.result()
counts = res[0].data.meas.get_counts()
# OR run the job on the Aer simulator with noise model from real backend
# job = sampler_sim.run([qc_isa])
# res = job.result()
# counts = res[0].data.meas.get_counts()
# Step 4: Post-process
plot_histogram(counts)
ตอนนี้ มา Fourier transform สถานะนี้ด้วย QFTGate:
# Step 1: Map
qc_qft.compose(QFTGate(qubits), inplace=True)
qc_qft.measure_all()
qc_qft.draw("mpl")
# Step 2: Transpile
from qiskit.transpiler.preset_passmanagers import generate_preset_pass_manager
target = backend.target
pm = generate_preset_pass_manager(target=target, optimization_level=3)
qc_isa = pm.run(qc_qft)
# Step 3: Run the job on a real quantum computer OR try fake backend
sampler = Sampler(mode=backend)
pubs = [qc_isa]
# Run the job on real quantum device
job = sampler.run(pubs, shots=1000)
res = job.result()
counts = res[0].data.meas.get_counts()
# OR run the job on the Aer simulator with noise model from real backend
# job = sampler_sim.run([qc_isa])
# res = job.result()
# counts = res[0].data.meas.get_counts()
# Step 4: Post-process
plot_histogram(counts)
สิ่งนี้อาจน่าแปลกใจเล็กน้อย ดูเหมือนว่า QFT ของสถานะ เป็นซูเปอร์โพสิชันของสถานะฐานที่เป็นจำนวนคู่ทั้งหมด แต่ถ้าเราคิดถึงการแสดงภาพสถานะฐานแต่ละตัว และวิธีที่เฟสของแต่ละส่วนประกอบวนรอบ ครั้ง เหตุผลที่เราได้ผลลัพธ์นี้อาจชัดเจนขึ้น
ทดสอบความเข้าใจ
อ่านคำถามด้านล่าง คิดหาคำตอบ แล้วคลิกสามเหลี่ยมเพื่อดูเฉลย
ใช้คำใบ้ด้านบน อธิบายว่าทำไมผลลัพธ์ที่ได้สำหรับ QFT ของ จึงเป็นที่คาดหวัง
คำตอบ:
สถานะเดิมมีเฟสสัมพัทธ์ 0 (หรือจำนวนเต็มคูณของ ) ระหว่างสองส่วนของซูเปอร์โพสิชัน ดังนั้น เราทราบว่าสถานะนี้มีองค์ประกอบฟูเรียที่เฟสก็ตรงกันในแบบนั้นด้วย: สถานะที่มีเฟส shift 0 ระหว่างเทอม |0000> และเทอม |1000> สถานะฐานฟูเรียแต่ละตัว ประกอบด้วยเทอมที่เฟสสะสมในอัตรา หมายความว่า เมื่อเรียงลำดับตามปกติ แต่ละเทอมในซูเปอร์โพสิชันมีเฟสสูงกว่าเทอมก่อนหน้า ดังนั้น ที่จุดกึ่งกลาง เราต้องการให้เฟส เป็นจำนวนเต็มคูณของ ซึ่งเกิดขึ้นเมื่อ เป็นจำนวนคู่
ซูเปอร์โพสิชันของสถานะ computational ใดที่จะตรงกับ QFT ที่มียอดแหลมบนทุกจำนวนไบนารีคี่?
คำตอบ:
ถ้าคุณนำ QFT ไปใช้กับสถานะ คุณจะเห็นยอดแหลมบนสถานะที่มีหมายเลขไบนารีคี่ทุกตัว
แยกแยะอัลกอริทึม QFT
ตอนนี้ที่เราได้สร้างสัญชาตญาณเพิ่มเติมเกี่ยวกับความสัมพันธ์ระหว่างสถานะ Qubit ในฐาน computational และฐานฟูเรียแล้ว มาเจาะลึกลงไปในอัลกอริทึม QFT กัน กล่าวคือ เราใช้ Gate ใดจริงๆ บนคอมพิวเตอร์ควอนตัมเพื่อให้ได้การแปลงนี้?
มาเริ่มต้นจากขนาดเล็ก ด้วย Qubit เดี่ยว ดังนั้นหมายความว่าเรามีสองสถานะฐาน QFT แปลงสถานะฐาน computational และ ไปยังสถานะฐานฟูเรีย และ :
ทดสอบความเข้าใจ
อ่านคำถามด้านล่าง คิดหาคำตอบ แล้วคลิกสามเหลี่ยมเพื่อดูเฉลย
ใช้สมการสำหรับ QFT ในส่วนก่อนหน้า ยืนยันสถานะฐานฟูเรียสองตัวด้านบน
คำตอบ:
สูตร QFT ทั่วไปคือ:
สำหรับ Qubit เดี่ยว (), , และ ดังนั้นเรามี
ลองดูสองสมการนั้น คุณอาจทราบแล้วถึง Gate ควอนตัมที่สามารถใช้ในการนำการแปลงนี้ไปใช้ นั่นคือ มี Gate ที่แปลงสถานะฐาน computational และ ไปยังสถานะฐานฟูเรียที่เกี่ยวข้อง และ มันคือ Hadamard Gate! สิ่งนี้ยิ่งชัดเจนขึ้นหากเราแนะนำการแสดงเมทริกซ์ของการดำเนินการ QFT:
หากคุณไม่คุ้นเคยกับสัญลักษณ์นี้สำหรับการแสดงตัวดำเนินการควอนตัม ไม่เป็นไร! มันเป็นวิธีแสดงเมทริกซ์ โดยที่ และ ระบุดัชนีคอลัมน์และแถวของเมทริกซ์ตั้งแต่ ถึง และ คือค่าของรายการนั้น ดังนั้น รายการในคอลัมน์ที่ 0 และแถวที่ 2 ตัวอย่างเช่น จะเป็น
ในการแสดงนี้ แต่ละสถานะฐาน computational เกี่ยวข้องกับ basis vector อย่างใดอย่างหนึ่ง:
หากคุณต้องการเรียนรู้เกี่ยวกับการแสดงนี้อย่างลึกซึ้งกว่า ดูบทเรียนของ John Watrous เกี่ยวกับ multiple systems ในหลักสูตร พื้นฐานของข้อมูลควอนตัม
มาลองสร้างเมทริกซ์สำหรับ QFT กัน ใช้สูตรด้านบน เราพบว่า
\text\{QFT\}_4 = \frac\{1\}\{2\} \begin\{pmatrix\} 1 & 1 & 1 & 1 \\ 1 & i & -1 & -i \\ 1 & -1 & 1 & -1 \\ 1 & -i & -1 & i \\ \end\{pmatrix\}
เพื่อนำเมทริกซ์นี้ไปใช้บนคอมพิวเตอร์ควอนตัม เราต้องหาว่าการรวมกันของ Gate ที่นำไปใช้กับ Qubit ใดจะให้การแปลงแบบ unitary ที่ตรงกับเมทริกซ์ด้านบน เราทราบแล้วว่าหนึ่งใน Gate ที่จะต้องใช้คือ Hadamard Gate อีก Gate ที่เราจะต้องใช้คือ controlled-phase gate ซึ่งนำเฟสสัมพัทธ์ ไปใช้กับสถานะของ target qubit ตราบใดที่ control qubit อยู่ในสถานะ ในรูปแบบเมทริกซ์ดูเหมือน:
\text\{CP\}_\alpha = \begin\{pmatrix\} 1 & 0 & 0 & 0 \\ 0 & 1 & 0 & 0 \\ 0 & 0 & 1 & 0 \\ 0 & 0 & 0 & e^\{i\alpha\} \\ \end\{pmatrix\}
เนื่องจากมีเพียงสถานะ เท่านั้นที่ถูกเปลี่ยน จริงๆ แล้วไม่สำคัญว่า Qubit ตัวใดถือว่าเป็น "control" และตัวใดเป็น "target" ผลลัพธ์จะเหมือนกันไม่ว่าทางใด
สุดท้าย เราต้องการ SWAP Gate ด้วย SWAP Gate สลับสถานะของ Qubit สอง Qubit มีลักษณะดังนี้:
\text\{SWAP\}_\alpha = \begin\{pmatrix\} 1 & 0 & 0 & 0 \\ 0 & 0 & 1 & 0 \\ 0 & 1 & 0 & 0 \\ 0 & 0 & 0 & 1 \\ \end\{pmatrix\}
ขั้นตอนในการสร้าง Circuit QFT บน Qubit เป็นแบบวนซ้ำ — คุณนำ QFT ไปใช้กับ Qubit ถึง ก่อน จากนั้นเพิ่ม Gate บางตัวระหว่าง Qubit กับอีก Qubit ที่เหลือ แต่เพื่อนำ QFT ไปใช้ คุณต้องนำ QFT ไปใช้กับ Qubit 2 ถึง ก่อน จากนั้นเพิ่ม Gate บางตัวระหว่าง Qubit 1 กับ Qubit ที่เหลือ ถึง มันเหมือนตุ๊กตาแมทรีออชก้ารัสเซีย: ตุ๊กตาแต่ละตัวเพิ่ม QFT ขึ้นสองเท่าในขนาด โดยมีตุ๊กตาตัวเล็กที่สุดอยู่ตรงกลาง ซึ่งคือ QFT หรือ Hadamard Gate
เพื่อใส่ตุ๊กตาเข้าในตุ๊กตาขนาดใหญ่ถัดไป ดังนั้นเพิ่มขนาดของ QFT เป็นสองเท่า คุณมักทำตามขั้นตอนเดิมเสมอ:
- ก่อนอื่น นำ QFT ไปใช้กับ Qubit ล่างสุด นี่คือ "ตุ๊กตาเล็กกว่า" ของชุดตุ๊กตาแมทรีออชก้ารัสเซียที่คุณจะใส่ไว้ในตุ๊กตาใหญ่ถัดไป
- ใช้ Qubit ถัดขึ้นไปเป็น control และนำ controlled phase gate ไปใช้กับ Qubit ล่าง ตัว ด้วยเฟสต่อสถานะมาตรฐานของ Qubit ที่เหลือ ตัวแต่ละตัว
- ทำ Hadamard บน Qubit บนสุดตัวเดียวกันที่ใช้เป็น control ในเฟส Gate
- ใช้ SWAP Gate เพื่อจัดเรียงลำดับ Qubit ใหม่ เพื่อให้บิตที่มีนัยสำคัญน้อยที่สุด (บน) กลายเป็นบิตที่มีนัยสำคัญมากที่สุด (ล่าง) และทั้งหมดอื่นๆ เลื่อนขึ้นหนึ่งตำแหน่ง
เราใช้ฟังก์ชัน QFTGate จากไลบรารี Circuit ของ Qiskit มาตลอด แต่ตอนนี้ มาดูภายใน QFT Gate บางตัวเพื่อยืนยันขั้นตอนด้านบน เราทำได้ด้วย decompose()
qc = QuantumCircuit(1)
qc.compose(QFTGate(1), inplace=True)
qc.decompose().draw("mpl")
qc = QuantumCircuit(2)
qc.compose(QFTGate(2), inplace=True)
qc.decompose().draw("mpl")
qc = QuantumCircuit(3)
qc.compose(QFTGate(3), inplace=True)
qc.decompose().draw("mpl")
qc = QuantumCircuit(4)
qc.compose(QFTGate(4), inplace=True)
qc.decompose().draw("mpl")
ดังนั้น หวังว่าจาก QFT สี่ตัวแรก คุณจะเริ่มเห็นว่าแต่ละตัวซ้อนอยู่ภายในตัวที่ใหญ่กว่า คุณอาจสังเกตเห็นว่า phase Gate บางตัวไม่ตรงตามที่ระบุในขั้นตอนที่เราอธิบายด้านบน และ SWAP ไม่ปรากฏหลังซับรูทีนแต่ละตัว แต่ปรากฏเฉพาะในตอนท้ายของ QFT เต็มรูปแบบ สิ่งนี้ช่วยประหยัด Gate ที่ไม่จำเป็น ซึ่งจะทำให้ Circuit ใช้เวลานานขึ้นและเกิดข้อผิดพลาดมากขึ้น แทนที่จะนำ SWAP ไปใช้หลังตุ๊กตาที่ซ้อนกันแต่ละตัว Circuit จะติดตามว่าแต่ละสถานะ Qubit ควร อยู่ที่ใดและปรับ Qubit ที่นำ phase Gate ไปใช้ตามนั้น จากนั้น SWAP ชุดสุดท้ายในตอนท้ายจะวางทุกอย่างในตำแหน่งที่เหมาะสม
นำ QFT ไปใช้: การประมาณเฟส
มาดูกันว่า QFT สามารถใช้แก้ปัญหาที่มีประโยชน์ในการประมวลผลเชิงควอนตัมได้อย่างไร การคำนวณ inverse quantum Fourier transform เป็นขั้นตอนที่จำเป็นในอัลกอริทึมที่เรียกว่า Quantum Phase Estimation (QPE) ซึ่งตัวมันเองเป็นซับรูทีนในอัลกอริทึมหลายตัว รวมถึง "มงกุฎแก้ว" ของอัลกอริทึมควอนตัม อัลกอริทึมการแยกตัวประกอบของ Shor
เป้าหมายของ QPE คือการประมาณค่า eigenvalue ของตัวดำเนินการ unitary Unitary operators พบได้ทั่วไปในการประมวลผลเชิงควอนตัม และบ่อยครั้ง การหาค่า eigenvalue ของ eigenvector ที่เกี่ยวข้องเป็นขั้นตอนที่จำเป็นในอัลกอริทึมที่ใหญ่กว่า ขึ้นอยู่กับปัญหา ค่า eigenvalue อาจแสดงพลังงานของ Hamiltonian ในปัญหาการจำลอง สามารถช่วยหาตัวประกอบเฉพาะของจำนวนในอัลกอริทึมของ Shor หรือมีข้อมูลสำคัญอื่นๆ QPE เป็นหนึ่งในซับรูทีนที่สำคัญและใช้กันอย่างแพร่หลายที่สุดในการประมวลผลเชิงควอนตัม
แล้วสิ่งนี้เกี่ยวข้องกับการแปลงฟูเรียเชิงควอนตัมอย่างไร? ดังที่คุณอาจจำได้ ค่า eigenvalue ใดๆ ของตัวดำเนินการ unitary มีขนาด ดังนั้นเราสามารถเขียนค่า eigenvalue แต่ละตัวเป็นจำนวนเชิงซ้อนที่มีขนาดหนึ่ง:
โดยที่ เป็นจำนวนจริงระหว่าง 0 ถึง 1 หากคุณต้องการข้อมูลเพิ่มเติมเกี่ยวกับเมทริกซ์ unitary ดูบทเรียนของ John Watrous ในหัวข้อนี้ ในพื้นฐานของข้อมูลควอนตัม
สังเกตว่า มีความเป็น คาบ ใน สิ่งนี้อาจทำให้คุณนึกถึง QFT แล้ว เนื่องจากเราเห็นว่า QFT มีประโยชน์มากแค่ไหนในการวิเคราะห์ฟังก์ชันคาบ ด้านล่าง เราจะดูอัลกอริทึมและเห็นว่า QFT เข้ามามีส่วนร่วมอย่างไรอย่างแม่นยำ
QPE ทำงานอย่างไร
ก่อนอื่น เราจะเริ่มด้วยอัลกอริทึม QPE ที่ง่ายที่สุด ซึ่งประมาณเฟสได้ถึงหลักเลขฐานสองหนึ่งหลักของความแม่นยำ กล่าวคืออัลกอริทึมนี้สามารถแยกแยะระหว่าง และ ได้ แต่ไม่สามารถทำได้ดีกว่านั้น ต่อไปนี้คือแผนภาพ Circuit:

Qubit ถูกเตรียมในสถานะ โดยที่ Qubit อยู่ในสถานะ และ Qubit ที่เหลืออยู่ในสถานะ ซึ่งเป็น eigenstate ของ หลังจาก Hadamard ตัวแรก สถานะ Qubit กลายเป็น:
Gate ถัดไปคือ "controlled-" gate สิ่งนี้นำการดำเนินการ unitary ไปใช้กับ Qubit ล่างที่อยู่ในสถานะ หาก Qubit 0 อยู่ในสถานะ แต่ไม่ทำอะไรกับ หาก Qubit 0 อยู่ในสถานะ สิ่งนี้แปลง Qubit ไปยังสถานะ:
เกิดสิ่งแปลกประหลาดขึ้น: controlled- gate ใช้เพียง Qubit เป็น control qubit ดังนั้นอาจคิดว่า Gate นี้จะไม่เปลี่ยนสถานะของ Qubit 0 เลย แต่ไม่ว่าจะอย่างไร มันก็เปลี่ยน! แม้ว่าการดำเนินการถูกนำไปใช้กับ Qubit ล่าง ผลโดยรวมของ Gate คือการเปลี่ยนเฟสของ Qubit สิ่งนี้เรียกว่า "phase kickback mechanism" และถูกใช้ในอัลกอริทึมควอนตัมหลายตัว รวมถึง Deutsch-Josza และอัลกอริทึมของ Grover หากคุณต้องการเรียนรู้เพิ่มเติมเกี่ยวกับ phase-kickback mechanism ดูบทเรียนของ John Watrous เกี่ยวกับ Quantum query algorithms ใน Fundamentals of quantum algorithms
หลังจาก phase-kickback เรานำ Hadamard อีกครั้งไปใช้กับ Qubit ซึ่งส่งผลให้ได้สถานะ:
ดังนั้น เมื่อเราวัด Qubit ในตอนท้าย เราจะวัด ด้วยความน่าจะเป็น 100% หาก และเราจะวัด ด้วยความน่าจะเป็น 100% หาก (และหากคอมพิวเตอร์ควอนตัมของเราสมบูรณ์แบบ ไม่มี noise) หาก เป็นค่าอื่นนอกจากนี้ การวัดสุดท้ายจะมีความน่าจะเป็นเท่านั้นและบอกเราได้เพียงไม่มากนัก
QPE ที่มีความแม่นยำมากขึ้น: Qubit มากขึ้น
เราสามารถขยายแนวคิดง่ายๆ นี้ไปยังอัลกอริทึมที่ซับซ้อนกว่าด้วยความแม่นยำตามต้องการ หากแทนที่จะใช้เพียง Qubit เพื่อวัดเฟส เราใช้ Qubit ถึง เราจะสามารถประมาณเฟสด้วยความแม่นยำ บิต มาดูวิธีที่สิ่งนี้ทำงาน:
Circuit QPE ที่มีความแม่นยำมากขึ้นนี้เริ่มต้นเหมือนกับเวอร์ชันบิตเดียว: Hadamard ถูกนำไปใช้กับ Qubit แรก และ Qubit ที่เหลือถูกเตรียมในสถานะ สร้างสถานะ:
ตอนนี้ controlled-unitaries ถูกนำไปใช้ Qubit เป็น control สำหรับ unitary เดิมเช่นเดิม แต่ตอนนี้ Qubit เป็น control สำหรับ unitary ซึ่งก็คือ ที่นำไปใช้สองครั้ง ดังนั้น ค่า eigenvalue ของ คือ โดยทั่วไป Qubit แต่ละตัวตั้งแต่ 0 ถึง จะเป็น control สำหรับ unitary ซึ่งหมายความว่า Qubit แต่ละตัวเหล่านั้นจะประสบ phase kickback ของ ซึ่งส่งผลให้ได้สถานะ:
สิ่งนี้สามารถเขียนใหม่เป็นผลรวมบนสถานะฐาน computational:
ผลรวมดูคุ้นเคยไหม? มันคือ QFT! จำสมการสำหรับ quantum Fourier transform:
ดังนั้น หากเฟส สำหรับจำนวนเต็ม บางตัวระหว่าง และ การนำ inverse QFT ไปใช้กับสถานะนี้จะส่งผลให้ได้สถานะ:
และจาก เราสามารถอนุมาน ได้
หาก ไม่ใช่ จำนวนเต็มคูณ อย่างไรก็ตาม การนำ inverse QFT ไปใช้จะ ประมาณ เท่านั้น ความแม่นยำในการประมาณ จะมีความน่าจะเป็น หมายความว่าเราจะไม่ได้การประมาณที่ดีที่สุดเสมอไป แต่จะค่อนข้างใกล้เคียง และยิ่งคุณใช้ Qubit มากเท่าไหร่ การประมาณที่ดีกว่าที่คุณจะได้ก็ยิ่งมากขึ้น หากต้องการเรียนรู้เกี่ยวกับวิธีการระบุปริมาณการประมาณ นี้ ดูบทเรียนของ John Watrous เกี่ยวกับ Phase estimation and factoring ใน Fundamentals of quantum algorithms
บทสรุป
โมดูลนี้ให้ภาพรวมว่า QFT คืออะไร มันถูกนำไปใช้บนคอมพิวเตอร์ควอนตัมอย่างไร และมีประโยชน์อย่างไร เราให้คุณลิ้มรสประโยชน์ของมันเมื่อเราเห็นว่ามันสามารถใช้ใน quantum phase estimation เพื่อเรียนรู้เกี่ยวกับค่า eigenvalue ของเมทริกซ์ unitary ได้
แนวคิดสำคัญ
- Quantum Fourier Transform เป็นอนาล็อกเชิงควอนตัมของ Discrete Fourier Transform
- QFT เป็นตัวอย่างของการแปลงฐาน
- กระบวนการ Quantum Phase Estimation อาศัย phase-kickback mechanism จาก controlled-unitary operations และ inverse QFT
- QFT และ QPE เป็นซับรูทีนที่ใช้กันอย่างแพร่หลายในอัลกอริทึมควอนตัมหลายตัว
คำถาม
จริง/เท็จ
- จ/ท Quantum Fourier Transform เป็นอนาล็อกเชิงควอนตัมของ classical discrete Fourier transform (DFT)
- จ/ท QFT สามารถนำไปใช้โดยใช้เพียง Hadamard และ CNOT Gate
- จ/ท QFT เป็นส่วนประกอบสำคัญของอัลกอริทึมของ Shor
- จ/ท output ของ Quantum Phase Estimation คือสถานะควอนตัมที่แสดง eigenvector ของตัวดำเนินการ
- จ/ท QPE ต้องการการใช้งาน inverse Quantum Fourier Transform (QFT)
- จ/ท ใน QPE หากเฟส แสดงได้อย่างแม่นยำด้วย บิต อัลกอริทึมให้ผลลัพธ์ที่ถูกต้องด้วยความน่าจะเป็น 1
คำตอบสั้น
- ต้องการ Qubit กี่ตัวในการทำ QFT บนระบบที่มี จุดข้อมูล?
- QFT สามารถใช้กับสถานะที่ไม่ใช่สถานะฐาน computational ได้หรือไม่? ถ้าได้เกิดอะไรขึ้น?
- จำนวน control qubit ที่ใช้ใน QPE ส่งผลต่อความละเอียดของค่าประมาณเฟสที่ได้อย่างไร?
โจทย์
- ใช้การคูณเมทริกซ์เพื่อยืนยันว่าขั้นตอนในอัลกอริทึม QFT ให้ผลลัพธ์เป็นเมทริกซ์ จริง:
(ไม่จำเป็นต้องทำด้วยมือ!)
โจทย์ท้าทาย
- สร้างสถานะสี่ Qubit ที่เป็นซูเปอร์โพสิชันที่เท่ากันของฐาน computational คี่ทั้งหมด: จากนั้นทำ QFT กับสถานะ ผลลัพธ์คือสถานะอะไร? อธิบายว่าทำไมผลลัพธ์ของคุณจึงสมเหตุสมผล โดยใช้ความรู้เรื่องการแปลงฟูเรีย