2量子ビットゲート

量子コンピュータ・量子情報の分野で登場する量子ビットゲートのうち,2つの量子ビットに作用する2量子ビットゲートとは何か,解説します。 特に,CNOTゲート,CXゲート,SWAPゲートについて解説します。

【準備】2量子ビットの量子回路の書き方

1量子ビットゲートの記事 (今後公開予定です) において,1量子ビットの場合の量子回路の書き方について軽くご紹介しました。ここでは,入力と出力が2量子ビットの場合の量子回路の書き方について軽く触れておきましょう。

例えば,入力として ψϕ=ψψ| \psi \phi \rangle = | \psi \rangle \otimes | \psi \rangle という状態を考えます。

量子ビットが複数個ある場合のナンバリングの仕方は,文献ごとでも異なります。この記事ではケットで書いた場合の左側から1番目,2番目,…と数えることにします。上の入力の状態の例で言うと,1番目の量子ビットは ψ| \psi \rangle,2番目の量子ビットは ϕ| \phi \rangle となります。

この量子状態に以下のように操作を施すことを考えます。

ψϕ=Uψϕ | \psi' \phi' \rangle = U | \psi \phi \rangle

UU は2量子ビットに作用する量子ゲートとします。

これは量子回路では,例えば下図のように書くことができます。

2QC-ex1

この記事では,量子回路の入出力状態について,上から1番目,2番目…と量子ビットを書くことにします。

また,同じ量子状態 ψϕ| \psi \phi \rangle を入力状態として用意し,ψ| \psi \rangle には U1U_1 を,ϕ| \phi \rangle には U2U_2 を作用させることを考えてみます。

これは数式では下図のように表すことができます。

ψϕ=U1ψU2ϕ | \psi'' \phi'' \rangle = U_1 | \psi \rangle \otimes U_2| \phi \rangle

これは量子回路では,例えば下図のように表すことができます。

2QC-ex2

【準備】2量子ビットの計算基底

2量子ビットの計算基底として,00,01,10,11| 00 \rangle, | 01 \rangle, | 10 \rangle, | 11\rangle の4つの量子状態を用意することが多いです。

これらは,ベクトル表示では以下のような計算基底に対応しています。

00=(1000),01=(0100),10=(0010),11=(0001) | 00 \rangle = \begin{pmatrix} 1 \\ 0 \\ 0 \\ 0 \end{pmatrix}, | 01 \rangle = \begin{pmatrix} 0 \\ 1 \\ 0 \\ 0 \end{pmatrix}, | 10 \rangle = \begin{pmatrix} 0 \\ 0 \\ 1 \\ 0 \end{pmatrix}, | 11 \rangle = \begin{pmatrix} 0 \\ 0 \\ 0 \\ 1 \end{pmatrix}

CNOTゲート

CNOT ゲートとは,2量子ビットのうち片方が1であった場合,もう片方のビットをフリップさせる操作を行うゲートのことです。1であるかどうかを判断する量子ビットを制御ビット,フリップさせる量子ビットを標的ビットなどと呼びます。以下では,特に断りがない場合,1番目の量子ビットを制御ビット,2番目の量子ビットを標的ビットとした場合の CNOT ゲートを考えます。

CNOT ゲートは,量子回路の図では下図のように表すことができます。

CNOT

下図のようにも表すことができます。

CNOT2

CNOT ゲートの行列表示

CNOT ゲートの行列表示を考えてみましょう。2量子ビットの1状態は4次元複素ベクトルで表されるので,CNOT ゲートは4行4列のユニタリ行列となることが予想されます。

線形代数では,ある行列の行列表示が知りたい場合,その行列を基底に作用させた結果がわかればよいという事実がありました。以下の記事なども併せてご参照ください。

CNOT ゲートを 00,01,10,11| 00 \rangle, | 01 \rangle, | 10 \rangle, | 11\rangle に作用させた場合の結果を考えてみましょう。量子状態としての表記では,左から順に1番目,2番目と量子ビットを数えていたことに注意すると,これら4つの量子状態への作用は以下のように書けます。

CNOT00=00=(1000) \text{CNOT} | 00 \rangle = | 00 \rangle = \begin{pmatrix} 1 \\ 0 \\ 0 \\ 0 \end{pmatrix}

CNOT01=01=(0100) \text{CNOT} | 01 \rangle = | 01 \rangle = \begin{pmatrix} 0 \\ 1 \\ 0 \\ 0 \end{pmatrix}

CNOT10=11=(0001) \text{CNOT} | 10 \rangle = | 11 \rangle = \begin{pmatrix} 0 \\ 0 \\ 0 \\ 1 \end{pmatrix}

CNOT11=10=(0010) \text{CNOT} | 11 \rangle = | 10 \rangle = \begin{pmatrix} 0 \\ 0 \\ 1 \\ 0 \end{pmatrix}

したがって,CNOT ゲートを行列表示すると,以下のようになることがわかります。

CNOT=(1000010000010010) \text{CNOT} = \begin{pmatrix} 1 & 0 & 0 & 0 \\ 0 & 1 & 0 & 0 \\ 0 & 0 & 0 & 1 \\ 0 & 0 & 1 & 0 \end{pmatrix}

CZゲート

CZ ゲートとは,2量子ビットのうち片方が1であった場合,もう片方の量子ビットに Z ゲートを作用させるような操作を行うゲートのことです。以下では、特に断りがない場合,1番目の量子ビットを制御ビット,2番目の量子ビットを標的ビットとした場合について考えます。

CZ ゲートは,量子回路では以下のように表すことができます。

CZ

CZ ゲートの行列表示

Zゲートは0の量子ビットには何もしないが,1の量子ビットは符号を反転させるという効果がありました (別記事にて解説予定です)。したがって,CZ ゲートは,2量子ビットの計算基底に以下のように作用することがわかります。

CZ00=00=(1000) \text{CZ} | 00 \rangle = | 00 \rangle = \begin{pmatrix} 1 \\ 0 \\ 0 \\ 0 \end{pmatrix}

CZ01=01=(0100) \text{CZ} | 01 \rangle = | 01 \rangle = \begin{pmatrix} 0 \\ 1 \\ 0 \\ 0 \end{pmatrix}

CZ10=10=(0010) \text{CZ} | 10 \rangle = | 10 \rangle = \begin{pmatrix} 0 \\ 0 \\ 1 \\ 0 \end{pmatrix}

CZ11=11=(0001) \text{CZ} | 11 \rangle = - | 11 \rangle = \begin{pmatrix} 0 \\ 0 \\ 0 \\ -1 \end{pmatrix}

したがって,CZ ゲートを行列表示すると,以下のようになることがわかります。

CNOT=(1000010000100001) \text{CNOT} = \begin{pmatrix} 1 & 0 & 0 & 0 \\ 0 & 1 & 0 & 0 \\ 0 & 0 & 1 & 0 \\ 0 & 0 & 0 & -1 \end{pmatrix}

SWAPゲート

SWAP ゲートとは,作用する2つの量子ビットの状態を入れ替えるようなゲートのことです。

SWAPψϕ=ϕψ \text{SWAP} | \psi \phi \rangle = |\phi \psi \rangle

SWAP ゲートは,量子回路では以下のように表すことができます。

SWAP1

上図からわかるように,SWAP ゲートは CNOT ゲートを3回作用させたものとなっています。

SWAP ゲートの行列表示

これまで同様,4つの計算基底への作用がどうなるか確認してみましょう。

SWAP00=00=(1000) \text{SWAP} | 00 \rangle = | 00 \rangle = \begin{pmatrix} 1 \\ 0 \\ 0 \\ 0 \end{pmatrix}

SWAP01=10=(0010) \text{SWAP} | 01 \rangle = | 10 \rangle = \begin{pmatrix} 0 \\ 0 \\ 1 \\ 0 \end{pmatrix}

SWAP10=01=(0100) \text{SWAP} | 10 \rangle = | 01 \rangle = \begin{pmatrix} 0 \\ 1 \\ 0 \\ 0 \end{pmatrix}

SWAP11=11=(0001) \text{SWAP} | 11 \rangle = | 11 \rangle = \begin{pmatrix} 0 \\ 0 \\ 0 \\ 1 \end{pmatrix}

したがって,SWAP ゲートを行列表示すると,以下のようになることがわかります。

SWAP=(1000001001000001) \text{SWAP} = \begin{pmatrix} 1 & 0 & 0 & 0 \\ 0 & 0 & 1 & 0 \\ 0 & 1 & 0 & 0 \\ 0 & 0 & 0 & 1 \end{pmatrix}

SWAP ゲートが上の表式で正しいことを,任意の場合で確認してみましょう。なお,以下ではベクトルのテンソル積の知識を用いています。

ψ=(a1a2),ϕ=(b1b2) | \psi \rangle = \begin{pmatrix} a_1 \\ a_2 \end{pmatrix}, | \phi \rangle = \begin{pmatrix} b_1 \\ b_2 \end{pmatrix}

とします。このとき,2量子状態 ψϕ| \psi \phi \rangle

ψϕ=ψϕ=(a1b1a1b2a2b1a2b2)=a1b100+a1b201+a2b110+a2b200 \begin{aligned} | \psi \phi \rangle &= | \psi \rangle \otimes | \phi \rangle \\ &= \begin{pmatrix} a_1 b_1 \\ a_1 b_2 \\ a_2 b_1 \\ a_2 b_2 \end{pmatrix} \\ &= a_1 b_1 | 00 \rangle + a_1 b_2 | 01 \rangle + a_2 b_1 | 10 \rangle + a_2 b_2 | 00 \rangle \end{aligned}

のように表されます。したがって

SWAPψϕ=a1b100+a1b210+a2b101+a2b200=(a1b1a2b1a1b2a2b2) \begin{aligned} \text{SWAP} | \psi \phi \rangle &= a_1 b_1 | 00 \rangle + a_1 b_2 | 10 \rangle + a_2 b_1 | 01 \rangle + a_2 b_2 | 00 \rangle \\ &= \begin{pmatrix} a_1 b_1 \\ a_2 b_1 \\ a_1 b_2 \\ a_2 b_2 \end{pmatrix} \end{aligned}

となります。一方,ϕψ| \phi \psi \rangle

ϕψ=ϕψ=(b1a1b1a2b2a1b2a2) \begin{aligned} | \phi \psi \rangle &= | \phi \rangle \otimes | \psi \rangle \\ &= \begin{pmatrix} b_1 a_1 \\ b_1 a_2 \\ b_2 a_1 \\ b_2 a_2 \end{pmatrix} \end{aligned}

のように表されます。したがって,任意の2量子状態について

SWAPψϕ=ϕψ \text{SWAP} | \psi \phi \rangle = | \phi \psi \rangle

が成り立ちます。

SWAP ゲートと CNOT ゲートとの対応

制御ビットを ii 番目の量子ビット,標的ビットを jj 番目の量子ビットとした場合の CNOT ゲートを CNOTij\text{CNOT}_{ij} と書くことにします。 このとき,量子回路図からもわかるように,SWAP ゲートと CNOT ゲートの間には,

SWAP=CNOT12CNOT21CNOT12 \text{SWAP} = \text{CNOT}_{12} \cdot \text{CNOT}_{21} \cdot \text{CNOT}_{12}

という関係があります。

計算により確かめてみましょう。まず,CNOT21\text{CNOT}_{21} の行rつ表記について求めます。

CNOT2100=00 \text{CNOT}_{21} |00 \rangle = |00 \rangle

CNOT2101=11 \text{CNOT}_{21} |01 \rangle = |11 \rangle

CNOT2110=10 \text{CNOT}_{21} |10 \rangle = |10 \rangle

CNOT2111=01 \text{CNOT}_{21} |11 \rangle = |01 \rangle

より,

CNOT21=(1000000100100100) \text{CNOT}_{21} = \begin{pmatrix} 1 & 0 & 0 & 0 \\ 0 & 0 & 0 & 1 \\ 0 & 0 & 1 & 0 \\ 0 & 1 & 0 & 0 \end{pmatrix}

と表すことができます。

CNOT12CNOT21CNOT12=CNOT12(1000000100100100)(1000010000010010)=(1000010000010010)(1000001000010100)=(1000001001000001)=SWAP \begin{aligned} \text{CNOT}_{12} \cdot \text{CNOT}_{21} \cdot \text{CNOT}_{12} &= \text{CNOT}_{12} \\ & \cdot \begin{pmatrix} 1 & 0 & 0 & 0 \\ 0 & 0 & 0 & 1 \\ 0 & 0 & 1 & 0 \\ 0 & 1 & 0 & 0 \end{pmatrix} \cdot \begin{pmatrix} 1 & 0 & 0 & 0 \\ 0 & 1 & 0 & 0 \\ 0 & 0 & 0 & 1 \\ 0 & 0 & 1 & 0 \end{pmatrix} \\ &= \begin{pmatrix} 1 & 0 & 0 & 0 \\ 0 & 1 & 0 & 0 \\ 0 & 0 & 0 & 1 \\ 0 & 0 & 1 & 0 \end{pmatrix} \cdot \begin{pmatrix} 1 & 0 & 0 & 0 \\ 0 & 0 & 1 & 0 \\ 0 & 0 & 0 & 1 \\ 0 & 1 & 0 & 0 \end{pmatrix} \\ &= \begin{pmatrix} 1 & 0 & 0 & 0 \\ 0 & 0 & 1 & 0 \\ 0 & 1 & 0 & 0 \\ 0 & 0 & 0 & 1 \end{pmatrix} \\ & = \text{SWAP} \end{aligned}

【補足】2量子ビットゲートとユニタリ性

1量子ビットゲートは全てユニタリ行列であるという性質があります。この記事で紹介した2量子ビットゲートも,全てユニタリ行列となっていることが確認できます。ぜひ,練習問題としてやってみてください。

ユニタリ行列については

なども併せてご参照ください。

制御ビットと標的ビットは,計算や図と対応づけて覚えるのがやや難しいので,注意が必要です。