量子位相推定(QPE)
量子位相推定(Quantum Phase Estimation, QPE)は、量子コンピューティングにおいて非常に重要なアルゴリズムの一つであり、量子状態の固有値(フェーズ)を高精度に推定することを目的としています。QPEは、Shorの素因数分解アルゴリズムなど、多くの量子アルゴリズムの基本構成要素となっています。
QPEの基本原理
量子位相推定は、以下のような手順で行われます:
- 初期状態の準備:量子ビットを初期化します。推定するフェーズを持つ量子状態 ($|\psi\rangle$) と、追加の補助量子ビットを用意します。
- アダマール変換:補助量子ビットにアダマール変換を適用して、重ね合わせ状態を作ります。
$\frac{1}{\sqrt{N}} \sum_{k=0}^{N-1} |k\rangle$ - 制御ユニタリ演算:各補助量子ビットに対して制御ユニタリ演算 (U) を適用します。ここで、($U$) は ($|\psi\rangle$) の固有状態であり、固有値 ($e^{2\pi i \phi}$) を持ちます。
- 逆量子フーリエ変換:補助量子ビットに逆量子フーリエ変換を適用して、位相 ($\phi$) を測定します。
数式の概要
初期状態:
$$
|0\rangle^{\otimes t} |\psi\rangle
$$
アダマール変換後:
$$
\frac{1}{\sqrt{2^t}} \sum_{k=0}^{2^t-1} |k\rangle |\psi\rangle
$$
制御ユニタリ演算後:
$$
\frac{1}{\sqrt{2^t}} \sum_{k=0}^{2^t-1} |k\rangle U^k |\psi\rangle
$$
逆量子フーリエ変換後:
$$
\sum_{y=0}^{2^t-1} \alpha_y |y\rangle |\psi\rangle
$$
ここで、($\alpha_y$) は位相 ($\phi$) に依存する係数です。
Pythonコード
以下は、cuQuantumを使用してQPEを実装するPythonコードです。
import numpy as np
from cuquantum import custatevec
from cuquantum import StateVector
import cupy as cp
# 位相推定に使用する量子ビット数
num_qubits = 3
num_ancilla = 1
# 初期状態を準備
sv = StateVector(num_qubits + num_ancilla)
# アダマールゲートを適用
for i in range(num_ancilla):
sv.apply_operation('H', i)
# 制御ユニタリ演算を適用(ここでは例として制御Zゲートを使用)
for i in range(num_ancilla):
sv.apply_controlled_operation('C', i, num_ancilla)
# 逆量子フーリエ変換を適用
def apply_qft(sv, qubits):
n = len(qubits)
for i in range(n):
sv.apply_operation('H', qubits[i])
for j in range(i + 1, n):
sv.apply_operation('CRZ', qubits[j], qubits[i], theta=np.pi / 2 ** (j - i))
apply_qft(sv, list(range(num_ancilla)))
# 結果を測定
result = sv.measure(list(range(num_ancilla)))
# 位相を推定
phase = result / 2**num_ancilla
print(f'Estimated phase: {phase}')
量子断熱時間発展(QATE)
量子断熱時間発展(QATE)は、量子系を断熱的に時間発展させる方法です。断熱定理に基づいて、初期状態から目標状態までゆっくりとハミルトニアンを変化させることで、初期状態が基底状態であれば、目標状態も基底状態に留まることが保証されます。
数式
ハミルトニアン ( H(t) ) は次のように変化します:
[
H(t) = (1 – \frac{t}{T}) H_0 + \frac{t}{T} H_1
]
ここで、( H_0 ) は初期ハミルトニアン、( H_1 ) は目標ハミルトニアン、( T ) は時間です。
Pythonコード
import numpy as np
import cupy as cp
from cuquantum import StateVector, custatevec
def linear_interpolation(H0, H1, t, T):
return (1 - t/T) * H0 + (t/T) * H1
# パラメータ設定
num_qubits = 3
T = 1.0
timesteps = 100
# 初期ハミルトニアンと目標ハミルトニアンを設定
H0 = np.random.rand(2**num_qubits, 2**num_qubits)
H1 = np.random.rand(2**num_qubits, 2**num_qubits)
# 初期状態を準備
sv = StateVector(num_qubits)
sv.initialize()
# 断熱時間発展をシミュレート
for t in np.linspace(0, T, timesteps):
Ht = linear_interpolation(H0, H1, t, T)
sv.apply_operator(Ht, 0.01) # 小さな時間ステップで適用
# 結果の表示
print("Final state vector:", sv.vector)
量子振幅推定(QAE)
元々FTQC用のアルゴリズム