AWSのAmazon Braketで量子位相推定(Quantum Phase Estimation)
これまでの記事では以下の内容を学びました:
今回はそれらを踏まえて、量子位相推定について解説します。
Amazon Braket学習コース
この記事で登場する、量子ゲートや量子回路など、量子コンピュータの基本的な知識や、Amazon Braketの使い方についてはこちらのコースで効率的に学べます。
量子コンピュータやAWSの知識が無い方でも学び始められ、最終的には量子機械学習についても学べます。 こちらも利用し、量子技術のスキルを身につけましょう!
Qiskit試験対策問題集
qiskitについての資格試験をIBMが提供しています。
この資格を取得することでqiskitや量子プログラミングに関する知識を証明することが可能です。 こちらの資格取得を目指される方のため、Udemyというサイト上にて日本語版、英語版で問題集を作りました!解説もなるべくわかりやすく作成いたしましたので、是非是非ご活用ください。
英語版問題集
日本語版問題集
Amazon Braket SDKで量子位相推定
これまでの記事で、逆量子フーリエ変換により、位相を含めた量子状態を判別できることを学びました。
この性質をうまく利用して量子アルゴリズムを設計できないでしょうか?
実は量子位相推定アルゴリズムではこの性質が活用されています。
このアルゴリズムはユニタリ演算子$ U $とその固有状態$|\psi\rangle$が与えられているとき、
$\phi$を$\phi \approx 0.\phi_1\phi_2\ldots\phi_n = \sum_{k=1}^{n} \frac{\phi_k}{2^k}$の形で推定します。ただしnは読み出しレジスタの量子ビット数です。
$$
U |\psi\rangle = e^{2\pi i \phi} |\psi\rangle \quad (\phi \in [0, 1))
$$
このアルゴリズムの流れは以下の通りです。
$\phi$の情報を持った量子フーリエ変換後の状態をうまく作り出す
$\downarrow$
出来上がった状態を逆量子フーリエ変換することで$\phi$の情報を取り出す
理論の流れを見ていきましょう。まずは$\phi$の情報を持った量子フーリエ変換後の状態をうまく作り出すことを考えていきます。
ある$n+1$量子ビットの初期状態はいつもの通り以下となります。
$$
|0\rangle^{\otimes n+1}
$$
固有状態を作らないと$\phi$の値も登場できないので末尾のビットを$U$の固有状態$|\psi\rangle$に変換しましょう。
$$
|0\rangle^{\otimes n} \otimes |\psi\rangle
$$
今回の目的は$\phi$の情報を持った量子フーリエ変換後の状態を作り出すことにあります。
量子フーリエ変換$\mathcal{F}$の定義を思い出すと。
$$
\mathcal{F} \ket{j} = \frac{1}{\sqrt{2^n}} \sum_{k=0}^{2^n-1} e^{2\pi i jk / 2^n} \ket{k}
$$
$|0\rangle^{\otimes n}$のビット列は今回読み出しレジスタと呼びますが、こちらにHゲートを適用すれば以下の通り少し量子フーリエ変換後の形に近づきます。
$$
\left( H^{\otimes n} |0\rangle^{\otimes n} \right) \otimes |\psi\rangle = \frac{1}{\sqrt{2^n}} \sum_{k=0}^{2^n - 1} |k\rangle \otimes |\psi\rangle
$$
量子フーリエ変換の式と現在の状態を見比べると、量子フーリエ変換の式では$|k\rangle$に、$k$に依存した位相因子がかけられていることがわかります。これは$|k\rangle$を制御ビットとした制御$U$ゲート$\mathrm{C}\text{-}U$を適用することで得られます。
$$
\begin{align}
\mathrm{C}\text{-}U \left( \frac{1}{\sqrt{2^n}} \sum_{k=0}^{2^n - 1} |k\rangle \otimes |\psi\rangle \right) &= \frac{1}{\sqrt{2^n}} \sum_{k=0}^{2^n - 1} |k\rangle \otimes U^k |\psi\rangle \\
&= \frac{1}{\sqrt{2^n}} \sum_{k=0}^{2^n - 1} e^{2\pi i \phi k} |k\rangle \otimes |\psi\rangle
\end{align}
\tag{1}
$$
かなり量子フーリエ変換の式に近づきました!ここで逆量子フーリエ変換$\mathcal{F}^{-1}$の定義についても思い出してみましょう。
$$
\mathcal{F}^{-1} \left( \frac{1}{\sqrt{2^n}} \sum_{k=0}^{2^n-1} e^{2\pi i jk / 2^n} \ket{k} \right) = \ket{j}
$$
逆量子フーリエ変換を適用することでかなりシンプルになりますね。同様に今回導いた式の読み出しレジスタの部分を逆量子フーリエ変換すればシンプルな形となるはずです。式で表すと以下の通りとなります。
$$
\left( \mathcal{F}^{-1} \left( \frac{1}{\sqrt{2^n}} \sum_{k=0}^{2^n - 1} e^{2\pi i \phi k} |k\rangle \right) \right) \otimes |\psi\rangle = |2^n\phi\rangle \otimes |\psi\rangle
$$
ここまで変形した後に、読み出しレジスタを観測すれば$|2^n\phi\rangle$の形で$\phi$が観測できるはずです!
ただし、量子位相推定では$\phi$が2進数でちょうど$n$量子ビットで表せない場合は、近似値に重なった状態になることに注意が必要です。
Amazon Braket SDKでの実装
では得られた理論を実装しましょう。今回は対象のユニタリ行列を$T$ゲート、固有状態を$\ket{1}$として実装してみましょう。 つまり量子位相推定により$\ket{1}$に対する$T$ゲートの固有値を求めます。暗算でもこの固有値の結果は算出できるかもしれませんが、あえて分からないふりをして進めていきましょう。 まずは必要となる関数をimportします。
from braket.circuits import Circuit
from braket.devices import LocalSimulator
from braket.experimental.algorithms.quantum_fourier_transform import (
quantum_fourier_transform as qft_module
)
今回読み出しレジスタの量子ビット数は3とします。
n_readout_qubits = 3
circ = Circuit()
先ほどの理論によると、読み出しレジスタの量子ビットにはHゲートを書けるのでした。
for qubit in list(range(n_readout_qubits)):
circ.h(qubit)
また、末尾のビットとなる4量子ビット目は固有状態$\ket{1}$に変換しておきます。
circ.x(n_readout_qubits)
続いて制御$T$ゲートを適用します。(1)での式の通り、量子ビットに依存して$2^{n-1}$回だけ制御$T$ゲートを適用しなければいけないことに注意しましょう。
for ctl_bit in list(range(n_readout_qubits)):
for i in list(range(2**(ctl_bit))):
circ.cphaseshift(ctl_bit, n_readout_qubits, np.pi/4)
この後に逆量子フーリエ変換を実行するのですが、その前に少し確認です。Amazon Braket Algorithm Libraryの3量子ビットの逆量子フーリエ変換は通常通り定義すると以下のような回路になります。
T : │ 0 │ 1 │ 2 │ 3 │ 4 │ 5 │
┌──────────────┐ ┌──────────────┐ ┌───┐
q0 : ────x──────────────────────────────────┤ PHASE(-0.79) ├─┤ PHASE(-1.57) ├─┤ H ├─
│ └──────┬───────┘ └──────┬───────┘ └───┘
│ ┌──────────────┐ ┌───┐ │ │
q1 : ────┼───────────┤ PHASE(-1.57) ├─┤ H ├────────┼────────────────●───────────────
│ └──────┬───────┘ └───┘ │
│ ┌───┐ │ │
q2 : ────x─────┤ H ├────────●──────────────────────●────────────────────────────────
└───┘
T : │ 0 │ 1 │ 2 │ 3 │ 4 │ 5 │
この変換の順序に合わせて読み出しレジスタの状態を用意する必要があるため、SWAPゲートを適用します。
circ.swap(0,n_readout_qubits - 1)
量子フーリエ変換、逆量子フーリエ変換を実装する場合は適用の順序に注意する必要があります。今回のケースでは各量子ビットに適用された制御$T$ゲートの規則を考慮して逆量子フーリエ変換の回路を接続することで想定通りの結果が得られます。
ここまでの回路をprintすると以下の通りとなります。
T : │ 0 │ 1 │ 2 │ 3 │ 4 │ 5 │ 6 │ 7 │ 8 │
┌───┐
q0 : ─┤ H ├────────●───────────────────────────────────────────────────────────────────────────────────────────────────────────x─────
└───┘ │ │
┌───┐ │ │
q1 : ─┤ H ├────────┼───────────────●───────────────●───────────────────────────────────────────────────────────────────────────┼─────
└───┘ │ │ │ │
┌───┐ │ │ │ │
q2 : ─┤ H ├────────┼───────────────┼───────────────┼───────────────●───────────────●───────────────●───────────────●───────────x─────
└───┘ │ │ │ │ │ │ │
┌───┐ ┌──────┴──────┐ ┌──────┴──────┐ ┌──────┴──────┐ ┌──────┴──────┐ ┌──────┴──────┐ ┌──────┴──────┐ ┌──────┴──────┐
q3 : ─┤ X ├─┤ PHASE(0.79) ├─┤ PHASE(0.79) ├─┤ PHASE(0.79) ├─┤ PHASE(0.79) ├─┤ PHASE(0.79) ├─┤ PHASE(0.79) ├─┤ PHASE(0.79) ├──────────
└───┘ └─────────────┘ └─────────────┘ └─────────────┘ └─────────────┘ └─────────────┘ └─────────────┘ └─────────────┘
T : │ 0 │ 1 │ 2 │ 3 │ 4 │ 5 │ 6 │ 7 │ 8 │
ではこれに既に描画してある逆量子フーリエ変換の回路を追加し、測定を行いましょう。
circ.iqft(range(n_readout_qubits))
device = LocalSimulator()
result = device.run(circ, shots=1000).result()
counts = result.measurement_counts
print(counts)
# Output
# Counter({'0011': 1000})
読み出しレジスタの部分のみを読み出すと001となります。今回読み出しレジスタの量子ビットの数は$3$であったため、$\phi = 1/2^3 = 1/8$がこの回路により推定されたことになります。
読み出しの際も、制御$T$ゲートと、逆量子フーリエ変換の規則を考慮して結果を読み取る必要があります。今回のケースでの結果は2進数の0.100でなく、0.001が対応しています。
つまり$T$ゲートの$\ket{1}$に対する固有値は$e^{2\pi i \phi} = e^{\pi i /4}$と推定されたことになります。確かに以下の理論式と矛盾が無いです。
無事に量子位相推定を実行できました!
$$ T |1\rangle = \begin{bmatrix} 1 & 0 \\ 0 & e^{i\pi/4} \end{bmatrix} \begin{bmatrix} 0 \\ 1 \end{bmatrix} = e^{i\pi/4} |1\rangle $$
Amazon Braket学習コース
この記事で登場する、量子ゲートや量子回路など、量子コンピュータの基本的な知識や、Amazon Braketの使い方についてはこちらのコースで効率的に学べます。
量子コンピュータやAWSの知識が無い方でも学び始められ、最終的には量子機械学習についても学べます。 こちらも利用し、量子技術のスキルを身につけましょう!
Qiskit試験対策問題集
qiskitについての資格試験をIBMが提供しています。
この資格を取得することでqiskitや量子プログラミングに関する知識を証明することが可能です。 こちらの資格取得を目指される方のため、Udemyというサイト上にて日本語版、英語版で問題集を作りました!解説もなるべくわかりやすく作成いたしましたので、是非是非ご活用ください。