SIP第3期量子技術課題「教育プログラムの開発と実践」教育コースプログラム「量子技術入門コース」の第九講に参加してきました。
https://skillup-next.co.jp/sip_3period_01
今回は古典コンピュータとの比較、量子誤り訂正、量子コンピュータのハードウェアについての内容でした。以下では、前回の記事で「量子回路は行列の掛け算」と書いたことの続きとして、古典の論理回路を行列にすると何が見えてくるのかをご紹介します。
第八講の記事では、量子回路が「ベクトルに行列を順番に掛けていく計算」であることを確認しました。実は、これは量子コンピュータ特有の話ではなく、古典コンピュータも行列の掛け算で表現できます。
では、たとえば AND ゲートを行列にするとどうなるのでしょうか?やってみると、縦2×横4の、正方ではない行列になります。
本記事では、この「正方ではない」ところから出発します。行列の形に着目すると、計算について次のことがわかります。
本題に入る前に、ここでいう「古典回路」が何を指すのかを確認しておきます。
普段使っているパソコンやスマートフォンの中では、すべての情報が 0 と 1 の並び、つまりビットで表されています。電子回路の上では、電圧が高いか低いかで 1 と 0 を区別しています。
このビットを加工する最小の部品が論理ゲートです。代表的なものを挙げます。
2入力のゲートの働きは、入力4通りに対する出力を並べた真理値表で表せます。
| 入力 \(a\,b\) | AND | OR | XOR |
|---|---|---|---|
| 00 | 0 | 0 | 0 |
| 01 | 0 | 1 | 1 |
| 10 | 0 | 1 | 1 |
| 11 | 1 | 1 | 0 |
実際のチップでは、1つのゲートは数個のトランジスタ(電気で開け閉めするスイッチ)で作られています。
ゲートの出力を別のゲートの入力に配線していくと、もっと複雑な処理ができます。これが論理回路です。本記事で「古典回路」と呼んでいるのはこれのことです。
状態ベクトルの作り方は第八講と同じです。1ビットなら、
\[|0\rangle = \begin{pmatrix}1\\0\end{pmatrix}, \qquad |1\rangle = \begin{pmatrix}0\\1\end{pmatrix}\]
2ビットなら 00, 01, 10, 11 の4通りを並べた4次元のベクトルで、1ビットのベクトルどうしのテンソル積として作れます。
\[\begin{aligned} |00\rangle &= |0\rangle \otimes |0\rangle = \begin{pmatrix}1\\0\end{pmatrix} \otimes \begin{pmatrix}1\\0\end{pmatrix} = \begin{pmatrix}1\\0\\0\\0\end{pmatrix}, & |01\rangle &= |0\rangle \otimes |1\rangle = \begin{pmatrix}1\\0\end{pmatrix} \otimes \begin{pmatrix}0\\1\end{pmatrix} = \begin{pmatrix}0\\1\\0\\0\end{pmatrix}, \\[6pt] |10\rangle &= |1\rangle \otimes |0\rangle = \begin{pmatrix}0\\1\end{pmatrix} \otimes \begin{pmatrix}1\\0\end{pmatrix} = \begin{pmatrix}0\\0\\1\\0\end{pmatrix}, & |11\rangle &= |1\rangle \otimes |1\rangle = \begin{pmatrix}0\\1\end{pmatrix} \otimes \begin{pmatrix}0\\1\end{pmatrix} = \begin{pmatrix}0\\0\\0\\1\end{pmatrix} \end{aligned}\]
です。古典のビットは必ずどれか1つに決まっているので、ベクトルはどれか1つの成分だけが 1 の形になります。
AND ゲートは2ビットを受け取って1ビットを返すので、4次元のベクトルを2次元のベクトルに移す行列、つまり縦2×横4の行列になります。
\[\mathrm{AND} = \begin{pmatrix}1&1&1&0\\0&0&0&1\end{pmatrix}\]
列は左から入力 00, 01, 10, 11、行は上から出力 0, 1 に対応します。たとえば入力 \(|11\rangle\) を掛けると、4列目が取り出されて \((0, 1)^T = |1\rangle\)、つまり出力「1」になります。
\[\begin{pmatrix}1&1&1&0\\0&0&0&1\end{pmatrix}\begin{pmatrix}0\\0\\0\\1\end{pmatrix} = \begin{pmatrix}0\\1\end{pmatrix}\]
この行列は、列を左から読むとそのまま真理値表になっています。
| 入力 | 00 | 01 | 10 | 11 |
|---|---|---|---|---|
| 出力 | 0 | 0 | 0 | 1 |
| 行列の列 | \((1,0)^T\) | \((1,0)^T\) | \((1,0)^T\) | \((0,1)^T\) |
ここから2つのことが読み取れます。
1つ目:どの列にも 1 がちょうど1個ある。 入力を1つ決めると出力が1つに決まる、という「決定的な計算」であることの表れです。
2つ目:1行目には 1 が3個ある。 出力が 0 になる入力が3通りある、ということです。出力 0 を見ても、入力が 00・01・10 のどれだったのかはわかりません。情報が失われていて、逆向きにたどれないのです。行列の言葉で言えば、2×4 の行列には逆行列がありません。
同じやり方で、ほかのゲートも行列にできます。
\[\mathrm{OR} = \begin{pmatrix}1&0&0&0\\0&1&1&1\end{pmatrix}, \quad \mathrm{XOR} = \begin{pmatrix}1&0&0&1\\0&1&1&0\end{pmatrix}\]
ちなみに、「2×4 で、どの列にも 1 がちょうど1個」という行列は、各列で 1 を上下どちらに置くかの選び方が \(2^4 = 16\) 通りあります。2入力の論理関数はちょうど16種類なので、2入力の論理ゲートと、この形の行列は一対一に対応しています。
上で見たとおり、2ビットの入力ベクトルは1ビットどうしのテンソル積で書けました。では、AND の行列も、1本目にかける行列 \(A\) と2本目にかける行列 \(B\) のテンソル積 \(A \otimes B\) に分けられるでしょうか。
答えは「分けられない」です。\(A \otimes B\) は「1本目に \(A\)、2本目に \(B\) を、それぞれ独立にかける」という意味です。AND の出力は1ビット(2次元)しかないので、出力の次元を \(2 = 2 \times 1\) と分けるしかなく、どちらか一方は出力が1次元の行列、つまり入力をただ捨てる \((1\ \ 1)\) になります(1行しかない行列で「どの列にも 1 がちょうど1個」となるのは、これだけです)。すると出力は、残ったもう1本の入力だけで決まってしまいます。AND は2本の入力を両方見て初めて出力が決まるゲートなので、独立な操作の組には分解できないのです。2量子ビットのもつれた状態が、1量子ビットどうしのテンソル積で書けなかったのと同じ構造です。
ただし、テンソル積の和なら書けます。1本目が 0 か 1 かで場合分けして、
と考えると、AND の出力は2本目に残った値になります。これを行列で書くと次のとおりです。
\[\mathrm{AND} = (1\ \ 0)\otimes\begin{pmatrix}1&1\\0&0\end{pmatrix} + (0\ \ 1)\otimes\begin{pmatrix}1&0\\0&1\end{pmatrix}\]
1項目の \(\begin{pmatrix}1&1\\0&0\end{pmatrix}\) は、0 が来ても 1 が来ても 0 を返す「リセット」で、以下 \(\mathrm{RESET}\) と書きます。\((1\ \ 0)\) は「1本目が 0 のときだけ通して、1本目自体は捨てる」、\((0\ \ 1)\) は「1本目が 1 のときだけ通して捨てる」という横長の行列です。
このことは、実際に入力 \(|a\rangle \otimes |b\rangle\) にかけてみると確かめられます。テンソル積には
\[(A \otimes B)(C \otimes D) = AC \otimes BD\]
という性質(混合積の法則)があり、1本目と2本目を分けて計算できます。1項目なら、
\[\Bigl((1\ \ 0) \otimes \mathrm{RESET}\Bigr)\Bigl(|a\rangle \otimes |b\rangle\Bigr) = \Bigl((1\ \ 0)\,|a\rangle\Bigr) \otimes \Bigl(\mathrm{RESET}\,|b\rangle\Bigr)\]
です。ここで \((1\ \ 0)\,|0\rangle = 1\)、\((1\ \ 0)\,|1\rangle = 0\) はただの数なので、\(a = 0\) のときは \(\mathrm{RESET}\,|b\rangle = |0\rangle\) が残り、\(a = 1\) のときはこの項が丸ごと 0 になって消えます。2項目も同じで、\(a = 1\) のときだけ \(|b\rangle\) がそのまま残ります。
第八講で見た CNOT も、同じように1本目の値で場合分けして書くと
\[\mathrm{CNOT} = \begin{pmatrix}1&0\\0&0\end{pmatrix}\otimes I + \begin{pmatrix}0&0\\0&1\end{pmatrix}\otimes X\]
となり、AND とまったく同じ「制御付き」の形をしています。違うのは、CNOT では制御ビットが残るのに対し、AND では制御ビットを最後に捨てているところです。その分だけ行列が横長になっています。
プログラムを書く方は、この場合分けに見覚えがあるかもしれません。多くのプログラミング言語では、a && b を評価するとき、a が偽ならその時点で偽を返し、b は見もしません。a が真のときだけ b を評価して、その値をそのまま返します。いわゆる短絡評価(ショートサーキット)で、上の式の2つの項はちょうどこの2つの場合に対応しています。
AND の行列で見たのは、2ビットが1ビットに減る、つまり情報を捨てる操作でした。古典回路には、量子回路にはない自由がほかにもあります。
論理回路では、1本の配線を途中で枝分かれさせて、同じ信号を複数のゲートに配るのはごく普通のことです。この枝分かれ(ファンアウト)を1つのゲートとみなして COPY と呼ぶことにすると、1ビットを受け取って2ビットを返すので、縦4×横2の行列になります。
\[\mathrm{COPY} = \begin{pmatrix}1&0\\0&0\\0&0\\0&1\end{pmatrix}\]
\(|0\rangle\) を \(|00\rangle\) に、\(|1\rangle\) を \(|11\rangle\) に移します。今度は縦長の行列です。2行目と3行目(\(|01\rangle\) と \(|10\rangle\))は全部 0 で、行き先として使われない状態がありますが、どの行にも 1 は1個以下なので、出力から入力を一意に復元できます。縦長の行列は「情報は失わないが、空きがある」形です。
COPY も AND と同じく、1つのテンソル積には分解できません。入力は1ビットしかないので、出力の2本目は「入力を見ずに決まった状態を1つ用意する」縦ベクトルにするしかなく、それでは2本目がいつも同じ値になってしまいます。「2本目が1本目と同じ値になる」という結びつきは、独立な操作の組では作れないのです。
一方、AND と同じく、入力が 0 か 1 かで場合分けすればテンソル積の和で書けます。
これを行列で書くと次のとおりです。
\[\mathrm{COPY} = \begin{pmatrix}1&0\\0&0\end{pmatrix}\otimes\begin{pmatrix}1\\0\end{pmatrix} + \begin{pmatrix}0&0\\0&1\end{pmatrix}\otimes\begin{pmatrix}0\\1\end{pmatrix}\]
\(\begin{pmatrix}1&0\\0&0\end{pmatrix}\) は「入力が 0 のときだけ通す」、\(\begin{pmatrix}0&0\\0&1\end{pmatrix}\) は「入力が 1 のときだけ通す」行列で、そこに2本目として用意する縦ベクトルをテンソル積でくっつけています。
AND の和の形と並べると、違いがはっきりします。
| 1本目で場合分けしたあと | 和の各項に現れるもの | |
|---|---|---|
| AND | 1本目を捨てる | 横ベクトル \((1\ \ 0)\), \((0\ \ 1)\) |
| COPY | 2本目を作る | 縦ベクトル \((1, 0)^T\), \((0, 1)^T\) |
どちらも「1本目の値で場合分けする」という制御付きの形をしていて、違うのは、横ベクトルで捨てるか、縦ベクトルで作るかだけです。行列が横長になるか縦長になるかが、そのまま式の形に表れています。
一般に、\(n\) ビットを受け取って \(m\) ビットを返す操作は、縦 \(2^m\) ×横 \(2^n\) の行列になります。横長ならビットが減り(捨てる)、縦長ならビットが増える(コピーする)。行列の縦横の比が、そのままビット数の増減を表しています。
ちなみに、動いている回路の途中の配線にテスターを当てて値を読むのも、信号を1本分けて取り出しているので COPY の一種です。古典回路では、途中を覗いても計算は何も変わりません。
逆に、使わなくなった配線はそのまま捨てられます。1ビットを捨てる操作は、1ビットを受け取って何も返さない(0ビット、つまり1次元)ので、縦1×横2の行列です。
\[\mathrm{ERASE} = (1\ \ 1)\]
0 が来ても 1 が来ても、ただの数 1 を返します。2本の配線のうち1本目だけを捨てるなら、2本目には何もしない \(I\) とのテンソル積 \(\mathrm{ERASE} \otimes I\) をかけます。混合積の法則を使うと、
\[(\mathrm{ERASE} \otimes I)\bigl(|a\rangle \otimes |b\rangle\bigr) = \bigl(\mathrm{ERASE}\,|a\rangle\bigr) \otimes \bigl(I\,|b\rangle\bigr) = 1 \cdot |b\rangle = |b\rangle\]
で、1本目が何であっても、2本目の \(|b\rangle\) はそのまま残ります。捨てた配線は、残った配線に何の影響も与えません。
コピーしても、捨てても、途中を覗いても困らない。その理由は、古典の状態ベクトルがいつでも基底ベクトルのどれか1つだからです。
まず、古典の状態は必ず \(|a\rangle \otimes |b\rangle \otimes \cdots\) と、1本ずつのテンソル積に分けられます。第八講で見た「もつれ」が起きないので、どれか1本を捨てても、残りの配線の状態ははっきり決まったままです。上の \(\mathrm{ERASE} \otimes I\) の計算がうまくいったのは、入力が \(|a\rangle \otimes |b\rangle\) の形をしていたからです。
さらに、入力が必ず基底ベクトルなので、行列は「入力に対応する列を1本取り出す」という使い方しかされません。行列はただの真理値表として働いていて、行列が線形である(足し算を保つ)ことが一度も試されないのです。
量子回路では、ここが変わります。状態は重ね合わせになり、もつれも起きます。そうなると線形性がまともに効いてきて、古典では当たり前だった「コピーする」「捨てる」が、そのままでは通用しなくなります。この話は後半で詳しく見ます。
量子アルゴリズムといっても、中で行う計算がすべて量子特有というわけではありません。第八講で、量子アルゴリズムは「重ね合わせ → 問題を解く制御ゲート → 干渉 → 測定」という骨組みでできていると書きました。このうち真ん中の「問題を解く」部分、たとえばグローバーのアルゴリズムの当たり判定 \(f(x)\) や、ショアのアルゴリズムの剰余べき乗 \(a^x \bmod N\) は、計算そのものは普通の論理回路で書けるものです。ショアのアルゴリズムでは、ゲート数の大部分をこの剰余べき乗が占めています。
量子アルゴリズムになるのは、その古典の計算を重ね合わせの入力に対して動かすところです。
\[\frac{1}{\sqrt{2^n}}\sum_x |x\rangle|0\rangle \ \to\ \frac{1}{\sqrt{2^n}}\sum_x |x\rangle|f(x)\rangle\]
行列は線形なので、すべての \(x\) に対する \(f(x)\) が、重ね合わせの中で一度に計算されます。ただし測定で読み出せるのはそのうち1つだけなので、そのあと量子特有の部品(逆量子フーリエ変換やグローバーの拡散)で干渉させて、必要な情報を取り出します。
ところが、そのまま組み込むことはできません。第八講で見たとおり、量子のゲートはユニタリ行列 \(U\) で、\(U^\dagger U = U U^\dagger = I\) を満たします。確率の合計(ベクトルの長さ)を保ち、しかも逆向きにもたどれる、という条件です。この両側の条件があるので、ユニタリ行列は必ず正方で、逆行列 \(U^\dagger\) を持ちます。測定を除けば、量子回路は必ず逆向きにたどれるのです。
なので、AND のような横長の行列は、そのままでは量子回路に入れられません。では、どうすればよいか。
答えは単純で、入力を捨てずに出力と一緒に返せばよいのです。
AND なら、入力 \(a, b\) をそのまま残し、もう1本の配線に結果を書き込みます。
\[|a,\ b,\ 0\rangle \ \to\ |a,\ b,\ a \wedge b\rangle\]
これは Toffoli ゲートと呼ばれています。入力が残っているので、出力から入力を必ず復元できます。
ここで行列の形に注目します。3本目に 0 を入れる使い方に限ると、入力は4通り(\(a, b\) の組み合わせ)、出力は3ビットで8通りなので、縦8×横4の縦長の行列です。COPY と同じで「情報は失わないが、空きがある」形です。Toffoli ゲートは、この空き(3本目に 1 を入れた場合)にも行き先を割り当てて、8×8 の置換行列に仕上げたものだと見ることができます。
可逆であるための条件も確認しておきます。正方行列であるだけでは足りません。たとえば AND を和の形で書いたときに出てきた \(\mathrm{RESET} = \begin{pmatrix}1&1\\0&0\end{pmatrix}\) は 2×2 の正方行列ですが、0 も 1 も 0 に移してしまうので逆向きにたどれません。逆向きにたどれるのは、各行・各列に 1 がちょうど1個ある置換行列のときだけです。Toffoli ゲートはこの条件を満たしていて、置換行列はユニタリ行列の一種なので、そのまま量子回路に載せられます。
ただし、可逆にしただけ代償もあります。欲しかったのは \(a \wedge b\) だけなのに、出力には入力の \(a, b\) も付いてきます。このような、答え以外の余分な出力をゴミビット(garbage)と呼びます。
この「入力や途中結果を捨てずに残せば、どんな計算も可逆にできる」ことを一般的に示したのが Bennett です[1]。そして AND と NOT の組み合わせでどんな論理回路も作れるので、Toffoli ゲートを並べればどんな古典の計算も可逆な回路で書けます[2]。グローバーの当たり判定も、ショアの剰余べき乗も、量子回路の中ではこうして可逆に直した形で動いています。
可逆に直せば、古典の計算を量子回路に載せられます。ただし、可逆に直すとゴミビットが出てきます。古典回路ならゴミビットは無視して放っておけばよいのですが、量子回路ではゴミビットが計算を壊します。
第八講のコラムでは、量子計算の力の源は干渉だと書きました。H を2回かけると、2回目で「1」の成分が \(+\frac12\) と \(-\frac12\) で打ち消し合って、元に戻ります。
\[H = \frac{1}{\sqrt2}\begin{pmatrix}1&1\\1&-1\end{pmatrix}, \qquad \begin{pmatrix}1\\0\end{pmatrix} \ \xrightarrow{H}\ \frac{1}{\sqrt2}\begin{pmatrix}1\\1\end{pmatrix} \ \xrightarrow{H}\ \begin{pmatrix}1\\0\end{pmatrix}\]
この2回の H の間に、計算の途中結果がゴミビットとして残った場合を考えます。一番単純な例として、2本目の配線をゴミビットとして用意し、1本目の値をそこに書き写す(CNOT)だけのゴミを挟んでみます。
まず比較のために、ゴミがない場合を2本の配線で書いておきます。1本目にだけ H をかける行列は \(H \otimes I\) です。
\[H \otimes I = \frac{1}{\sqrt2}\begin{pmatrix}1&0&1&0\\0&1&0&1\\1&0&-1&0\\0&1&0&-1\end{pmatrix}\]
これを2回かけると、
\[\begin{pmatrix}1\\0\end{pmatrix}\otimes\begin{pmatrix}1\\0\end{pmatrix} \ \xrightarrow{H \otimes I}\ \frac{1}{\sqrt2}\begin{pmatrix}1\\1\end{pmatrix}\otimes\begin{pmatrix}1\\0\end{pmatrix} \ \xrightarrow{H \otimes I}\ \begin{pmatrix}1\\0\end{pmatrix}\otimes\begin{pmatrix}1\\0\end{pmatrix}\]
です。混合積の法則により、1本目には H が、2本目には \(I\) がそれぞれかかるだけなので、1本目は1量子ビットのときと同じように打ち消し合って元に戻り、2本目は \((1, 0)^T\) のまま変わりません。4成分のベクトルで書けば \((1,0,0,0)^T \to \frac{1}{\sqrt2}(1,0,1,0)^T \to (1,0,0,0)^T\) で、2回目に3番目の成分(「10」)が \(\frac12 – \frac12 = 0\) と打ち消し合っています。
次に、2回の H の間に CNOT を挟みます。CNOT は、1本目が 1 のときだけ2本目を反転するゲートで、行列で書くと
\[\mathrm{CNOT} = \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\end{pmatrix}\otimes I + \begin{pmatrix}0&0\\0&1\end{pmatrix}\otimes X\]
です。1本目が 1 の部分、つまり3番目と4番目の成分(「10」と「11」)だけを入れ替えます。1本目が 0 なら2本目には何もせず(\(I\))、1 なら2本目を反転する(\(X\))、という意味です。
これをかけるために、1回目の H のあとの状態も、1本目が 0 の部分と 1 の部分に分けて書いておきます。
\[\frac{1}{\sqrt2}\begin{pmatrix}1\\1\end{pmatrix}\otimes\begin{pmatrix}1\\0\end{pmatrix} = \frac{1}{\sqrt2}\left[\begin{pmatrix}1\\0\end{pmatrix}\otimes\begin{pmatrix}1\\0\end{pmatrix} + \begin{pmatrix}0\\1\end{pmatrix}\otimes\begin{pmatrix}1\\0\end{pmatrix}\right]\]
CNOT は、1本目が 0 の項には2本目に \(I\) を、1本目が 1 の項には2本目に \(X\) をかけるので、
\[\xrightarrow{\text{CNOT}}\ \frac{1}{\sqrt2}\left[\begin{pmatrix}1\\0\end{pmatrix}\otimes\begin{pmatrix}1\\0\end{pmatrix} + \begin{pmatrix}0\\1\end{pmatrix}\otimes\begin{pmatrix}0\\1\end{pmatrix}\right] \ \xrightarrow{H \otimes I}\ \frac12\left[\begin{pmatrix}1\\1\end{pmatrix}\otimes\begin{pmatrix}1\\0\end{pmatrix} + \begin{pmatrix}1\\-1\end{pmatrix}\otimes\begin{pmatrix}0\\1\end{pmatrix}\right]\]
となります(4成分のベクトルで書けば \(\frac12(1, 1, 1, -1)^T\) です)。1本目を測って 0 が出る確率は、2つの項の1本目の上の成分から \(\left(\frac12\right)^2 + \left(\frac12\right)^2 = \frac12\) です。0 と 1 が確率半々で出てきて、元に戻らなくなりました。
\(+\frac12\) と \(-\frac12\) はちゃんと出てきています。1本目の下の成分は、1項目では \(+\frac12\)、2項目では \(-\frac12\) です。ところが、1項目の2本目は \((1, 0)^T\)、2項目の2本目は \((0, 1)^T\) と、別々のベクトルにくっついているので、2つの項をまとめられず、打ち消し合えません。
ゴミがない場合と比べると違いがはっきりします。ゴミがなければ、2回目の H のあとは
\[\frac12\left[\begin{pmatrix}1\\1\end{pmatrix}\otimes\begin{pmatrix}1\\0\end{pmatrix} + \begin{pmatrix}1\\-1\end{pmatrix}\otimes\begin{pmatrix}1\\0\end{pmatrix}\right] = \frac12\begin{pmatrix}2\\0\end{pmatrix}\otimes\begin{pmatrix}1\\0\end{pmatrix} = \begin{pmatrix}1\\0\end{pmatrix}\otimes\begin{pmatrix}1\\0\end{pmatrix}\]
で、2本目が同じ \((1, 0)^T\) なので2つの項を1つにまとめられ、1本目の \(+\frac12\) と \(-\frac12\) が打ち消し合います。打ち消し合うには、2本目まで含めて同じでなければならないのです。CNOT のあとの状態は、第八講で見た「共通の相手でくくり出せない」形、つまり1つの積にまとめ直せない形になっています。
とはいえ、恒等操作でないものを途中に挟めば結果が変わるのは当たり前だ、と思うかもしれません。そこで比較のために、CNOT の代わりに、2本目だけを反転する \(I \otimes X\) を挟んでみます。これも恒等操作ではなく、1番目と2番目、3番目と4番目の成分を入れ替える行列です。
\[I \otimes X = \begin{pmatrix}0&1&0&0\\1&0&0&0\\0&0&0&1\\0&0&1&0\end{pmatrix}\]
\[\frac{1}{\sqrt2}\begin{pmatrix}1\\1\end{pmatrix}\otimes\begin{pmatrix}1\\0\end{pmatrix} \ \xrightarrow{I \otimes X}\ \frac{1}{\sqrt2}\begin{pmatrix}1\\1\end{pmatrix}\otimes\begin{pmatrix}0\\1\end{pmatrix} \ \xrightarrow{H \otimes I}\ \begin{pmatrix}1\\0\end{pmatrix}\otimes\begin{pmatrix}0\\1\end{pmatrix}\]
2本目は 1 に変わりましたが、状態はずっと1つのテンソル積のままで、1本目は \(\frac{1}{\sqrt2}(1, 1)^T\) から確率1で \((1, 0)^T\) に戻ります。干渉は壊れていません。
\(I \otimes X\) も CNOT も、1本目の 0・1 を書き換えることはしません。違うのは、\(I \otimes X\) が1本目と無関係に2本目を反転するのに対し、CNOT は1本目の値を2本目に記録していることです。式の形で言えば、\(I \otimes X\) は1つのテンソル積で書けるのに対し、CNOT は1本目の値で場合分けした和でしか書けません。古典回路なら、1本目の値を別の配線に書き写しておくのは、途中の配線にテスターを当てて値を控えるのと同じで、1本目の計算には何の影響もない操作でした。量子回路では、その「記録しただけ」で干渉が壊れるのです。
CNOT のあとの状態 \(\frac{1}{\sqrt2}\left[(1,0)^T\otimes(1,0)^T + (0,1)^T\otimes(0,1)^T\right]\)(4成分では \(\frac{1}{\sqrt2}(1, 0, 0, 1)^T\))は、第八講で見たもつれた状態です。2つの項の和でしか書けず、1本目と2本目のベクトルの1つのテンソル積には分解できません。ゴミビットが1本目の値を記録したことで、1本目とゴミビットがもつれてしまい、干渉が起きなくなったのです。
対策は、使い終わったゴミビットを逆計算で消すことです。上の例なら、2回目の H の前にもう一度 CNOT をかければ、2項目の2本目がまた反転されて、
\[\frac{1}{\sqrt2}\left[\begin{pmatrix}1\\0\end{pmatrix}\otimes\begin{pmatrix}1\\0\end{pmatrix} + \begin{pmatrix}0\\1\end{pmatrix}\otimes\begin{pmatrix}0\\1\end{pmatrix}\right] \ \xrightarrow{\text{CNOT}}\ \frac{1}{\sqrt2}\left[\begin{pmatrix}1\\0\end{pmatrix}\otimes\begin{pmatrix}1\\0\end{pmatrix} + \begin{pmatrix}0\\1\end{pmatrix}\otimes\begin{pmatrix}1\\0\end{pmatrix}\right] = \frac{1}{\sqrt2}\begin{pmatrix}1\\1\end{pmatrix} \otimes \begin{pmatrix}1\\0\end{pmatrix}\]
と、ゴミビットが 0 に戻り、2本目が共通になった2つの項が1つのテンソル積にまとまります。もつれが解けたので、あとは \(H \otimes I\) で \((1, 0)^T \otimes (1, 0)^T\) に戻ります。
一般の計算でも同じ手順が使えます。
可逆回路の行列は置換行列なので、逆向きの回路は転置をとるだけで作れます。ゲート数はおよそ2倍になりますが、残るのは入力と答えだけになります。この手順をアンコンピュテーション(uncomputation)と呼び、これも Bennett が古典の可逆計算のために考えた手法です[1]。
第八講で、グローバーのオラクルは「当たりの符号だけを反転する」と書きました。実際のオラクルでは、当たりかどうかを判定する計算の途中で作業用の量子ビットを使います。それを最後にアンコンピュテーションで 0 に戻しているからこそ、オラクルはきれいに符号だけを反転でき、そのあとの拡散で干渉が起きるのです。
最後に COPY を見ます。COPY は縦長の行列でしたが、Toffoli と同じように、2本目に 0 を入れる使い方に限った行列と見て、空きを埋めて正方にすると CNOT になります。実際、1本目の入力に「2本目の 0」を付け足す行列 \(I \otimes (1, 0)^T\) と CNOT を掛けると、
\[\underbrace{\begin{pmatrix}1&0&0&0\\0&1&0&0\\0&0&0&1\\0&0&1&0\end{pmatrix}}_{\text{CNOT}} \underbrace{\begin{pmatrix}1&0\\0&0\\0&1\\0&0\end{pmatrix}}_{I \otimes (1,0)^T} = \begin{pmatrix}1&0\\0&0\\0&0\\0&1\end{pmatrix} = \mathrm{COPY}\]
と、前半で見た COPY の行列がそのまま出てきます。0 や 1 を入れれば、ちゃんと2つにコピーされます。
では、重ね合わせ \((a, b)^T\) を入れるとどうなるか。
\[\mathrm{COPY}\begin{pmatrix}a\\b\end{pmatrix} = \begin{pmatrix}1&0\\0&0\\0&0\\0&1\end{pmatrix}\begin{pmatrix}a\\b\end{pmatrix} = \begin{pmatrix}a\\0\\0\\b\end{pmatrix}\]
です。一方、本当にコピーできたなら、出てきてほしいのは同じベクトル2つのテンソル積
\[\begin{pmatrix}a\\b\end{pmatrix} \otimes \begin{pmatrix}a\\b\end{pmatrix} = \begin{pmatrix}a^2\\ab\\ab\\b^2\end{pmatrix}\]
です。\(a\) と \(b\) がどちらも 0 でない限り、この2つは一致しません。実際に出てきた \((a, 0, 0, b)^T\) は、上のゴミビットの例で出てきたのと同じ形のもつれた状態でした。前半で見たとおり、COPY は1つのテンソル積には分解できず、「1本目と2本目を同じ値に結びつける」操作でした。古典の入力ではその結びつきは「同じ値が2つ並ぶ」だけですが、重ね合わせを入れると、その結びつきがもつれとして現れるのです。
ここで効いているのは「行列は線形」という一点です。コピーしたベクトルには \(a^2\) や \(ab\) のような2次の項が出てきますが、行列を掛けても、出てくる成分は \(a\) と \(b\) の1次式にしかなりません。なので、CNOT に限らず、どんな行列を使っても、任意の量子状態をコピーすることはできません。これが量子複製不可能定理(no-cloning theorem)です[3]。
古典では、コピーは当たり前すぎてゲートとも思われない操作でした。古典のビットはいつでも 0 か 1 のどちらかに決まっていて、その値を写せばよいからです。量子では、成分 \(a, b\) そのものが情報で、それは1次式の行列ではコピーできません。
古典と量子の回路を、行列の形で比べてみます。
| 古典の論理回路 | 量子回路 | |
|---|---|---|
| 行列の形 | 長方形が普通(\(2^m \times 2^n\)) | 必ず正方 |
| 行列の種類 | 各列に 1 が1個 | ユニタリ行列 |
| 情報を捨てる | 自由(AND、リセット) | できない(逆向きにたどれる) |
| 途中結果(ゴミ) | 放っておいてよい | 干渉を壊すので逆計算で消す |
| コピー | 自由 | 任意の状態はコピーできない |
古典回路は、情報を捨てることもコピーすることも自由です。だから行列は横長にも縦長にもなります。量子回路の行列は必ず正方で、しかもユニタリでなければなりません。
量子回路が「捨てられない」「コピーできない」のは、量子回路が正方行列(ユニタリ行列)であることの裏返し。
第八講のコラムでは、量子計算の力が「行列に負の数を入れてよい」ことから来ていると書きました。その力を使う代わりに、量子回路は「捨てる」と「コピーする」という、古典では当たり前だった2つの操作をあきらめています。古典の計算を量子回路に持ち込むときに Toffoli ゲートやアンコンピュテーションといった手間が必要になるのは、そのためです。
[1] 可逆計算とアンコンピュテーション
C. H. Bennett, “Logical reversibility of computation,” IBM Journal of Research and Development 17, 525–532 (1973).
[2] Toffoli ゲートの万能性
T. Toffoli, “Reversible computing,” in Automata, Languages and Programming (ICALP 1980), Lecture Notes in Computer Science 85, 632–644 (1980).
[3] 量子複製不可能定理
W. K. Wootters, W. H. Zurek, “A single quantum cannot be cloned,” Nature 299, 802–803 (1982).