量子計算導論
量子演算法:程式碼與數學實現
作者
量子演算法研究社
日期:2025 年 9 月 14 日
摘要
量子計算作為一門新興的計算範式,利用量子力學的疊加、糾纏和干涉等特性,提供超越經典計算的潛在優勢。本文系統探討了量子演算法的核心數學基礎與程式碼實現,包括量子位元狀態表示、基本量子閘、Grover 搜尋演算法、Shor 分解演算法、量子疊加與糾纏演示、變分量子演算法 (VQE)、量子傅立葉轉換 (QFT),並透過複雜度分析證明量子優勢。所有數學表達採用 Unicode 平文符號表示,並以 Qiskit 框架提供 Python 程式碼實現。透過這些實例,我們展示了量子演算法如何在搜尋、分解和優化問題上實現指數級加速,為未來量子計算應用奠定基礎。
關鍵詞:量子計算、Grover 演算法、Shor 演算法、變分量子演算法、量子傅立葉轉換
引言
自 Richard Feynman 於 1982 年提出量子計算概念以來,量子演算法已成為量子資訊科學的核心領域。經典計算依賴比特的確定性狀態,而量子計算利用量子位元 (qubit) 的疊加與糾纏,能夠並行處理龐大計算空間,從而解決某些問題的複雜度瓶頸。例如,Grover 演算法將無結構搜尋的複雜度從 O(N) 降至 O(√N),Shor 演算法則威脅到當前 RSA 加密的安全性。
本文結構如下:第二節介紹量子基礎數學表示;第三節詳述 Grover 演算法的數學與實現;第四節探討 Shor 演算法的核心;第五節演示量子疊加與糾纏;第六節介紹變分量子演算法;第七節呈現量子傅立葉轉換;第八節透過數學證明量子優勢;最後結論總結並展望未來。所有程式碼基於 Qiskit 框架,數學式使用 Unicode 平文符號表示,便於閱讀與複製。
1. 量子基礎數學表示
1.1 量子位元狀態
量子位元 (qubit) 的狀態可表示為線性組合:
|ψ⟩ = α|0⟩ + β|1⟩
其中 |α|² + |β|² = 1,α 和 β 為複數振幅,滿足歸一化條件。這反映了量子疊加原理:qubit 可同時處於 |0⟩ 和 |1⟩ 的疊加狀態,直至測量崩潰為經典比特。
1.2 量子閘操作
量子閘是量子電路的構建塊,類似經典邏輯閘,但為酉變換 (unitary transformation)。
Hadamard 閘:
H = 1/√2 [1 1]
[1 -1]
其作用為:
H|0⟩ = 1/√2 (|0⟩ + |1⟩)
H|1⟩ = 1/√2 (|0⟩ - |1⟩)
Hadamard 閘用於創建均勻疊加態。
Pauli-X 閘 (NOT):
X = [0 1]
[1 0]
X|0⟩ = |1⟩
X|1⟩ = |0⟩
此閘實現量子位元的翻轉,類似經典 NOT 閘。
這些基礎操作構成後續演算法的基石。
2. Grover 演算法實現
2.1 數學原理
Grover 演算法解決無結構資料庫搜尋問題:給定 N 個項目,找到特定目標 w。經典方法需 O(N) 次查詢,而 Grover 僅需 O(√N) 次。
Oracle 函數:
Uf |x⟩ |y⟩ = |x⟩ |y ⊕ f(x)⟩
其中 f(x) = 1 若 x = w,否則 = 0。此函數標記目標狀態為相位翻轉。
擴散操作符:
D = 2 |s⟩ ⟨s| - I
其中 |s⟩ = 1/√N ∑ |x⟩,為均勻疊加態。D 放大目標振幅。
演算法迭代 oracle 和擴散操作,理想迭代次數約 π/4 √N。
2.2 Python 實現(使用 Qiskit)
以下為 Grover 演算法的 Qiskit 實現:
from qiskit import QuantumCircuit, QuantumRegister, ClassicalRegister
from qiskit import execute, Aer
import numpy as np
def grovers_algorithm(n_qubits, target_item):
"""
Grover演算法實現
n_qubits: 量子位元數
target_item: 目標項目的二進制表示
"""
# 創建量子電路
qreg = QuantumRegister(n_qubits, 'q')
creg = ClassicalRegister(n_qubits, 'c')
circuit = QuantumCircuit(qreg, creg)
# 步驟1: 初始化 - 創建均勻疊加態
for i in range(n_qubits):
circuit.h(qreg[i])
# 計算最佳迭代次數
N = 2**n_qubits
optimal_iterations = int(np.pi * np.sqrt(N) / 4)
# 步驟2: Grover迭代
for _ in range(optimal_iterations):
# Oracle: 標記目標項目
oracle_circuit(circuit, qreg, target_item)
# 擴散操作符
diffusion_operator(circuit, qreg)
# 測量
circuit.measure(qreg, creg)
return circuit
def oracle_circuit(circuit, qreg, target):
"""Oracle函數實現"""
n = len(qreg)
# 根據目標項目添加相位翻轉
for i, bit in enumerate(target):
if bit == '0':
circuit.x(qreg[i])
# 多控制Z閘
if n > 1:
circuit.h(qreg[n-1])
circuit.mcx(qreg[:-1], qreg[n-1])
circuit.h(qreg[n-1])
else:
circuit.z(qreg[0])
# 恢復狀態
for i, bit in enumerate(target):
if bit == '0':
circuit.x(qreg[i])
def diffusion_operator(circuit, qreg):
"""擴散操作符實現"""
n = len(qreg)
# H^⊗n
for i in range(n):
circuit.h(qreg[i])
# X^⊗n
for i in range(n):
circuit.x(qreg[i])
# 多控制Z閘
if n > 1:
circuit.h(qreg[n-1])
circuit.mcx(qreg[:-1], qreg[n-1])
circuit.h(qreg[n-1])
else:
circuit.z(qreg[0])
# X^⊗n
for i in range(n):
circuit.x(qreg[i])
# H^⊗n
for i in range(n):
circuit.h(qreg[i])
# 使用範例
target = "101" # 尋找項目 5 (101 in binary)
circuit = grovers_algorithm(3, target)
print(f"尋找目標: {target}")
print(f"電路深度: {circuit.depth()}")
此實現模擬 3 量子位元系統,目標為二進制 101。電路深度反映計算複雜度。
3. Shor 演算法核心
3.1 數學基礎
Shor 演算法解決整數分解問題:給定 N = p × q,找到非平凡因子 p 和 q。此問題在經典計算中為 NP 中間問題。
關鍵步驟:
- 選擇隨機 a (1 < a < N, gcd(a, N) = 1)。
- 找到 f(x) = a^x mod N 的週期 r。
- 若 r 偶數且 a^(r/2) ≢ -1 (mod N),則 gcd(a^(r/2) - 1, N) 和 gcd(a^(r/2) + 1, N) 為 N 的因子。
週期尋找依賴量子相位估計 (QPE)。
3.2 量子相位估計核心
以下為簡化實現:
import numpy as np
from qiskit import QuantumCircuit, QuantumRegister
def quantum_period_finding(N, a, n_counting_qubits):
"""
量子週期尋找演算法
N: 要分解的數
a: 隨機選擇的底數
n_counting_qubits: 計數暫存器的量子位元數
"""
n_work_qubits = int(np.ceil(np.log2(N)))
# 創建量子暫存器
counting_qreg = QuantumRegister(n_counting_qubits, 'counting')
work_qreg = QuantumRegister(n_work_qubits, 'work')
circuit = QuantumCircuit(counting_qreg, work_qreg)
# 初始化工作暫存器為 |1⟩
circuit.x(work_qreg[0])
# 創建計數暫存器的均勻疊加
for i in range(n_counting_qubits):
circuit.h(counting_qreg[i])
# 控制模指數運算
repetitions = 1
for counting_qubit in range(n_counting_qubits):
controlled_modular_exponentiation(
circuit, counting_qreg[counting_qubit], work_qreg,
a, repetitions, N
)
repetitions *= 2
# 逆量子傅立葉轉換
inverse_qft(circuit, counting_qreg)
return circuit
def controlled_modular_exponentiation(circuit, control_qubit, target_qubits, a, power, N):
"""控制模指數運算:|x⟩ → |a^power * x mod N⟩"""
# 這是一個簡化的實現
# 實際實現需要高效的模乘法量子電路
value = pow(a, power, N)
# 實現 |x⟩ → |value * x mod N⟩ 的變換
# (詳細實現需要複雜的模運算電路)
pass
def inverse_qft(circuit, qreg):
"""逆量子傅立葉轉換"""
n = len(qreg)
for i in range(n // 2):
circuit.swap(qreg[i], qreg[n - 1 - i])
for i in range(n):
circuit.h(qreg[i])
for j in range(i + 1, n):
circuit.cp(-np.pi / (2**(j - i)), qreg[j], qreg[i])
此電路使用計數暫存器估計相位,進而提取週期。模指數運算為瓶頸,需優化模乘法電路。
4. 量子疊加和糾纏演示
4.1 疊加態創建
疊加是量子計算的核心。以下創建兩量子位元均勻疊加:
def create_superposition():
"""創建兩量子位元疊加態"""
circuit = QuantumCircuit(2)
# |00⟩ → 1/2(|00⟩ + |01⟩ + |10⟩ + |11⟩)
circuit.h(0)
circuit.h(1)
return circuit
# 數學表示:
# |ψ⟩ = H ⊗ H |00⟩
# = 1/2(|0⟩ + |1⟩) ⊗ (|0⟩ + |1⟩)
# = 1/2(|00⟩ + |01⟩ + |10⟩ + |11⟩)
測量時,各狀態出現機率為 1/4。
4.2 Bell 態(最大糾纏態)
糾纏狀態展現非局域性:
def create_bell_state():
"""創建Bell態 |Φ⁺⟩"""
circuit = QuantumCircuit(2)
# |00⟩ → |Φ⁺⟩ = 1/√2(|00⟩ + |11⟩)
circuit.h(0) # 創建疊加
circuit.cx(0, 1) # 創建糾纏
return circuit
# 數學表示:
# |Φ⁺⟩ = CNOT · (H ⊗ I)|00⟩
# = CNOT · 1/√2(|00⟩ + |10⟩)
# = 1/√2(|00⟩ + |11⟩)
Bell 態測量結果相關:若一粒子為 |0⟩,另一必為 |0⟩。
5. 變分量子演算法(VQE)
5.1 數學框架
VQE 適用 NISQ (Noisy Intermediate-Scale Quantum) 時代,求解哈密頓量 H 的基態能量:
E₀ = min_θ ⟨ψ(θ)| H |ψ(θ)⟩
其中 |ψ(θ)⟩ 為參數化試探波函數,經典優化器調整 θ。
5.2 Python 實現
from scipy.optimize import minimize
import numpy as np
def vqe_algorithm(hamiltonian, ansatz_circuit, initial_params):
"""
變分量子本徵求解器
hamiltonian: 哈密頓量矩陣
ansatz_circuit: 參數化量子電路
initial_params: 初始參數
"""
def cost_function(params):
# 創建參數化電路
circuit = ansatz_circuit(params)
# 計算期望值 ⟨ψ(θ)|H|ψ(θ)⟩
expectation_value = compute_expectation(circuit, hamiltonian)
return expectation_value
# 古典優化
result = minimize(cost_function, initial_params, method='COBYLA')
return result
def ansatz_circuit(params):
"""參數化量子電路"""
circuit = QuantumCircuit(2)
# RY旋轉
circuit.ry(params[0], 0)
circuit.ry(params[1], 1)
# 糾纏層
circuit.cx(0, 1)
# 更多參數化層
circuit.ry(params[2], 0)
circuit.ry(params[3], 1)
return circuit
def compute_expectation(circuit, hamiltonian):
"""計算期望值"""
# 執行電路並計算 ⟨H⟩
# (實際實現需要量子後端)
pass
VQE 結合量子電路與經典優化,適用分子模擬等化學問題。
6. 量子傅立葉轉換
6.1 數學定義
QFT 是 Shor 演算法的關鍵子程序:
QFT |x⟩ = 1/√N ∑_{k=0}^{N-1} e^{2πi x k / N} |k⟩
此轉換將時域轉為頻域,高效提取週期資訊。
6.2 電路實現
def quantum_fourier_transform(circuit, qreg):
"""量子傅立葉轉換實現"""
n = len(qreg)
for i in range(n):
# Hadamard閘
circuit.h(qreg[i])
# 控制相位閘
for j in range(i + 1, n):
angle = np.pi / (2**(j - i))
circuit.cp(angle, qreg[j], qreg[i])
# 反轉量子位元順序
for i in range(n // 2):
circuit.swap(qreg[i], qreg[n - 1 - i])
# 使用範例
n_qubits = 3
qreg = QuantumRegister(n_qubits)
circuit = QuantumCircuit(qreg)
# 準備初始狀態
circuit.x(qreg[0]) # |001⟩
# 應用QFT
quantum_fourier_transform(circuit, qreg)
QFT 電路深度為 O(n²),但提供 O(n log n) 加速相對於經典 FFT。
7. 量子優勢的數學證明
7.1 Grover 演算法複雜度分析
經典搜尋:O(N) 查詢
Grover 演算法:O(√N) 查詢
對於 N = 2²⁰ 項目:
- 經典:~1,048,576 次查詢
- 量子:~1,024 次查詢
加速比:√N ≈ 1024 倍
此二次方加速在無結構問題中通用。
7.2 Shor 演算法複雜度
經典分解(最佳已知):O(exp((log N)^{1/3} (log log N)^{2/3}))
Shor 演算法:O((log N)³)
對於 1024 位元 RSA:
- 經典:~10²⁹ 年(使用當前最佳演算法)
- 量子:數小時(理論上,需要容錯量子計算機)
Shor 提供指數加速,顛覆公鑰加密。
結論
本文綜述了量子演算法的數學基礎與 Qiskit 實現,從基礎量子狀態到先進應用如 Grover 和 Shor,展示了量子計算的潛力。儘管 NISQ 時代面臨噪聲挑戰,VQE 等混合方法已展現實用價值。未來,隨著量子硬體進展,這些演算法將推動化學、優化和加密領域的革命。研究者可基於本文程式碼進一步實驗,探索量子優勢的邊界。
參考文獻
[1] M. A. Nielsen and I. L. Chuang, Quantum Computation and Quantum Information, Cambridge University Press, 2010.
[2] L. K. Grover, “A fast quantum mechanical algorithm for database search,” Proceedings of the Twenty-Eighth Annual ACM Symposium on Theory of Computing, 1996.
[3] P. W. Shor, “Algorithms for quantum computation: discrete logarithms and factoring,” Proceedings of the 35th Annual Symposium on Foundations of Computer Science, 1994.
[4] Qiskit Development Team, “Qiskit: An open-source framework for quantum computing,” 2025.
。
留言
張貼留言