Javaで量子コンピューターを学ぶ

この記事はGMOアドマーケティング Advent Calendar 2019 14日目の記事です。

GMOアドマーケティングのT.Nです。

先日参加したJJUGのOracle Code One 2019 報告会で、
今年のOracle Code Oneは、量子コンピューターの話題が中心だったという話を聞きました。

発表されていたJavaチャンピオンの方も、
Oracle Code Oneで発表されたものは次の時代に必ず来ると言っていたので、
量子コンピューターの時代に備えて、報告会で紹介されていた
Quantum Computing API for Java
を使用して量子コンピューターを学んでみることにしました。

Quantum Computing API for Javaは、Javaで書かれた量子コンピューターのシミュレーターです。

今回のブログでは、2019/11/25時点のソースコードを使用しました。

量子コンピューターでのプログラミングについて

量子コンピューターでのプログラミングがどのようなものか簡単に説明します。

従来のコンピューターでは、0と1のいずれかの状態を持つビットで演算を行うのに対し、
量子コンピューターでは、重ね合わせ状態を持つことができる量子ビット(qubit)で演算を行います。

重ね合わせ状態では0と1の両方の値を持つことができるので、
量子ビットを重ね合わせ状態にすることで、複数の計算を同時に行うことができます。

重ね合わせ状態の量子ビットの値は確率的なもので確定していませんが、
測定することで値が0か1に確定します。

量子コンピューターのプログラムでは、
量子ビットに量子ゲートを適用して量子の状態を制御することで処理を行い、
最後に測定することで結果を得ます。

Quantum Computing API for Javaには量子ゲートに対応するクラスがあるので、
それらのクラスを使って量子回路を作成し、実行して計算結果を得ます。

Hello, Quantum Computing!

Quantum Computing API for Javaを使って簡単なプログラムを作成しました。

重ね合わせを使ったプログラム

以下が重ね合わせを使ったプログラムです。
実行する関数をIntFunctionで定義しているのは、IntStreamを使って複数回実行するためです。

このプログラムでは、
3つの量子ビットにHadamardゲートを適用して重ね合わせ状態にし、
その後に量子ビットを測定しています。

実行すると以下のような結果が得られます。
{110=17, 000=14, 011=13, 100=12, 001=9, 111=7, 101=13, 010=15}

各量子ビットが取りうる全ての値の組み合わせが、同じくらいの回数現れています。

重ね合わせ状態では0と1の両方の値を確率的にとっていて、
その状態で測定を行うと、0、1のいずれかの値になります。

結果が確率的に決まるのが量子コンピューターの特徴です。

量子もつれを使ったプログラム

以下が量子もつれを使ったプログラムです。

1つ目のStepでは、0番目の量子ビットにHadamardゲートを適用しています。
Hadamardゲートを適用すると、量子ビットが重ね合わせ状態になります。

2つ目のStepでは、CNOTゲートを適用しています。
0番目の量子ビットがコントロールビット、
1番目の量子ビットがターゲットビットとなるように指定しています。
CNOTゲートを適用すると、コントロールビットが1の場合に、ターゲットビットが反転します。
0番目の量子ビットが0の場合はターゲットビットは反転せず、1の場合は反転します。

このプログラムを実行すると以下のような結果が得られます。
{00=52, 11=48}

先ほどの重ね合わせを使ったプログラムでは、
各量子ビットが取りうる全ての値の組み合わせの結果が出力されましたが、
今回は00と11の二通りです。

片方の量子ビットが0の場合はもう一方も0になり、1の場合はもう一方も1になります。

片方の量子ビットの状態が他の量子ビットに影響する量子もつれが起こるのも、
量子コンピューターの特徴です。

最後に

今回はQuantum Computing API for Javaを使って、
量子コンピューターの基本的な性質をシミュレーションしました。

少しでも量子コンピューターに興味がある人は、
こういったものに触れるところから、量子コンピューターについて学び始めるのも良いと思います。

明日は、thomi40さんによる「超シンプルな通知系gem「g」を試す」です。
引き続き、GMOアドマーケティング Advent Calendar 2019 をお楽しみください!

■エンジニア採用ページ ~福利厚生や各種制度のご案内はこちら~
https://www.gmo-ap.jp/engineer/

■Wantedlyページ ~ブログや求人を公開中!~
https://www.wantedly.com/projects/199431

■エンジニア学生インターン募集中! ~就業型インターンでアドテクの先端技術を体験しよう~
https://hrmos.co/pages/gmo-ap/jobs/0000027