量子計算導論

量子演算法:程式碼與數學實現

作者

量子演算法研究社

日期: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 中間問題。

關鍵步驟:

  1. 選擇隨機 a (1 < a < N, gcd(a, N) = 1)。
  2. 找到 f(x) = a^x mod N 的週期 r。
  3. 若 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.

留言

這個網誌中的熱門文章

Time as a Negentropic Force: Spacetime Interactions and the Cosmic Creative Principle

量子之影:台灣QNF-3量子導航系統的崛起與其地緣政治影響

政治制度的熵減分析:時間維度下的制度比較研究