10
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

制御ビット、右を使うか?左を使うか?

Last updated at Posted at 2021-02-01

この記事について

量子ゲート型を実装するのにいくつかのツールがあります。
ツール毎に実装が違うといった話は様々な分野で良くある話ですが、量子ゲート型のツールにおいてもそういった話がいくつかあります。
もちろん数学的に異なっていたり、理論的に構造が明らかにおかしいといった違いも世の中にはありますが、
今回は単なる解釈の違いでツール毎の実装が異なっていたのでせっかくなのでまとめていこうと思います。

また、量子コンピュータ関係の他の記事は、下記で紹介しています。

概要

量子ゲート操作に関して制御ゲートというものがあります。
具体例でいうと、制御Xゲート(制御NOTゲート)などがあります。
制御Xゲートを実際の行列で示すと以下のように示されます。

C_X =
\begin{pmatrix}
1 & 0 & 0 & 0\\
0 & 0 & 0 & 1\\
0 & 0 & 1 & 0\\
0 & 1 & 0 & 0
\end{pmatrix}.

もしくは、

C_X =
\begin{pmatrix}
1 & 0 & 0 & 0\\
0 & 1 & 0 & 0\\
0 & 0 & 0 & 1\\
0 & 0 & 1 & 0
\end{pmatrix}.

上記を二つあげているのは制御ビットによって行列が異なるためです。
今回はその意味を解き明かしていきます。

また、特に知っておく必要はないのですが、頭の整理と3量子ビット以上(今回は2量子しか扱いません。)を考えていくうえで重要になってくるため、
量子ビットの(順番を含めた)読み方を整理しておくのも良いかと思います。
是非、上記の記事も読んでみてください。
また、制御ビットに応じて制御ゲートの行列表記が異なるため、チートシートを作っておきました。
お役に立てればと思います。

では早速説明に入っていきます。

量子ビットの順番

まず、制御ゲートの話をする前に2量子系のビットの数え方を整理します。
詳しくはこちらの記事に記載しているのでそちらを見ていただきたいのですが、
今回はQiskitで採用されている

  • Qiskitの最上位ビット(Most Significant Bit - MSB)は

の考え方を適用していきます。
なので上記記事にも記載している通り、AmazonBraketは逆の考え方で考えることができることも把握しておくと良いかと思います。

上記記事でも記載している通り、

  • 0量子ビット目を制御ビットにすると以下の$\bf{\color{red}{赤色}}$で示した要素が制御ビットとして作用します。
  • 1量子ビット目を制御ビットにすると以下の$\bf{\color{blue}{青色}}$で示した要素が制御ビットとして作用します。
\begin{pmatrix} |{00}\rangle \\ |{0\color{red}1}\rangle \\ |{10}\rangle \\ |{1\color{red}1}\rangle \end{pmatrix},
\begin{pmatrix} |{00}\rangle \\ |{01}\rangle \\ |{\color{blue}10}\rangle \\ |{\color{blue}11}\rangle \end{pmatrix}.

となることに注意しましょう。

2量子ビット制御ゲート

制御ゲートは2量子ビット系において片方の量子ビットが $|1 \rangle $のとき、もう片方の量子ビットに対して$U$を適用します。
ここで$U$は以下の行列表示で示されます。

\begin{split}U = \begin{pmatrix} u_{00} & u_{01} \\ u_{10} & u_{11}\end{pmatrix}.\end{split}

0量子ビット目が制御ビットの場合

まずは0量子ビット目が制御ビットの場合を考えてみます。
ここで

  • Qiskitの最上位ビット(Most Significant Bit - MSB)は

というルールを思い出しておきましょう。
そうすると制御量子ビットは0量子ビット、つまり0量子ビット目が $|1\rangle$であれば $U$を1量子ビット目に適用します。
なので対応としては以下の通りとなります。

\begin{align*}
{\left|0\right\rangle}\otimes {\left|0\right\rangle} 
&\rightarrow 
{\left|0\right\rangle}\otimes {\left|0\right\rangle}\\

{\left|0\right\rangle}\otimes {\left|\color{red}1\right\rangle} 
&\rightarrow 
{U\left|0\right\rangle}\otimes {\left|\color{red}1\right\rangle}\\

{\left|1\right\rangle}\otimes {\left|0\right\rangle} 
&\rightarrow 
{\left|1\right\rangle}\otimes {\left|0\right\rangle}\\

{\left|1\right\rangle}\otimes {\left|\color{red}1\right\rangle} 
&\rightarrow 
{U\left|1\right\rangle}\otimes {\left|\color{red}1\right\rangle}.

\end{align*}

上記をベクトルで示すと、

\begin{align*}
\begin{pmatrix} 1 \\ 0 \\ 0 \\ 0 \end{pmatrix}
\rightarrow 
\begin{pmatrix} 1 \\ 0 \\ 0 \\ 0 \end{pmatrix}, 
\ 
\begin{pmatrix} 0 \\ 1 \\ 0 \\ 0 \end{pmatrix}
\rightarrow
\begin{pmatrix} 0 \\ u_{00} \\ 0 \\ u_{10} \end{pmatrix}, 
\ 
\begin{pmatrix} 0 \\ 0 \\ 1 \\ 0 \end{pmatrix}
\rightarrow 
\begin{pmatrix} 0 \\ 0 \\ 1 \\ 0 \end{pmatrix},
\ 
\begin{pmatrix} 0 \\ 0 \\ 0 \\ 1 \end{pmatrix}
\rightarrow 
\begin{pmatrix} 0 \\ u_{01} \\ 0 \\ u_{11} \end{pmatrix}.

\end{align*}

と示すことができ、このようなベクトルの変換から以下のような行列に示されることがわかるかと思います。

\begin{split}\begin{equation}
    C_U = \begin{matrix}
    |{00}\rangle \ |{0\color{red}1}\rangle \ |{10}\rangle \ |{1\color{red}1}\rangle \\
    \begin{pmatrix}
    1 & 0 & 0 & 0 \\
    0 & u_{00} & 0 & u_{01} \\
    0 & 0 & 1 & 0 \\
    0 & u_{10} &0 & u_{11}
        \end{pmatrix}
\end{matrix}
\end{equation}\end{split}

\begin{matrix} \ \\ |{00}\rangle \\ |{0\color{red}1}\rangle \\ |{10}\rangle \\ |{1\color{red}1}\rangle \end{matrix}

1量子ビット目が制御ビットの場合

1量子ビット目が制御ビットの場合を考えてみます。
ここでも以下の事項を忘れずに覚えておいてください。

  • Qiskitの最上位ビット(Most Significant Bit - MSB)は

制御量子ビットは1量子ビット、つまり1量子ビット目が $|1\rangle$であれば $U$を0量子ビット目に適用します。
なので対応としては以下の通りとなります。

\begin{align*}
{\left|0\right\rangle}\otimes {\left|0\right\rangle} 
&\rightarrow 
{\left|0\right\rangle}\otimes {\left|0\right\rangle}\\

{\left|0\right\rangle}\otimes {\left|1\right\rangle} 
&\rightarrow 
{\left|0\right\rangle}\otimes {\left|1\right\rangle}\\

{\left|\color{blue}1\right\rangle}\otimes {\left|0\right\rangle} 
&\rightarrow 
{\left|\color{blue}1\right\rangle}\otimes {U\left|0\right\rangle}\\

{\left|\color{blue}1\right\rangle}\otimes {\left|1\right\rangle} 
&\rightarrow 
{\left|\color{blue}1\right\rangle}\otimes {U\left|1\right\rangle}.

\end{align*}

上記をベクトルで示すと、

\begin{align*}
\begin{pmatrix} 1 \\ 0 \\ 0 \\ 0 \end{pmatrix}
\rightarrow 
\begin{pmatrix} 1 \\ 0 \\ 0 \\ 0 \end{pmatrix}, 
\ 
\begin{pmatrix} 0 \\ 1 \\ 0 \\ 0 \end{pmatrix}
\rightarrow
\begin{pmatrix} 0 \\ 1 \\ 0 \\ 0 \end{pmatrix}, 
\ 
\begin{pmatrix} 0 \\ 0 \\ 1 \\ 0 \end{pmatrix}
\rightarrow 
\begin{pmatrix} 0 \\ 0 \\ u_{00} \\ u_{10} \end{pmatrix},
\ 
\begin{pmatrix} 0 \\ 0 \\ 0 \\ 1 \end{pmatrix}
\rightarrow 
\begin{pmatrix} 0 \\ 0 \\ u_{01} \\ u_{11} \end{pmatrix}.

\end{align*}

と示すことができ、このようなベクトルの変換から以下のような行列に示されることがわかるかと思います。

\begin{split}\begin{equation}
    C_U = \begin{matrix}
    |{00}\rangle \ |{01}\rangle \ |{\color{blue}10}\rangle \ |{\color{blue}11}\rangle \\
    \begin{pmatrix}
    1 & 0 & 0 & 0 \\
    0 & 1 & 0 & 0 \\
    0 & 0 & u_{00} &u_{01} \\
    0 & 0 & u_{10} & u_{11}
        \end{pmatrix}
\end{matrix}
\end{equation}\end{split}

\begin{matrix} \ \\ |{00}\rangle \\ |{01}\rangle \\ |{\color{blue}10}\rangle \\ |{\color{blue}11}\rangle \end{matrix}

具体例

上記まででそれぞれの制御ゲートが一般的に以下のように表されることがわかりました。

0量子ビット目が制御ビットの場合

\begin{split}\begin{equation}
    C_U = \begin{pmatrix}
    1 & 0 & 0 & 0 \\
    0 & u_{00} & 0 & u_{01} \\
    0 & 0 & 1 & 0 \\
    0 & u_{10} &0 & u_{11}
        \end{pmatrix}.
\end{equation}\end{split}

1量子ビット目が制御ビットの場合

\begin{split}\begin{equation}
    C_U = \begin{pmatrix}
    1 & 0 & 0  & 0 \\
    0 & 1 & 0 & 0 \\
    0 & 0 & u_{00} & u_{01} \\
    0 & 0 & u_{10} & u_{11}
        \end{pmatrix}.
\end{equation}\end{split}

具体例で考えてみます。

制御Xゲートで考えましょう。
制御Xゲートは、制御量子ビットが $|1 \rangle$のとき、もう片方の量子ビット(ターゲット量子ビット)にXゲートを適用するものです。

Xゲートは

\begin{split}\begin{equation}
    X = \begin{pmatrix}
    0 & 1  \\
    1 & 0
        \end{pmatrix}
\end{equation}\end{split}

なので、

u_{01} = 1, u_{10} = 1

を代入して、

0量子ビット目が制御ビットの場合

\begin{split}\begin{equation}
    C_U = \begin{pmatrix}
    1 & 0 & 0 & 0 \\
    0 & 0 & 0 & 1 \\
    0 & 0 & 1 & 0 \\
    0 & 1 &0 & 0
        \end{pmatrix},
\end{equation}\end{split}

1量子ビット目が制御ビットの場合

\begin{split}\begin{equation}
    C_U = \begin{pmatrix}
    1 & 0 & 0  & 0 \\
    0 & 1 & 0 & 0 \\
    0 & 0 & 0 & 1 \\
    0 & 0 & 1 & 0
        \end{pmatrix}
\end{equation}\end{split}

ということが導けたと思います。

まとめ

本記事ではどの量子ビットを制御ビットとして使うかを整理しました。
皆さんご存じの通り、行列において計算順序や作用させる要素が変わると計算結果が変わるのでぜひそういったことがわかりにくくなったら、参考にしてみてください。
また、もっと基礎である量子ビットの数え方も記事にしています。
今回との関連が強い制御ゲートチートシートも作成しましたのでぜひ!

参考

Qiskitチュートリアル:量子操作の概要

10
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
10
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?