誰でも無料で毎朝量子超越！！

# GM! 量子超越！
​
2022年6月にXanaduの量子超越性の成果が、Natureにて発表されました。
​

https://twitter.com/mi2valley/status/1532024181402898432

​
#### 論文


https://www.nature.com/articles/s41586-022-04725-x

​
すべての量子ゲートをプログラムできるフォトニックマシンでは、量子コンピュータの優位性を実証した例はなく、論文では、実装されたすべてのゲートにおいて動的なプログラミングが可能なフォトニックプロセッサ**Borealis**を用いた量子計算の優位性を実証しました。時間多重化(時間により情報を付与し、それを多重化させる手法)とプログラム可能な3つの光ファイバーループのアーキテクチャを用いて216個のスクイーズモードに対してガウシアンボゾンサンプリング(GBS)を実行しました。プログラムされた分布から1つのサンプルを生成するためには、スーパーコンピュータを用いた場合、平均で9000年以上かかるのに対し、Borealisではわずか36μsで済むとのこと。
​
## そして私たちはそのBorealisを用いて量子超越をデモンストレーションできます。
​
量子超越した実機を自由に使えるようになるのはおそらく世界初です。すごいですよね。
​
よし、早速量子超越を体験してみようと、Borealisの利用可能時間をみたところ...

![スクリーンショット 2022-07-07 12.00.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542293/596a0ae5-8b2c-e080-c210-8f5f63c849d6.png)

日本時間だと月から木が3:00-5:00AM、金は0:00-2:00AM、土日はお休みです。日本人泣かせ。

そこで私は考えました。

### 寝てる時間に量子超越したい。あわよくば毎日量子超越したい。量子超越して朝を迎えたいと。


その願いを叶えるため、

# GM Quantum Advantageを作ってみました。

Githubのアカウントさえあれば、毎朝量子超越してくれます。

### 使ったもの

1. Github Actions
2. Xanadu Cloud(無料登録のみ)
3. Python

### 使い方

1. GithubへSign up
2. [Xanadu Cloud](https://cloud.xanadu.ai/)へSign up
3. Xanadu CloudでAPI Keyを生成、取得
4. [このリポジトリ](https://github.com/mi2valley/gm-quantum-advantage)をForkします
5. ForkしたリポジトリのActionsタブをクリックし、有効化
![スクリーンショット 2022-07-05 14.00.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542293/2dd36790-832c-eab8-af68-03a66d70f820.png)
6. Settings → Secrets → Actions → New repository secretと進み、
![スクリーンショット 2022-07-05 14.27.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542293/ef564cd1-514f-044a-0769-9a3ef08db090.png)
API KeyをREFRESH_TOKENとして入力(ValueにコピーしたAPI Keyを入力)
![スクリーンショット 2022-07-05 14.28.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542293/9f53e8d5-85d3-45a0-0e3d-6b754e3a4973.png)

# プログラムの概要(量子超越デモから富岳においての計算時間の見積もりまで)

[Strawberry Fieldsのチュートリアル](https://strawberryfields.ai/photonics/demos/tutorial_borealis_beginner.html)をもとに説明していきます。

### GBSインスタンス呼び出し

borealis_gbs関数により、squeezing level ("low", “medium”, or “high”)を設定するだけでGBSインスタンスを呼び出せます。(詳細にカスタマイズすることも可能)
各タイムビンで7つのガウシアンゲートを適用する引数が含まれ、Nature論文で紹介されるものとほぼ等価な回路となるようです！

```python
from strawberryfields.tdm import borealis_gbs

gate_args_list = borealis_gbs(device, modes=216, squeezing="high")
```

また、回路を実行するためにはStrawberry Fields TDMProgramにプログラムを送信する必要があります。
そのために、ループにおけるdelay、get_mode_indices関数で初期化に必要なパラメータを取得します。

```python
from strawberryfields.tdm import get_mode_indices

delays = [1, 6, 36]
n, N = get_mode_indices(delays)
```

### 回路の構築

最後に、回路を構成します。この回路のレイアウトは、ハードウェアデバイスによって設定され、変更することはできません。間違ったゲートを使ったり、順番を間違えたりすると、回路の検証に失敗します。

```python
from strawberryfields.ops import Sgate, Rgate, BSgate, MeasureFock

prog = sf.TDMProgram(N)

with prog.context(*gate_args_list) as (p, q):
    Sgate(p[0]) | q[n[0]]
    for i in range(len(delays)):
        Rgate(p[2 * i + 1]) | q[n[i]]
        BSgate(p[2 * i + 2], np.pi / 2) | (q[n[i + 1]], q[n[i]])
    MeasureFock() | q[0]
```

### 実行

回路をBorealisで実行します。

```python
shots = 10_000
results = eng.run(prog, shots=shots, crop=True)
print(results.samples)
```
TDMProgramが返すサンプルは、（shots, 空間モード, 時間モード）です。今回の場合は(shots, 1, 216)の形のsamplesです。

### 富岳によるシミュレート時間見積もり

さらに、チュートリアルでは**富岳**が個々のGBSサンプルをシミュレートするのに必要な推定実行時間の求め方も説明しています。これらの実行時間は、Strawberry Fieldsの関数gbs_sample_runtimeを用いて、実行したGBSサンプルについて計算することができます。

```python
from strawberryfields.utils import gbs_sample_runtime

runtimes = np.array([gbs_sample_runtime(sample[0]) for sample in samples])

runtime_data = f"""
simulation runtimes [years]
median: {np.median(runtimes) / 365 / 24 / 3600:.1E}
average: {np.mean(runtimes) / 365 / 24 / 3600:.1E}
brightest: {np.max(runtimes) / 365 / 24 / 3600:.1E}
total: {np.sum(runtimes) / 365 / 24 / 3600:.1E}
"""

print(runtime_data)
```

結果は...

```bash:output
simulation runtimes [years]
median: 3.9E+00
average: 2.3E+05
brightest: 2.0E+10
total: 1.1E+11
```

参考程度に、かなり時間がかかることがわかります。


:::note warn
ただし、この解析は現在の富岳の仕様（LINPACKスーパーコンピュータベンチマークで特徴づけられる）とHafniansを計算するためのアルゴリズムに基づいており、このシミュレーション実行時間の見積もりは、より強力なコンピュータやより効率的なアルゴリズムの出現によって将来的に影響を受ける可能性があります。
:::

このようにBorealis実機による実験を古典的にサンプルするのは現実的な時間では難しいです。
そこで、シミュレータで擬似的に行うために、ノイズと最新のBorealisの効率データを組み込んでシミュレーションを行っています。
Borealisがonlineでない時は、こちらのシミュレーションを動かしています。

#### また、チュートリアルをもとに自由にプログラムやパラメータを書き換えたりしてみると面白いかもしれません。


https://strawberryfields.ai/photonics/demonstrations.html


# 結論

### 誰でも無料で自動で量子超越をプログラム可能になりました。
​