のむログ

技術メモ / 車 / 音楽 / 雑記 / etc...

量子プログラミング言語「Q#」で使う量子力学

f:id:nomunomu0504:20190411151106p:plain:w0

おすすめ参考書

量子計算理論 量子コンピュータの原理 [ 森前 智行 ]

価格:3,888円
(2018/12/18 00:14時点)

量子アルゴリズム[本/雑誌] / 中山茂/著

価格:5,832円
(2018/12/18 00:15時点)

事の発端

そもそもなぜQ#などという言語に興味を持ったのか。事の発端は来年1/12(土)に開催される「高専カンファレンス新春 in 大阪」に参加して何かしらを発表する(予定)だからです。その発表ネタ探しで見つけたのがQ#でした。

高専カンファレンスとは

== 公式はこちら ==

高専カンファレンス Wiki

== 1/12(土)開催の詳細はこちら ==

高専カンファレンス新春 in 大阪 - 高専カンファレンス Wiki

新春の大阪開催に参加するのはこれで2回目で1回目の時には PythonでTwitter を触ったりしたことを発表したような...。なぜか実行委員長(Johnくん)賞を受賞して魔剤モンスター4本セットをもらいました笑 YouTubeに動画上がってるのかな... Don't Watch :)

高専カンファレンスえぶりわん! in 大阪 - 高専カンファレンス Wiki

彼もすごい。#John_is_pro っていうタグが流行ってた気がするし。それから早1年とは...。劣化が進む進む()

量子プログラミング言語

さて話を戻すと、最近話題に(なってるかはさておき)なっている量子コンピュータ。以前に量子コンピュータとはなんぞや?的な記事を書いてみたので、よかったら読んでみてください!!

nomunomu.hateblo.jp

色々検索してみると、去年あたりにMicrosoftがQ#という「量子プログラミング言語」を発表していました。

量子プログラミング言語とは量子アルゴリズムの表現を実現するプログラミング言語の総称である。量子プログラミング言語は、プログラマーがプログラミングのツールとして使うことを意図したものではなく、研究者の量子コンピュータの振舞いの理解を促進し、研究者が量子アルゴリズムを形式的に論ずるツールとして用いることを意図したものである。(wikipedia - 量子プログラミング言語)

つまりは、プログラマーが使うものではなく、量子コンピュータや量子力学を専門としている方々が使う解析ツール的な立ち位置にあるそうです。

ですが「プログラミング言語」とある以上、気になったので触ってみました。っていう記事を今から書きます。ただ、Q#を理解するには「量子力学」を多少なりとも分かっていないと、全く理解できないことが途中で分かり、並行して量子力学も独学で学んでます...。適宜、解説を入れていくつもりですが、分からなかったりしたら調べてください。あと、間違ってたりしたら指摘 & 解説していただけると、とてもありがたく存じます!!!

検索してといっても、量子コンピュータ関連に使われてる量子力学は「ディラック形式」と言われ、一般的な「シュレディンガー形式」ではないので、専門的な論文や出版物を見つけない限り、情報としてはまだまだです。その手の参考サイト等もできるだけ掲載していきたいと思っています。

キュービット(量子ビット)

現在一般的に利用されているコンピュータとは「0 or 1」の状態をとる「ビット」と言われるもので制御を行っています。しかし、量子コンピュータでは「量子ビット(キュービット)」と言われるものを用います。このキュービットとは「0 or 1 or 0と1の混合状態(重ね合わせ状態)」という状態をとることができます。これから分かるように量子コンピュータとはあくまで計算・測定した結果が正しい確率を教えてくれるだけに過ぎません。このキュービットのブラ-ケット記法で表すと $$ \alpha|0\rangle + \beta|1\rangle $$

と表すことができます。ここでの  \alpha ,  \betaは $$ |\alpha|^2 + |\beta|^2 = 1 $$ の関係を満たす複素数です。同様の記法で古典ビットを表現すると \alpha ,  \betaのどちらか片方が0ならばもう片方が1となります。このことから |\alpha|^2は状態 |0\rangleである確率,  |\beta|^2は状態 |1\rangleである確率を示すことと同値と言えます。

量子ゲート

古典コンピュータでの計算は、ブール理論による論理ゲート(AND, OR, NOTなど)による論理演算をベースに行われます。しかし、量子コンピュータでは量子ゲートと呼ばれるもので処理が行われます。量子ゲートとは「量子演算の演算子に対応する演算を行うゲート」を示しています。古典コンピュータで言い換えれば、論理ゲートとは「論理演算の演算子に対応する演算を行うゲート」となります。この量子ゲートはユニタリ行列でなければなりません。

さらに、任意の1キュービットに対するユニタリ行列は以下のようにあらわすことができ、可逆計算である。 $$ e^{i\psi}\begin{pmatrix} e^{i(-\alpha-\beta)cos\theta} & -e^{i(-\alpha+\beta)sin\theta} \\ e^{i(\alpha-\beta)sin\theta} & e^{i(\alpha+\beta)cos\theta} \\ \end{pmatrix} $$ また、1キュービットに対する任意のユニタリ変換とCNOTゲートの組み合わせにより、nキュービットに対応したユニタリ変換を構成することができる。

NOT(パウリ行列

$$ X = NOT = \begin{pmatrix} 0 & 1 \\ 1 & 0 \\ \end{pmatrix} $$

$$ X|\psi\rangle = |\tilde{\psi}\rangle $$

SWAP(スワップ)

$$ S_{10} = \begin{pmatrix} 1 & 0 & 0 & 0 \\ 0 & 0 & 1 & 0 \\ 0 & 1 & 0 & 0 \\ 0 & 0 & 0 & 1 \\ \end{pmatrix} $$

$$ S_{10}|x\rangle|y\rangle = |y\rangle|x\rangle $$

制御NOT(Controlled-NOT: CNOT)

$$ C_{10} = \begin{pmatrix} 1 & 0 & 0 & 0 \\ 0 & 1 & 0 & 0 \\ 0 & 0 & 0 & 1 \\ 0 & 0 & 1 & 0 \\ \end{pmatrix} $$

$$ C_{10}|x\rangle |y\rangle = |x\rangle |y\oplus x\rangle $$

パウリ行列

$$ X =NOT= \begin{pmatrix} 0 & 1 \\ 1 & 0 \\ \end{pmatrix} $$ $$ Y = \begin{pmatrix} 0 & -i \\ i & 0 \\ \end{pmatrix} $$ $$ Z = \begin{pmatrix} 1 & 0 \\ 0 & -1 \\ \end{pmatrix} $$

これらそれぞれの X, Y, Zは、ブロッホ球の対応する軸での回転行列を表す。

トフォリゲート

トフォリゲートとは、可逆理論ゲートである。すなわち、複数個組み合わせることで任意の演算を行うことができる。  CNOTを2つ組み合わせたtex: CCNOTを示す。 $$ CCNOT = (I \otimes I - |11\rangle\langle 11|) \otimes I + |11\rangle\langle11| \otimes X $$  Iは単位演算子である $$ I = |0\rangle\langle0| + |1\rangle\langle1| $$

3キュービットに作用する CCNOT演算子の動作としては以下のようになる。 \begin{align} CCNOT|000\rangle &= |000\rangle \\ CCNOT|110\rangle &= |111\rangle \\ \end{align} つまり、1,2キュービット目が1ならば3キュービット目を反転するというゲートである。

\begin{align} CCNOT|110\rangle &= \big[ (I \otimes I - |11\rangle\langle 11|) \otimes I \big] |110\rangle + \big( |11\rangle\langle11| \otimes X \big) |110\rangle \\ &= \big( I \otimes I \otimes I - |11\rangle\langle 11| \otimes I \big) |110\rangle + (|11\rangle\langle11| \otimes X) |110\rangle \\ &= ( I \otimes I \otimes I)|110\rangle - (|11\rangle\langle 11| \otimes I)|110\rangle + (|11\rangle\langle11| \otimes X) |110\rangle \\ &= |110\rangle - |110\rangle + |111\rangle \\ &= |111\rangle \end{align}

用語説明

ユニタリ行列

ユニタリ行列とは次の条件を満たす行列 Uの事である。

 U^\dagger = U^{-1}

とするとき

 U^{\dagger}U = E  ,  UU^{\dagger} = E

この Eとは単位行列である。

また、 U^\dagger(読み方: ユーダガー)とは行列 U エルミート行列を指します。

ユニタリ変換

ユニタリ変換とは、ユニタリ行列によって行われるベクトル変換を指す。ユニタリ変換によって変換された2つのベクトルの内積は、変換前の内積と変化しない。 $$ |x^{'}\rangle = U|x\rangle \\ |y^{'}\rangle = U|y\rangle $$ とするとき、この2つのベクトルの内積は \begin{align} \langle x^{'}|y^{'}\rangle &= ( \langle x|U^{\dagger} )( U|y\rangle ) \\ &= \langle x|U^{-1}U|y\rangle \\ &= \langle x|y \rangle \end{align} となり、変化していないことが分かります。

エルミート行列

エルミート行列とは元の行列{ \displaystyle U}の転置および複素共役をとって得られる行列を意味します。すなわち{ \displaystyle U^\dagger}は以下のように表すことができます。

{ \displaystyle U^\dagger = (\overline{U})^{\mathrm{T}} = \overline{U^{\mathrm{T}}} }

エルミート行列を表す記号としてはダガー以外にも以下のようなものが存在します。

  • { \displaystyle U^{\mathrm{*}} }, { \displaystyle U^{\mathrm{H}} }: 主に線形代数学にみられる表記です
  • { \displaystyle U^{\mathrm{+}} }を使っていることもあるが、一般的には「一般化逆行列」を示す

論文によっては{ \displaystyle U^{\mathrm{*}} }を複素共役と表現する場合もある。その場合、エルミート行列は{ \displaystyle U^{\mathrm{*T}} }, { \displaystyle U^{\mathrm{T*}} }または{ \displaystyle {}^tU^{\mathrm{*}} }で表すことがあるので、注意していただきたい。

可逆計算

計算過程において、直前と直後の状態が常に一意に定めることができる計算を指す。非破壊的計算ともいわれる。