科学しよう

量子計算のプログラミングの解説をメインに、データサイエンス・機械学習について勉強したことをご紹介します

MENU

アダマールテスト

前回までで測定・基底・期待値・密度演算子など基本的な理解が進んだので、アルゴリズムの理解をしたいと思います。

今回はアダマールテスト。
後々に量子位相推定やHHLアルゴリズムなど種々のアルゴリズムに発展する基本的なアルゴリズムのようなのでやってみます。

教科書ではサラッと書かれていますが、ちゃんと計算しようとすると密度演算子の知識が必要です。

対象とする読者

  • 量子プログラミングに興味を持ち始めたばかりのエンジニア
  • 量子計算に興味を持ち始めたばかりの高校生・大学生 など

前提とする知識

  • 簡単な論理演算(AND, OR, NOT)が分かること
  • 基本的な量子ゲート(X, CX, CCX)が分かること
  • ブラケットでの計算がわかること
  • 密度演算子がわかること

バージョン情報

目次

アダマールテストとは

量子回路

図1. アダマールテストの量子回路

アダマールテストとは上図のように第一量子ビットは初期状態 | 0 \rangleで、それ以外の任意の数の量子ビットは任意の状態 | \psi
 \rangleを初期状態としています。
そして第一量子ビットアダマールゲートをかけた後、第一量子ビットを制御ビットとしそれ以外の量子ビットに対して制御ユニタリーゲート(controlled -  U)をかけます。
最後に第一量子ビットにもう一度アダマールゲートをかけて第一量子ビットを測定するというものです。

用途

この回路を使うとユニタリー行列 U固有値がわかります。

ただ、後で詳細説明しますが、量子回路に使われるユニタリー行列の固有値 \pm 1なので、あえて量子コンピュータを使って求めるものではないです。 (私の私見のため、正しくないかもしれません。詳しい方がいたら補足お願いします。) アダマールテストを利用したスワップテストや量子位相推定アルゴリズムのことを考慮すると、むしろここで大事なのは「位相キックバック」と呼ばれる第一量子ビットの位相にユニタリー U固有値に相当する位相が乗る現象によって、第一量子ビットの確率分布がその分変化するということが重要と思います。

代数的に解いてみる

準備:ユニタリー行列とその固有値

ユニタリー行列とは

まず、ユニタリー行列は元々線形代数の言葉なので量子力学特有の名称・行列ではないです。

ユニタリ行列 - Wikipedia

によると、自身と自身のエルミート共役(転置して複素共役を取ったもの)の積が単位行列になるものです。

\displaystyle{
\hat{U} \hat{U}^{\dagger} = \hat{U}^{\dagger} \hat{U} = \hat{I}
}

数学的な定義だと僕も実はよくわからないのですが、物理学的には量子力学的に有効な操作(演算、つまり量子ビットをBloch球上で回転させること)であれば全てユニタリーです。 アダマールゲートやXゲートなどを行列で \hat{H}, \hat{X}と表すなら、それらの逆回転がエルミート共役 \hat{H}^{\dagger}, \hat{X}^{\dagger}です。

もう少し細かく話すと、量子状態の時間発展は以下のシュレディンガー方程式で記述されます。

\displaystyle{
i \hbar \frac{d}{dt} | \psi (t) \rangle = \hat{H} | \psi (t) \rangle
}

この式の \hat{H}ハミルトニアンを示します。 この式の解は初期時刻 t_0を用いて一般的に下記の形式で表されます。

\displaystyle{
| \psi (t) \rangle = \exp \left \{ \frac{1}{i \hbar} \hat{H}(t - t_0) \right \} | \psi (t_0) \rangle
}

この指数関数部分がユニタリー行列で表されます。 ハミルトニアンで記述される量子系はエネルギー保存している(だからハミルトニアンで書いているのですけど)ので、時間を巻き戻したら元に戻りますよねって話です。 物理学の言葉で「時間反転対称性」と言います。 巻き戻したら

\displaystyle{
\exp \left \{ \frac{1}{i \hbar} \hat{H} (t - t_0) \right \} \longrightarrow \exp \left \{ \frac{-1}{i \hbar} \hat{H} (t - t_0) \right \}
}

となるだけで、これは

\displaystyle{
\exp i \Delta \theta \longrightarrow \exp ( - i \Delta \theta)
}

の変換なので、逆回転ということです。

時間反転について、ここでは複素共役しか言及してませんが、転置についてはハミルトニアンがエルミート行列(自身と自身のエルミート共役が同一)であることから言及しなくて良くなっています。

\displaystyle{
\exp (i \hat{H}) = \sum_{k=0}^{\infty}{\frac{1}{k!}(i \hat{H})^k} \equiv \hat{U}
}

とすると


\begin{aligned}
\hat{U}^{\dagger} &= \sum_{k=0}^{\infty}{\frac{1}{k!}(-i \hat{H}^{\dagger})^k} \\
&= \sum_{k=0}^{\infty}{\frac{1}{k!}(-i \hat{H})^k} \\
&= \exp (-i \hat{H})
\end{aligned}

ユニタリー行列の固有値

これは数学の話なので、以下の記事での解説に譲ります。

risalc.info

eman-physics.net

エッセンスとして重要なことは以下です。

これらのことから、ユニタリ行列をその固有ベクトルである量子状態にかけた場合以下になります。

\displaystyle{
\hat{U} | \psi \rangle = e^{i \theta} | \psi \rangle
}

この固有値 e^{i \lambda}の位相 \lambdaが第一量子ビットの確率分布から分かるというのがアダマールテストです。

部分トレース

今回は第一量子ビットとそれ以外の量子ビットがあり、第一量子ビットだけ測定するというスキームですので、このような場合は部分トレースをとる考え方が必要になります。 whyitsso.net

部分トレースについては前回の記事でも解説しています。

sakumatcho.hatenablog.com

入力状態がユニタリー行列の固有値の場合

入力状態 | \psi \rangleがユニタリ行列 \hat{U}固有ベクトルだと仮定します。
すると \hat{U} | \psi \rangle = e^{i \lambda} | \psi \rangleが成り立ちますので、これを使って式変形していきます。


\begin{aligned}
\frac{1}{\sqrt{2}} \left( | 0 \rangle + | 1 \rangle \right) \otimes | \psi \rangle &\overset{\text{Ctrl-}U}\longrightarrow \frac{1}{\sqrt{2}} \left( | 0 \rangle \otimes | \psi \rangle + | 1 \rangle \otimes  \hat{U} | \psi \rangle \right) \\

&= \frac{1}{\sqrt{2}} \left( | 0 \rangle \otimes | \psi \rangle + e^{i \lambda }| 1 \rangle \otimes  | \psi \rangle \right) \\

&= \frac{1}{\sqrt{2}} \left( | 0 \rangle + e^{i \lambda } | 1 \rangle \right) \otimes | \psi \rangle \\
\end{aligned}

この後、第一量子ビットアダマールゲートをかけて整理すると以下になります。

\displaystyle{
\frac{1}{\sqrt{2}} \left\{ \frac{1}{\sqrt{2}} \left( | 0 \rangle + | 1 \rangle \right) + e^{i \lambda } \frac{1}{\sqrt{2}} \left( | 0 \rangle - | 1 \rangle \right) \right\}
=
\frac{1 + e^{i \lambda}}{2} | 0 \rangle + \frac{1 - e^{i \lambda}}{2} | 1 \rangle
}

従って、第一量子ビットを測定してその結果が0又は1となる確率はそれぞれ以下になります。


\begin{aligned}
&p_0 = \left| \frac{1 + e^{i \lambda}}{2} \right|^2 = \frac{1 + \cos{\lambda}}{2} \\
&p_1 = \left| \frac{1 - e^{i \lambda}}{2} \right|^2 = \frac{1 - \cos{\lambda}}{2} \\
\end{aligned}

この式と実際に測定した結果を照らし合わせて \lambdaを推定します、というか実際には既知のユニタリーを実行するので、ユニタリーを利用してこの分布をコントロールします。

入力状態がユニタリー行列の固有値ではない場合

入力状態 | \psi \rangleがユニタリー行列 \hat{U}の固有状態では無い場合も

\displaystyle{
\frac{1}{\sqrt{2}} \left( | 0 \rangle + | 1 \rangle \right) \otimes | \psi \rangle \overset{\text{Ctrl-}U}\longrightarrow \frac{1}{\sqrt{2}} \left( | 0 \rangle \otimes | \psi \rangle + | 1 \rangle \otimes  \hat{U} | \psi \rangle \right)
}

ここまでは固有状態である場合と同じですが、この後アダマールゲートを第一量子ビットにかけると状況がちょっと変わります。

\displaystyle{
\frac{1}{\sqrt{2}} \left\{ \left( | 0 \rangle + | 1 \rangle \right) \otimes | \psi \rangle + \left( | 0 \rangle - | 1 \rangle \right) \otimes  \hat{U} | \psi \rangle \right\}
= \frac{1}{2} \left\{ | 0 \rangle \otimes \left( | \psi \rangle + \hat{U} | \psi \rangle \right) + | 1 \rangle \otimes \left( | \psi \rangle - \hat{U} | \psi \rangle \right) \right\}
}

この後、第一量子ビットだけを測定したときに第一量子ビット | 0 \rangle, | 1 \rangle状態それぞれが観測される確率を求めるため、密度演算子をこの状態から求めます。

\displaystyle{
\hat{\rho}^{AB} = \frac{1}{4} \left\{ | 0 \rangle_{A} \otimes \left( \hat{I} + \hat{U} \right) | \psi \rangle_{B} + | 1 \rangle_{A} \otimes \left( \hat{I} - \hat{U} \right) | \psi \rangle_{B} \right\} \left\{ \langle 0 |_{A} \otimes \langle \psi |_{B} \left( \hat{I} + \hat{U} \right)^{\dagger} + \langle 1 |_{A} \otimes \langle \psi |_{B} \left( \hat{I} - \hat{U} \right)^{\dagger} \right\} \\
}

から


\begin{aligned}
\hat{\rho}^{A}

= &\frac{1}{4} 
\mathrm{tr}_B \left\{ | 0 \rangle_A \otimes \left( \hat{I} + \hat{U} \right) | \psi \rangle_B \langle 0 |_A \otimes \langle \psi | _B \left( \hat{I} + \hat{U} \right)^{\dagger} \right\} \\

&+ \frac{1}{4} \mathrm{tr}_B \left\{ | 0 \rangle_A \otimes \left( \hat{I} + \hat{U} \right) | \psi \rangle_B \langle 1 |_A \otimes \langle \psi | _B \left( \hat{I} - \hat{U} \right)^{\dagger} \right\} \\

&+ \frac{1}{4} \mathrm{tr}_B \left\{ | 1 \rangle_A \otimes \left( \hat{I} - \hat{U} \right) | \psi \rangle_B \langle 0 |_A \otimes \langle \psi | _B \left( \hat{I} + \hat{U} \right)^{\dagger} \right\} \\

&+ \frac{1}{4} \mathrm{tr}_B \left\{ | 1 \rangle_A \otimes \left( \hat{I} - \hat{U} \right) | \psi \rangle_B \langle 1 |_A \otimes \langle \psi | _B \left( \hat{I} - \hat{U} \right)^{\dagger} \right\} \\


= &\frac{1}{4} 
\mathrm{tr}_B \left\{ | 0 \rangle_A \langle 0 |_A \otimes \left( \hat{I} + \hat{U} \right) | \psi \rangle_B  \langle \psi | _B \left( \hat{I} + \hat{U} \right)^{\dagger} \right\} \\

&+ \frac{1}{4} \mathrm{tr}_B \left\{ | 0 \rangle_A \langle 1 |_A \otimes \left( \hat{I} + \hat{U} \right) | \psi \rangle_B  \langle \psi | _B \left( \hat{I} - \hat{U} \right)^{\dagger} \right\} \\

&+ \frac{1}{4} \mathrm{tr}_B \left\{ | 1 \rangle_A \langle 0 |_A \otimes \left( \hat{I} - \hat{U} \right) | \psi \rangle_B  \langle \psi | _B \left( \hat{I} + \hat{U} \right)^{\dagger} \right\} \\

&+ \frac{1}{4} \mathrm{tr}_B \left\{ | 1 \rangle_A \langle 1 |_A \otimes \left( \hat{I} - \hat{U} \right) | \psi \rangle_B  \langle \psi | _B \left( \hat{I} - \hat{U} \right)^{\dagger} \right\} \\


= &\frac{1}{4} | 0 \rangle_A \langle 0 |_A \mathrm{tr} \left\{ \left( \hat{I} + \hat{U} \right) | \psi \rangle_B  \langle \psi | _B \left( \hat{I} + \hat{U} \right)^{\dagger} \right\} \\

&+ \frac{1}{4} | 0 \rangle_A \langle 1 |_A \mathrm{tr} \left\{ \left( \hat{I} + \hat{U} \right) | \psi \rangle_B  \langle \psi | _B \left( \hat{I} - \hat{U} \right)^{\dagger} \right\} \\

&+ \frac{1}{4} | 1 \rangle_A \langle 0 |_A \mathrm{tr} \left\{ \left( \hat{I} - \hat{U} \right) | \psi \rangle_B  \langle \psi | _B \left( \hat{I} + \hat{U} \right)^{\dagger} \right\} \\

&+ \frac{1}{4} | 1 \rangle_A \langle 1 |_A \mathrm{tr} \left\{ \left( \hat{I} - \hat{U} \right) | \psi \rangle_B  \langle \psi | _B \left( \hat{I} - \hat{U} \right)^{\dagger} \right\} \\


= &\frac{1}{4} | 0 \rangle_A \langle 0 |_A \langle \psi | _B \left( \hat{I} + \hat{U} \right)  \left( \hat{I} + \hat{U} \right)^{\dagger} | \psi \rangle_B  \\

&+ \frac{1}{4} | 0 \rangle_A \langle 1 |_A \langle \psi | _B \left( \hat{I} - \hat{U} \right)  \left( \hat{I} + \hat{U} \right)^{\dagger} | \psi \rangle_B  \\

&+ \frac{1}{4} | 1 \rangle_A \langle 0 |_A \langle \psi | _B \left( \hat{I} + \hat{U} \right)  \left( \hat{I} - \hat{U} \right)^{\dagger} | \psi \rangle_B  \\

&+ \frac{1}{4} | 1 \rangle_A \langle 1 |_A \langle \psi | _B \left( \hat{I} - \hat{U} \right)  \left( \hat{I} - \hat{U} \right)^{\dagger} | \psi \rangle_B  \\


= &\frac{1}{4} | 0 \rangle_A \langle 0 |_A \left( \langle \psi |_B 2 \hat{I} | \psi \rangle_B + \langle \psi |_B \hat{U} | \psi \rangle_B + \langle \psi |_B \hat{U}^{\dagger} | \psi \rangle_B \right) \\

&+ \mathrm{略} \\

&+ \frac{1}{4} | 1 \rangle_A \langle 1 |_A \left( \langle \psi |_B 2 \hat{I} | \psi \rangle_B - \langle \psi |_B \hat{U} | \psi \rangle_B - \langle \psi |_B \hat{U}^{\dagger} | \psi \rangle_B \right) \\


= &\frac{1}{4} | 0 \rangle_A \langle 0 |_A \left\{ 2 + \langle \psi |_B \hat{U} | \psi \rangle_B + \left( \langle \psi |_B \hat{U} | \psi \rangle_B \right)^{*} \right\} \\

&+ \mathrm{略} \\

&+ \frac{1}{4} | 1 \rangle_A \langle 1 |_A \left\{ 2 - \langle \psi |_B \hat{U} | \psi \rangle_B - \left( \langle \psi |_B \hat{U} | \psi \rangle_B \right)^{*} \right\} \\


= &\frac{1}{4} | 0 \rangle_A \langle 0 |_A \left\{ 2 + \mathrm{Re} \left( \langle \psi |_B \hat{U} | \psi \rangle_B \right) \right\} \\

&+ \mathrm{略} \\

&+ \frac{1}{4} | 1 \rangle_A \langle 1 |_A \left\{ 2 - \mathrm{Re} \left( \langle \psi |_B \hat{U} | \psi \rangle_B \right) \right\}

\end{aligned}

よって、第一量子ビットを測定したときに | 0 \rangle_Aが観測される確率 p_0および | 1 \rangle_Aが観測される確率 p_1はそれぞれ以下になります。

\displaystyle{
p_0 = \frac{1 + \mathrm{Re} \langle \psi |_B \hat{U} | \psi \rangle_B}{2}
}
\displaystyle{
p_1 = \frac{1 - \mathrm{Re} \langle \psi |_B \hat{U} | \psi \rangle_B}{2}
}

ということでやっと教科書に書いてあるような式が現れました。
教科書ではサラッと書かれていますが、密度演算子と行列計算を使いこなせる必要があります。

制御ユニタリーがかかった後の量子ビットの状態

入力する量子ビットの状態は固有状態ではないが、(固有値 \lambda_1, \lambda_2で、固有状態が | u_1 \rangle, | u_2 \rangleと予めわかっているとすると)以下のように書き換えられます。

\displaystyle{
| \psi \rangle = c_1 | u_1 \rangle + c_2 | u_2 \rangle
}

そうすると、2回目のアダマールゲートをかけた後の標的量子ビットの状態は以下になります。


\begin{aligned}
| \psi \rangle \pm \hat{U} | \psi \rangle &= c_1 | u_1 \rangle + c_2 | u_2 \rangle \pm c_1 \hat{U} |u_1 \rangle \pm c_2 \hat{U} | u_2 \rangle \\

&= c_1 | u_1 \rangle + c_2 | u_2 \rangle \pm c_1 e^{i \lambda_1} | u_1 \rangle \pm c_2 e^{i \lambda_2} | u_2 \rangle \\

&= c_1 \left( 1 \pm e^{i \lambda_1} \right) | u_1 \rangle + c_2 \left( 1 \pm e^{i \lambda_2} \right) | u_2 \rangle

\end{aligned}

上記のように任意のユニタリーとそれに対応する固有値で表現するとわかりにくいですが、よく使う \hat{X}, \hat{Y}, \hat{Z}ゲートであれば固有値 \lambda = 0, \pi固有ベクトルはそれぞれの軸上の単位ベクトルになりますので、上記の式で言えば | u_1 \rangle, | u_2 \rangleのどちらか一方だけが残ります。
従って、もう一つアダマールテスト回路を作成すれば「入力状態がユニタリー行列の固有値の場合」に帰着します。

以下で具体的に計算してみます。

制御Xゲートの場合

 \hat{U} = \hat{X}固有ベクトル | + \rangle, | - \rangleで、対応する固有値 +1, -1です。 従って

\displaystyle{
| \psi \rangle + \hat{X} | \psi \rangle = 2 c_1 | + \rangle
}
\displaystyle{
| \psi \rangle - \hat{X} | \psi \rangle = 2 c_2 | - \rangle
}

となります。

制御Zゲートの場合

 \hat{U} = \hat{Z}固有ベクトル | 0 \rangle, | 1 \rangleで、対応する固有値 +1, -1です。 従って

\displaystyle{
| \psi \rangle + \hat{Z} | \psi \rangle = 2 c_1 | 0 \rangle
}
\displaystyle{
| \psi \rangle - \hat{Z} | \psi \rangle = 2 c_2 | 1 \rangle
}

となります。

制御Yゲートの場合

 \hat{U} = \hat{Y}固有ベクトル | + \rangle + i | - \rangle, | + \rangle - i | - \rangle (ポアンカレ球の斜め直線偏光に相当する状態)で、対応する固有値 +1, -1です。 従って

\displaystyle{
| \psi \rangle + \hat{Y} | \psi \rangle = 2 c_1 \left( | + \rangle + i | - \rangle \right)
}
\displaystyle{
| \psi \rangle - \hat{Y} | \psi \rangle = 2 c_2 \left( | + \rangle - i | - \rangle \right)
}

となります。

量子コンピュータで計算させてみる

入力状態がユニタリー行列の固有値の場合

ユニタリー行列が制御Xゲートの場合

 \hat{U} = \hat{X}固有ベクトル | + \rangle, | - \rangleで、対応する固有値 +1, -1です。 従って \lambda_{+} = 0, \ \lambda_{-} = \piのため、第一量子ビットの確率は以下となります。

i) 第二量子ビットの状態が | \psi \rangle = | + \rangleの時


\begin{aligned}
p_0 &= \frac{1 + 1}{2}  \\

&= 1
\end{aligned}

ii) 第二量子ビットの状態が | \psi \rangle = | - \rangleの時


\begin{aligned}
p_0 &= \frac{1 - 1}{2} \\

&= 0
\end{aligned}

i)について実行する量子回路です。

図1. アダマールテスト:ユニタリーがXゲートで、標的第二量子ビットがその固有ベクトル| + >の場合

シミュレータで実行した結果です。

図2. 図1の量子回路の実行結果(シミュレータ)

実際にIBMQの実機の結果です。

図3. 図1の量子回路の実行結果(実機)

ということで、予め計算した通りになりました。

これらのソースコードです。

qr_control = QuantumRegister(1, 'control')
qr_target = QuantumRegister(1, 'target')
cr = ClassicalRegister(1)
qc = QuantumCircuit(qr_control, qr_target, cr)

qc.h(qr_target)

qc.barrier()

qc.h(qr_control)
qc.cx(qr_control, qr_target)
qc.h(qr_control)

qc.barrier()
qc.measure(qr_control, cr[0])

qc.draw(output='mpl')

## シミュレータ

backend = Aer.get_backend('qasm_simulator')
job = execute(qc, backend, shot=1024)

result = job.result()
plot_histogram(result.get_counts())

## 実機(マシンはその時空いているもので良いです)
backend = provider.get_backend('ibmq_belem')
job = execute(qc, backend, shots=1024)

result = job.result()
plot_histogram(result.get_counts())

とはいえ、i)の場合アダマール2回やって | 0 \rangleに戻ってきただけ、と思われても嫌なのでii)も計算しておきます。

ii)について実行する量子回路です。

図4. アダマールテスト:ユニタリーがXゲートで、標的量子ビットがその固有ベクトルの| - >の場合

シミュレータで実行した結果です。

図5. 図4の量子回路の実行結果(シミュレータ)

実機の結果です。

図6. 図4の量子回路の実行結果(実機)

ということで、第一量子ビットからしたらアダマール2回実行したようにしか見えませんがちゃんと第二量子ビットの影響を受けていることがわかります。

この時のソースコードです。

qr_control = QuantumRegister(1, 'control')
qr_target = QuantumRegister(1, 'target')
cr = ClassicalRegister(1)
qc = QuantumCircuit(qr_control, qr_target, cr)

qc.x(qr_target)
qc.h(qr_target)

qc.barrier()

qc.h(qr_control)
qc.cx(qr_control, qr_target)
qc.h(qr_control)

qc.barrier()
qc.measure(qr_control, cr[0])

qc.draw(output='mpl')

### シミュレータ
backend = Aer.get_backend('qasm_simulator')
job = execute(qc, backend, shot=1024)

result = job.result()
plot_histogram(result.get_counts())

### 実機(その時に空いているマシンなら何でも可)
backend = provider.get_backend('ibmq_belem')
job = execute(qc, backend, shots=1024)

result = job.result()
plot_histogram(result.get_counts())

ユニタリー行列がRxゲートの場合

同じように任意の回転ゲートでも確率分布が変化することを確認します。

例えば R_x \left( \frac{\pi}{2} \right)の場合、固有値 (1 \pm i) / \sqrt{2}に対して固有ベクトル | - \rangle, | + \rangleです。

従って \lambda_{+} = \pi / 4, \ \lambda_{-} = - \pi / 4のため、第一量子ビットの確率は以下となります。

i) 第二量子ビットの状態が | \psi \rangle = | - \rangleの時、 \lambda = \lambda_{+}のため


\begin{aligned}
p_0 &= \frac{1 + \sqrt{2} / 2}{2} \\

&= \frac{2 + \sqrt{2}}{4} \\

&\sim 0.85
\end{aligned}

\begin{aligned}
p_1 &= \frac{1 - \sqrt{2} / 2}{2} \\

&= \frac{2 - \sqrt{2}}{4} \\

&\sim 0.15
\end{aligned}

ii) 第二量子ビットの状態が | \psi \rangle = | + \rangleの時、 \lambda = \lambda_{-}のため


\begin{aligned}
p_0 &= \frac{1 + \sqrt{2} / 2}{2} \\

&= \frac{2 + \sqrt{2}}{4} \\

&\sim 0.15

\end{aligned}

\begin{aligned}
p_1 &= \frac{1 - \sqrt{2} / 2}{2} \\

&= \frac{2 - \sqrt{2}}{4} \\

&\sim 0.15

\end{aligned}

i)について実行する量子回路は以下です。

図7. アダマールテスト:ユニタリーがRx(π/2)ゲートで、標的量子ビットがその固有ベクトルの| - >の場合

シミュレータで実行した結果です。

図8. 図7の量子回路の実行結果(シミュレータ)

実機の結果です。

図9. 図7の量子回路の実行結果(実機)

この時のソースコードです。

qr_control = QuantumRegister(1, 'control')
qr_target = QuantumRegister(1, 'target')
cr = ClassicalRegister(1)
qc = QuantumCircuit(qr_control, qr_target, cr)

qc.h(qr_target)

qc.barrier()

qc.h(qr_control)
qc.crx(np.pi / 2, qr_control, qr_target)
qc.h(qr_control)

qc.barrier()
qc.measure(qr_control, cr[0])

qc.draw(output='mpl')

## 実行(シミュレーション)
backend = Aer.get_backend('qasm_simulator')
job = execute(qc, backend, shot=1024)

result = job.result()
plot_histogram(result.get_counts())

## 実行(実機)
backend = provider.get_backend('ibmq_quito')
job = execute(qc, backend, shots=1024)

result = job.result()
plot_histogram(result.get_counts())

ii)について実行する量子回路は以下です。

図10. アダマールテスト:ユニタリーがRx(π/2)ゲートで、標的量子ビットがその固有ベクトルの| + >の場合

図11. 図10の量子回路の実行結果(シミュレータ)

図12. 図10の量子回路の実行結果(実機)

この時のソースコードです。

qr_control = QuantumRegister(1, 'control')
qr_target = QuantumRegister(1, 'target')
cr = ClassicalRegister(1)
qc = QuantumCircuit(qr_control, qr_target, cr)

qc.x(qr_target)
qc.h(qr_target)

qc.barrier()

qc.h(qr_control)
qc.crx(np.pi / 2, qr_control, qr_target)
qc.h(qr_control)

qc.barrier()
qc.measure(qr_control, cr[0])

qc.draw(output='mpl')

## 実行(シミュレータ)
backend = Aer.get_backend('qasm_simulator')
job = execute(qc, backend, shot=1024)

result = job.result()
plot_histogram(result.get_counts())

## 実行(実機)
backend = provider.get_backend('ibmq_quito')
job = execute(qc, backend, shots=1024)

result = job.result()
plot_histogram(result.get_counts())

ということで、予め求めた固有値の通りに確率分布が得られました。

入力状態がユニタリー行列の固有値ではない場合

入力状態は (| 0 \rangle + i | 1 \rangle) / \sqrt{2}でユニタリーはXゲートの場合

 \langle \psi | \hat{X} | \psi \rangle複素数になる場合です。


\begin{aligned}
\langle \psi | \hat{X} | \psi \rangle &= \frac{1}{2} \begin{pmatrix} 1&i \end{pmatrix} \begin{pmatrix} 0&1\\ 1&0 \end{pmatrix} \begin{pmatrix} 1\\ i \end{pmatrix} \\

&= \frac{1}{2} \begin{pmatrix} i&1 \end{pmatrix} \begin{pmatrix} 1\\ i \end{pmatrix} \\

&= i
\end{aligned}

従って


\begin{aligned}
p_0 &= \frac{1 + 0}{2} \\

&= 0.5

\end{aligned}

\begin{aligned}
p_1 &= \frac{1 - 0}{2} \\

&= 0.5

\end{aligned}

この時の量子回路と実行回路です。

図13. アダマールテスト:ユニタリーがXゲートで、標的量子ビットがその固有ベクトルでない場合(1)

図14. 図13の量子回路の実行結果(シミュレータ)

図15. 図13の量子回路の実行結果(実機)

この時のソースコードです。

qr_control = QuantumRegister(1, 'control')
qr_target = QuantumRegister(1, 'target')
cr = ClassicalRegister(1)
qc = QuantumCircuit(qr_control, qr_target, cr)

qc.rx(-np.pi / 3, qr_target)

qc.barrier()

qc.h(qr_control)
qc.cx(qr_control, qr_target)
qc.h(qr_control)

qc.barrier()
qc.measure(qr_control, cr[0])

qc.draw(output='mpl')

## 実行(シミュレータ)
backend = Aer.get_backend('qasm_simulator')
job = execute(qc, backend, shot=1024)

result = job.result()
plot_histogram(result.get_counts())

## 実行(実機)
backend = provider.get_backend('ibmq_quito')
job = execute(qc, backend, shots=1024)

result = job.result()
plot_histogram(result.get_counts())

入力状態は (\sqrt{3} | 0 \rangle + | 1 \rangle) / 2でユニタリーはXゲートの場合

 \langle \psi | \hat{X} | \psi \rangleが半端な実数になる場合です。


\begin{aligned}
\langle \psi | \hat{X} | \psi \rangle &= \frac{1}{4} \begin{pmatrix} \sqrt{3}&1 \end{pmatrix} \begin{pmatrix} 0&1\\ 1&0 \end{pmatrix} \begin{pmatrix} \sqrt{3}\\ 1 \end{pmatrix} \\

&= \frac{1}{4} \begin{pmatrix} 1&\sqrt{3} \end{pmatrix} \begin{pmatrix} \sqrt{3}\\ 1 \end{pmatrix} \\

&= \frac{\sqrt{3}}{2}
\end{aligned}

従って


\begin{aligned}
p_0 &= \frac{1 + \sqrt{3} / 2}{2} \\

&\sim 0.93

\end{aligned}

\begin{aligned}
p_1 &= \frac{1 - \sqrt{3} / 2}{2} \\

&\sim 0.07

\end{aligned}

この時の量子回路と実行結果です。

図16. アダマールテスト:ユニタリーがXゲートで、標的量子ビットがその固有ベクトルでない場合(2)

図17. 図16の量子回路の実行結果(シミュレータ)

図18. 図16の量子回路の実行結果(実機)

この時のソースコードです。

qr_control = QuantumRegister(1, 'control')
qr_target = QuantumRegister(1, 'target')
cr = ClassicalRegister(1)
qc = QuantumCircuit(qr_control, qr_target, cr)

qc.ry(np.pi / 3, qr_target)

qc.barrier()

qc.h(qr_control)
qc.cx(qr_control, qr_target)
qc.h(qr_control)

qc.barrier()
qc.measure(qr_control, cr[0])

qc.draw(output='mpl')

## 実行(シミュレータ)
backend = Aer.get_backend('qasm_simulator')
job = execute(qc, backend, shot=1024)

result = job.result()
plot_histogram(result.get_counts())

## 実行(実機)
backend = provider.get_backend('ibmq_manila')
job = execute(qc, backend, shots=1024)

result = job.result()
plot_histogram(result.get_counts())

ということで、第一量子ビットの確率は \mathrm{Re} \langle \psi | \hat{X} | \psi \rangleに従う分布になりました。

まとめ

参考


量子コンピューティング 基本アルゴリズムから量子機械学習まで [ 情報処理学会出版委員会 ]