物理とか

Index

制御ゲートの作り方


1. 制御ゲート

量子コンピュータにおける制御ゲート (controlled gate) とは、1つのqubit (制御qubit) が\(\ket{1}\)である場合のみ、ターゲットとなるqubitにあるゲートをかけるようなものです。特に、ターゲットとなるqubitに適当なゲート\(U\)を書けるようなものは、制御\(U\)ゲート (controlled-\(U\) gate) と呼ばれます。

具体的な作用を式で書くと、例えば1番目のqubitを制御ゲートとして2番目のqubitに制御\(U\)をかける場合、 \begin{align} \ket{0}_1\ket{\psi}_2 &\to \ket{0}_1\ket{\psi}_2 \\ \ket{1}_1\ket{\psi}_2 &\to \ket{1}_1 (U\ket{\psi}_2) \\ \end{align} となります。1番目のqubitが\(\alpha\ket{0}_1+\beta\ket{1}_1\)の重ね合わせ状態にあるときは、 \begin{align} (\alpha\ket{0}_1+\beta\ket{1}_1)\ket{\psi}_2 &= \alpha\ket{0}_1\ket{\psi}_2+\beta\ket{1}_1\ket{\psi}_2\\ &\to \alpha\ket{0}_1\ket{\psi}_2+\beta\ket{1}_1 (U\ket{\psi}_2) \end{align} という作用になります。展開してから個々に考えれば良いわけです。

今回は、自然界に存在する相互作用から、どのようにこの制御ゲートを作るかを解説してみたいと思います。

量子誤り訂正を使って保護された qubit に対する制御ゲートをどうやって構成するかという話では無いです。あしからず。



2. 量子系の時間変化

ある量子系の時間変化は、シュレディンガー方程式 \[\frac{d}{dt}\ket{\psi(t)} = -iH\ket{\psi(t)}\tag{1}\] によって決まります。\(H\)はハミルトニアンです。あるいは、同じことですが、初期状態\(\ket{\psi(0)}\)をある時間\(t\)の状態\(\ket{t}\)にうつす演算子 \[U(t)\ket{\psi(0)} = \ket{\psi(t)}\] を定義すると、この演算子は \[\frac{d}{dt}U(t) = -iHU(t),~U(0) = I\tag{2}\] という微分方程式を満たします。\(H\)が時間に依存しないときは、 \[U(t) = \exp(-iHt)\tag{3}\] が解です。

量子ゲートは(2)式や(3)式に基づいて作り出します。ある時刻\(T\)における\(U(T)\)が、作り出したい変換\(U_{\text{target}}\)となるように、ハミルトニアン\(H\)を調節して構成するのです。 したがって、あるゲートを作り出すには、そのゲートに対応したハミルトニアンを、使っている量子系に適合した形で見つけることが必要です。

常に同じハミルトニアンを使っていては、ある特定のゲートしか作り出せません。量子回路を組みたいときには、\(H\)をある時間ごとに変化させながら色々なゲートを実現します。


3. 1 qubit ゲートの例

1 qubit ゲートの例として、\(X\)ゲート (NOTゲート) を作り出してみましょう。実は \[H_X=\omega X\] とすれば、\(X\)ゲートが作れます。\(\omega\)はある実数で、ゲートの「早さ」を決めるパラメータです。

実際、(3)式に\(H_X=\omega X\)を代入してみると、Pauli演算子の性質から、 \begin{align} U(t) = \exp(-i\omega t X) = \cos \omega t I -i \sin \omega t X \tag{4} \end{align} が得られます。\(t = \frac{\pi}{2\omega}\)とすれば、 \[U\left(\frac{\pi}{2\omega}\right) = -iX\] となって、係数\(-i\)こそかかっていますが、\(X\)ゲートが得られました。\(X\)ゲートは、\(\frac{\pi}{2\omega}\)という時間だけ、\(H_X=\omega X\)というハミルトニアンをオンにすれば作り出せるのです。

4. 制御ゲート

本題の制御ゲートの作り方に移ります。

まず前置きとして、制御ゲートのように 2 qubit をつなぐ量子ゲートは、1 qubitゲートに比べると、実現が少し難しいものであることを述べておきます。1 qubit ゲートは、ターゲットとなる qubit = 2準位系 に対して、そのエネルギー差に相当する電磁波を照射することで実現できて、電磁波の波形を色々と制御することで、かなり自由度高く作り出すことができます。オン・オフも自由自在です。一方で 2 qubit ゲートは、qubit 間に「自然」に存在する相互作用に頼るしかありません。相互作用の大きさや形は、 qubit を作ってしまった時点で決まってしまって、その後は変えることができないのです。そのため自由度は 1 qubit ゲートに比べるとかなり制限されます。

さて、簡単な例として制御 Z (controlled-Z, CZ) ゲートを考えてみましょう。CZゲートは、制御ビットが\(\ket{1}\)であるときのみ Z ゲートをかけるゲートで、 \begin{align} \ket{0}_1\ket{\psi}_2 &\xrightarrow{CZ} \ket{0}_1\ket{\psi}_2 \\ \ket{1}_1\ket{\psi}_2 &\xrightarrow{CZ} \ket{1}_1 (Z\ket{\psi}_2) \\ \end{align} のような作用をします。

このゲートはどのように実現すればよいでしょうか?

CZゲート\(U_{CZ}\)が、エルミート演算子でかつ、\(U_{CZ}^2 = I\)となることに注意すると、 \[H_{CZ}=\omega U_{CZ}\] とすることで実現できることに気づきます。なぜなら、(4)式と同じ原理で \begin{align} U(t) &= \exp(-iH_{CZ} t ) \\ &= \cos \omega t I -i \sin \omega t U_{CZ} \tag{5} \end{align} が成り立つからです。先と同じように\(t = \frac{\pi}{2\omega}\)とすれば \[U\left(\frac{\pi}{2\omega}\right) = -iU_{CZ}\] となります。

これだけでもいいんですが、一応ハミルトニアンはPauli演算子の足し算の形で表しておきたいところです。そこで\(U_{CZ}\)をPauli演算子の足し算で表すと次のようになります。 \[U_{CZ} = \frac{1}{2}(I + Z_1 + Z_2 - Z_1Z_2)\] ここで \(Z_1\) と \(Z_2\) はそれぞれ 1 と 2 番目の量子ビットに作用するパウリ $Z$ 演算子です。 なぜこうなるかは、このゲートを実際に作用させてみるとわかります。\(\ket{0}_1\ket{\psi}_2\)に作用させてみると、 \begin{align} \frac{1}{2}(I + Z_1 + Z_2 - Z_1Z_2)\ket{0}_1\ket{\psi}_2 &= \frac{1}{2}(\ket{0}_1\ket{\psi}_2 + \ket{0}_1\ket{\psi}_2 + \ket{0}_1(Z\ket{\psi}_2) - \ket{0}_1(Z\ket{\psi}_2))\\ &= \ket{0}_1\ket{\psi}_2\\ \end{align} で、\(\ket{1}_1\ket{\psi}_2\)に作用させてみると \begin{align} \frac{1}{2}(I + Z_1 + Z_2 - Z_1Z_2)\ket{1}_1\ket{\psi}_2 &= \frac{1}{2}(\ket{1}_1\ket{\psi}_2 - \ket{1}_1\ket{\psi}_2 + \ket{1}_1(Z\ket{\psi}_2) + \ket{1}_1(Z\ket{\psi}_2))\\ &= \ket{1}_1(Z\ket{\psi}_2)\\ \end{align} です。うまいこといらない項が打ち消すように構成されていますね。

ということで、CZゲートを実現するハミルトニアンは \[H_{CZ}=\frac{\omega}{2}(I + Z_1 + Z_2 - Z_1Z_2)\tag{6}\] です。

さて、ここで注意したいことは、\(H_{CZ}\)に含まれている相互作用項\(Z_1Z_2\)が実際に即したものか、ということです。しかし実のところ、\(Z_1Z_2\)という形の相互作用は、多くの量子系 (超伝導qubit, 核スピンqubit, etc...) で基本的な相互作用として現れます。それは\(Z_1Z_2\)という項が、qubitの\(Z\)演算子と可換 \([Z_j, Z_1Z_2] = 0\) であり、"永年項 (Secular term)"として残るからです。(Secular Approximation参照) そんなわけで、この\(Z_1Z_2\)という演算子を考えることは、実際の実験に合致しているといえます。(でも超伝導qubitの場合、この永年項によるCZゲートはスピードが遅く、非常に精度が悪いようです。Twitterで本職の方に言われちゃいました。)

CZゲートは(6)のハミルトニアンを\(t = \frac{\pi}{2\omega}\)の時間だけ使えば実現されることがわかりましたが、(6)のハミルトニアンは比較的複雑で、実験的に作り出すのは少し難しそうです。そこで\(Z_1,Z_2,Z_1Z_2\)が全て可換な演算子であることを使って、実験的に実現しやすい形に変えてやりましょう。(6)のハミルトニアンによる時間発展は、以下のように分割することができます。 \[\exp\left(\frac{-iH_{CZ}\pi}{2\omega}\right)=\exp\left(\frac{-i\pi}{4} I\right)\exp\left(\frac{-i\pi}{4}Z_1\right)\exp\left(\frac{-i\pi}{4}Z_2\right)\exp\left(\frac{-i\pi}{4}Z_1Z_2\right)\] そうすると、 \[H_{CZ}=\frac{\omega}{2}(I + Z_1 + Z_2 - Z_1Z_2)\tag{6}\] という比較的複雑なハミルトニアンを使わなくても、 \[H_{I} = \omega_{I} I, H_{Z_1} = \omega_{Z_1} Z_1, H_{Z_1} = \omega_{Z_2} Z_2, H_{Z_1Z_2} = \omega_{Z_1Z_2} Z_1Z_2\tag{7}\] という4つの単純なハミルトニアンの時間発展を次々に起こせば良いことがわかります。

CZゲートは実験的にはこのように実現するのがベストでしょう。ちなみに\(Z_1, Z_2\)による時間発展は、qubitを制御するデバイスの基準位相をシフトさせれば一瞬で実現させられるので、実際にqubit側で起きることは\(Z_1Z_2\)の相互作用による時間発展だけです。


5. 別のやり方

行列表記を用いた別のやり方も紹介します。CZゲートを、\(\ket{0}_1\ket{0}_2\), \(\ket{0}_1\ket{1}_2\), \(\ket{1}_1\ket{0}_2\), \(\ket{1}_1\ket{1}_2\)を基底として行列表記すると \[ U_{CZ} =\left(\begin{array}{cccc} 1&0&0&0 \\ 0&1&0&0 \\ 0&0&1&0 \\ 0&0&0&-1 \\ \end{array}\right) \] です。 これを実現するハミルトニアンを求めましょう。\(U_{CZ}\)は対角行列なので簡単で、次のように考えられます。まず、\(U_{CZ}\)の各成分を指数関数で以下のように表します。 \[ U_{CZ} =\left(\begin{array}{cccc} e^0&0&0&0 \\ 0&e^0&0&0 \\ 0&0&e^0&0 \\ 0&0&0&e^{-i\pi} \\ \end{array}\right)\tag{5} \] そうすると、 \[ H_{CZ} =\left(\begin{array}{cccc} 0&0&0&0 \\ 0&0&0&0 \\ 0&0&0&0 \\ 0&0&0&1 \\ \end{array}\right)\tag{6} \] というハミルトニアンを考えれば、\(e^{-iH_{CZ}\pi} = U_{CZ}\)となることがわかると思います。この\(H_{CZ}\)をパウリ演算子の足し算で表すと \[ H_{CZ} = \frac{1}{2} (I - Z_1 - Z_2 + Z_1Z_2)\tag{8} \] です。ん? と思った人もいるかも知れません。(6)とは少し違う格好になっています。実は同じゲートを実現するハミルトニアンは1通りでは無いのです。これは対数関数が複素数の範囲では一意に決まらないことに対応しています。ちなみに(6)のハミルトニアンの符号を反転させ、\(I\)を足すと(8)のハミルトニアンになります。

6. CNOT ゲート

さて、次はCNOTゲートを構成してみます。CNOT ゲート\(U_{CNOT}\)とは、制御ビットが\(\ket{1}\)のときだけ、ターゲットに\(X\)ゲート = NOTゲートをかけるゲートのことで、 \begin{align} \ket{0}_1\ket{\psi}_2 &\xrightarrow{CNOT} \ket{0}_1\ket{\psi}_2 \\ \ket{1}_1\ket{\psi}_2 &\xrightarrow{CNOT} \ket{1}_1 (X\ket{\psi}_2) \\ \end{align} という作用をします。

\(U_{CZ}\)をPauli演算子の足し算で表したように、\(U_{CNOT}\)もPauli演算子の足し算で表してみましょう。\(U_{CZ}\)のように、うまく打ち消すように構成すると、 \[U_{CNOT} = \frac{1}{2}(I + Z_1 + X_2 - Z_1X_2)\] となります。CNOTも\(U_{CNOT}^2 = I\)を満たすので、CZゲートと全く同じようにハミルトニアンを\(H_{CNOT} = U_{CNOT}\)とすれば得られるのですが、問題があります。それは\(Z_1X_2\)という形の相互作用が、普通のデバイスには存在しないことです。だから、一般にはこのようなハミルトニアンによってCNOTを構成することはできません。

そこで違うアプローチを取ります。CZゲートは構成できるので、CZゲートと 1 qubit ゲートで CNOT を作れないか考えてみましょう。

\(U_{CZ}\)と\(U_{CNOT}\)を並べて書いてみます。 \begin{align} U_{CZ} &= \frac{1}{2}(I + Z_1 + Z_2 - Z_1Z_2) \\ U_{CNOT} &= \frac{1}{2}(I + Z_1 + X_2 - Z_1X_2) \end{align} そうすると、\(Z_2 \to X_2\) という変換を他の項を変えずに実行できれば、CZからCNOTを作れそうです。\(Z_2\to X_2\)という変換なら 1 qubit ゲートで実現できます。例えば\(Y_2Z_2 = iX_2\)であることが使えそうですが、これだと\(Y_2 U_{CZ}\)としたときに、\(I\to Y_2\)などと他の項も変わってしまうのでだめです。どうすれば良いでしょうか。

正解は、アダマールゲート\(H\)を使って、\(H_2Z_2H_2=X_2\)となることを利用する方法です。つまり、 \[U_{CNOT} = H_2U_{CZ}H_2\] とします。\(H^2=I\)なので、これなら\(I\)を変えずに変換できます。これでCNOTも実現できました。

これとほぼ同じ方法で、ターゲットとなる qubit にかけたいゲートが \(U = \b{n}\cdot\b{\sigma}\) の形であるときは、制御 U ゲートを構成できます。(\(\b{n}\)は単位ベクトルで、\(\b{\sigma}\)はPauli演算子のベクトル \(\b{\sigma} = (X,Y,Z)\)。) ぜひやってみてください。

7. 一般の制御ゲート

最後に一般の制御ゲートをCZから構成する方法を示して終わりにしましょう。一般の制御ゲートを構成するには、任意の 1 qubit のユニタリーゲートが、 \[U = e^{i\alpha} R_y(\theta_1)R_x(\theta_2)R_y(\theta_3) \tag{9}\] と、x軸周りの回転とy軸周りの回転の積に分解できることを使います。

天下り的で申し訳ないのですが、この\(U\)はさらに次のように分解できます。

どうしたらこれが思いつくのかわかりませんでした。

\[U = e^{-i\alpha} R_y(\theta_1)R_x\left(\frac{\theta_2}{2}\right)Z R_x\left(-\frac{\theta_2}{2}\right) ZZ R_y\left(-\frac{\theta_1 + \theta_3}{2}\right) Z R_y\left(-\frac{\theta_1 - \theta_3}{2}\right)\tag{10}\] 見やすくするために、次のように\(A,B,C\)を定義します。\(Z^2 = I\)に注意しましょう。 \begin{align} A &= R_y(\theta_1)R_x\left(\frac{\theta_2}{2}\right)\\ B &= R_x\left(-\frac{\theta_2}{2}\right)R_y\left(-\frac{\theta_1 + \theta_3}{2}\right)\\ C &= R_y\left(-\frac{\theta_1 - \theta_3}{2}\right)\\ \end{align} すると、これがこの分解のうまいところで、\(ABC = I\)となっています。したがって、(10)式のZゲートを CZ ゲートに変えてしまえば、制御ビットが\(\ket{1}\)のときだけターゲットに\(U\)をかける制御Uゲートの出来上がりです。\(U\)の\(e^{-i\alpha}\)の部分は、制御ビットに\(R_z(\alpha)\)をかけることで実現できます。制御Uゲートを\(U_c\)と書くことにして、式を書くと \[U_c = R_{z1}(\alpha)A_2U_{CZ}B_2U_{CZ}C_2\] です。\(A,B,C\)には \(_2\) の添字をつけてターゲットにかけるゲートであることを明示しました。