Microsoft Qunatum Simulator を触ってみた　#1

#はじめに
IBMやGoogleなど、USの大手IT企業に関するニュースを発表したり開発環境を提供している中、遅れているように見えたMicrosoftも今年の9月に米国でのイベントIgnite 2017で量子コンピュータの取り組みについて発表しました。

そこでの発表は2つ。
１つは、トポロジカル量子コンピュータという、IBMやGoogleが取り組むトランズモン型超電導のタイプとはまた別のタイプで量子コンピュータの実用化を目指しているという点です。
トポロジカル量子コンピュータは1次元の半導体ナノワイヤと超伝導体のヘテロ接合に発生するマヨラナ粒子を使った手法。
トポロジカル量子コンピュータのアイディアは歴史が浅く、また実験結果も他のものと比べると少ないですが、超電導タイプよりもノイズに強いとされています。
これら物性物理観点でのマイクロソフトのトポロジカル量子コンピュータについては、3回目以降触れてみたいと思います。

2つ目は、量子シミュレータをVisual Studioでできるよう開発キットを年末に提供開始するという点。こちらはマイクロソフトの量子コンピュータをクラウド経由で利用できるサービスを提供する前段階として、リリースしたと考えられています。

そこで今回はこの2つ目の発表の内容を踏まえて、実際にVisual Studioに開発キットをインストールして、簡単な量子シミュレータを動かしてみたいと思います。
Visual studioを日頃慣れ親しんでいる方は非常に量子シミュレータという敬遠されがちなツールを気軽に触れることができます。（しかも無償で！）

#実装手順
## 0. 開発環境
* Windows （64 bit推奨）
* Visual Studio 2017 （[Visual Studio community][link-1] は無償でダウンロードできます）
※この後インストールするVisual Studioの拡張機能がVisual Studio for Macに対応しておらず、現時点ではWindowsだけになります。

## 1. Visual Studioの開発キットのインストール
[このサイト][link-2]から [Download Now] へ行くと、氏名や所属会社名、メールアドレスを登録する画面がでるので必要項目を入力すると、Visual StudioのMarket Placeに移動します。
ここから " Microsoft Quantum Development Kit "をダウンロードします。
因みに、開発キットに入っているものは以下のものになります。

* Q#コンパイラ
* Q#標準ライブラリ
* ローカル量子コンピュータシミュレータ
* 量子コンピュータトレースシミュレータ

ダウンロードすると、確認ウィンドウが開いた場合は[許可]を押しますと、Visual Studioに拡張機能がインストールされます。

## 2. サンプルコードを動かしてみる
### 2.1　MS量子開発キットサンプルライブラリを複製
次にGitHubからMicroft の量子開発キットサンプルライブラリを複製します。
Visual Studioを立ち上げ、[チーム]>[接続の管理]を開くと、画像のように、[チームエクスプローラー　－接続]というウィンドウが立ち上がり、[ローカルGit リポジトリ]の選択画面がでてくるので、[複製]を選択します。
![Inkedvisualstudio_01_LI.jpg](https://qiita-image-store.s3.amazonaws.com/0/218815/16bf214a-8558-38d8-7099-6eded8e58c72.jpeg)
そこで下記URLをリポジトリに追加すると複製がされます。
https://github.com/Microsoft/Quantum.git

### 2.2　ライブラリ内のソリューションを開く
QsharpLibraries.sln が複製されたライブラリ内にあるので開く。

### 2.3　Q#環境が動作するか確認する
ライブラリ内には、利用頻度の高い量子計算が予め入っています。
今回はその中で、前代LiQui|>の時にもサンプルとして使われていた”Teleport”サンプルを扱います。
Teleportとは、量子テレポーテーションのことを指していて、量子もつれにの関係にある２つの粒子の一方を観測すると、もう一方の状態が瞬時に観測できるという現象です。
[QsharpLibraries]フォルダの中の、[Samples]>[0. Introduction]>[TeleportationSample]を右クリックにしスタートアッププロジェクトに設定します。
こうすることで、複数のプロジェクトから成るソリューションの中で、Visual Studio が最初にビルドおよびデバッグするプロジェクトを指定できます。
下記はサンプルコードの詳細です。

```csharp:qiita.rb
namespace Quantum.Teleport
{
    open Microsoft.Quantum.Primitive;

    operation Set (desired: Result, q1: Qubit) : ()
    {
        body
        {
            let current = M(q1);
            if (desired != current)
            {
                X(q1);
            }
        }
    }

	operation EPR (q1 : Qubit, q2 : Qubit) : ()
    {
        body 
        {
            // qubit 1にアダマールゲートを適用
            H (q1);
            // qubit 1 と qubit 2に制御Notゲートを適用
            CNOT (q1, q2);
        }
    }

    operation Teleport (msg : Qubit, here : Qubit, there : Qubit) : ()
    {
        body 
        {
            // EPRペア生成
            EPR (here, there);
            // message qubitと生成したEPRペアに制御Notゲートを適用する
            CNOT (msg, here);
            // message qubitにアダマールゲートを適用する
            H (msg);

            // EPRペアを測定し、その結果を古典的な結果を別拠点に送る
            let m_here = M (here);
            // here qubitの結果が１の場合
            if (m_here == One) {
                // Pauil-X ゲートをEPRペアに適用
                X (there);
            }
            // EPRペアを測定し、その結果を古典的な結果を別拠点に送る
            let m_msg = M (msg);
            // message qubitの結果が１の場合
            if (m_msg == One) {
                //Pauil-Z ゲートをthere qubitに適用
                Z (there);
            }
        }
    }

    operation TeleportTest (theta : Double) : (Int, Int)
    {
        body
        {
            let count = 100;
            mutable successes = 0;
            using (qubits = Qubit[3])
            {
                for (test in 1..count)
                {
                    // message qubitを回転させる
                    Rx (theta, qubits[0]);

                    Teleport (qubits[0], qubits[1], qubits[2]);

                    // ターゲットビットを反転させ測定させる
                    Rx (-theta, qubits[2]);
                    let res = M (qubits[2]);

                    // 結果が0の場合、シミュレーション成功
                    if (res == Zero)
                    {
                        set successes = successes + 1;
                    }

                    // 量子ビットをリセット
                    for (i in 0..2)
                    {
                        Set (Zero, qubits[i]);
                    }
                }
            }
            return (successes, count);
        }
    }
}
```
F5ボタンを押すと、デバックが開始され、コンソール画面が以下のように表示されると成功です。

```
Round 0:        Sent True,      got True.         Teleportation successful!!
Round 1:        Sent False,     got False.        Teleportation successful!!
        ...
Round 6:        Sent True,      got True.         Teleportation successful!!
Round 7:        Sent False,     got False.        Teleportation successful!!
```


#おわりに
今回は、Microsoft の量子シミュレータの1回目ということで、Visual Studioから拡張機能である量子開発キットをダウンロードして、代表的なサンプルデータを動かしてみるという最初の入り口を扱いました。
２回目は代表的なアルゴリズムを使ってシミュレーションを試してみたいと思います。


#引用文献
Quantum Computing from Microsoft
https://cloudblogs.microsoft.com/quantum/
Microsoft Quantum: Research
https://www.microsoft.com/en-us/research/lab/quantum/

[link-1]:https://www.visualstudio.com/ja/downloads/?rr=https%3A%2F%2Fwww.microsoft.com%2Fja-jp%2Fdev%2Fproducts%2Fcommunity.aspx
[link-2]:https://www.microsoft.com/en-us/quantum/development-kit