量子プログラミング～マルレク・QA&トラブルシューティング

#はじめに

最近、量子コンピュータの話題が増えてきており、たとえば日経新聞では取り上げられる機会が増えているように思います。
Googleが量子超越の実証を発表したり、暗号基盤の危機かもしれないと話題になったりといったことで、興味を持つ方が増えてきていると思います。

量子コンピュータの理解を深めるためには、実際に触ってみるのが一番の近道だと思います。
そして、そのひとつが量子プログラミングです。

しかしながら、どうにも馴染みのない言葉やら何やらが多い・・・。
そこで今回、マルレクの教材を使った学習を行うことにしました。

ここでは、**マルレクの教材に沿って進める中で出てきた私の素朴な疑問**と**トラブルシューティング**を整理しておきたいと思います。

#対象者
量子コンピュータの基本を学習しながら、量子プログラミングをやってみたい方。

#前提
量子プログラミングの入門として以下を利用します。

1. [マルレク「量子コンピュータで学ぶ量子プログラミング入門」](https://github.com/maru-labo/ibm-q-handson)
1. [IBM Q Experience](https://www.ibm.com/quantum-computing/technology/experience/)　
（Qiskitバージョン：0.13.0）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/494282/c05a5bde-fa5f-2831-b7fd-2afab6ef4bc7.png)

##１．マルレク「量子コンピュータで学ぶ量子プログラミング入門」
[マルレク](https://www.marulabo.net/)は、IT技術の普及などを目的に運営されています。
今回はその中の[「量子コンピュータで学ぶ量子プログラミング入門」](https://github.com/maru-labo/ibm-q-handson)を利用します。
「0_setup.ipynb」の手順に沿って進めれば、準備は完了です。

##２．IBM Q Experience
Webブラウザで使える量子プログラミングツールです。
アカウント登録すれば、誰でも使えます。

マルレクのノートブックは、「Qiskit Notebooks」でノートをインポートすることもできます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/494282/0c973d58-0811-096a-bac6-9e549082690c.png)　　![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/494282/53897711-fb05-9d31-63d6-0f376fea82a6.png)


#■QA

##✅ Q Experience の使い方がわからない！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/494282/52508de0-3b19-063e-0030-d9cefa8e0c07.png)
画面の左端にあるヘルプマークを開こう。

基本的な使い方や、Slackコミュニティへのリンクなどがある。
但し、すべて英語になるため、日本語で知りたい場合は有志の翻訳やチュートリアルを探す必要がある。

例えば以下のページ。

+ [IBM Q Qiskit Terra サンプル プログラムに日本語コメントつけてみた](https://qiita.com/Chirimen-Jako/items/bf5a2a9e6d01b3b53ab0)
+ [[量子コンピューター]Qiskit Tutorials](https://qiita.com/ool/items/2a5038df1471635d442c)

##✅ Qiskit の API はどこで確認できるの？

ヘルプ画面から辿ることができる。（Qiskit Documentation　→　API References）

直リンクはこちら。
https://qiskit.org/documentation/apidoc/qiskit.html

ちなみに、API Referenceは日本語で表示が可能。
左下のメニューで言語が切り替えられる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/494282/15795e09-77b6-0a14-68c5-7cbd2beb6997.png)


##✅ qubitの表現にはなぜ複素数が使われるのか？
qubitの状態は以下の式で表すことができる。

```math
|\psi\rangle = \alpha|0\rangle + \beta|1\rangle
```
ここでの $\alpha, \beta$ はいずれも複素数であるが、なぜ複素数なのか？
以下が参考になる。

+ [複素数の歴史](http://www.ey.u-tokai.ac.jp/mizuno/kyozai/denki_enshu/040yComplexNo(History).pdf)
+ [波を記述するための複素数に関する知識](https://mmnakayama.jimdo.com/study/%E8%A4%87%E7%B4%A0%E6%95%B0/)

特に後者がわかりやすい。
この中のポイントを拾ってみる。

+ 虚数軸の導入は、数直線（一次元）上に展開された実数を平面（2次元）に広げるということ。（**複素平面**を作る）
+ 複素平面導入のポイントは、2変数で表される物理量などを**一つの数字として**取り扱えること。
+ 複素平面を導入すると2つの実数を使わなくても、**一つの複素数で平面上の点を表せる**ので、**代数計算が簡単になる**場合がある。（典型的な例が**波動の重ね合わせ**の記述）
+ 実数だけを用いたデカルト座標系で波動を取り扱うことも可能だが、**計算が面倒になるから使っていない**。


＜その他参考＞

+ [量子コンピュータの基礎と物理との接点](http://mercury.yukawa.kyoto-u.ac.jp/~bussei.kenkyu/wp/wp-content/uploads/6200-064217.pdf)

##✅ |0〉の記号の意味は？
マルレク内には**ket記法**であると書かれているが、それ以上の詳しい説明はない。

ketを含む**ブラケット記法**については以下が参考になる。

 + [Qiita 量子ビットについて](https://qiita.com/123123/items/3d1a6b492dcdee4d8742)
 + [EMANの物理学・物理数学・ブラケット記法](https://eman-physics.net/math/linear14.html)

複素ベクトルの内積を表すために便宜的に導入された記法ということのようだ。

さらにEMANのページには **複素共役** や **†（ダガー）** についての説明もあるため、合わせて理解しておきたい。
※マルレクにも説明はあるが、簡略化されているため上記の方がわかりやすい。

##✅ Cの表す意味とは？
qubitの状態は以下の式である。

```math
|\psi\rangle = \alpha|0\rangle + \beta|1\rangle
```

規格化条件はこのように記述される。

```math
|\alpha|^2+|\beta|^2=1　;　\alpha,\beta\in\mathbb{C}
```

ここで用いられる$\mathbb{C}$は、複素数（Complex number）を表す。
[wikipedia](https://ja.wikipedia.org/wiki/%E6%95%B0%E5%AD%A6%E8%A8%98%E5%8F%B7%E3%81%AE%E8%A1%A8)が詳しい。

ちなみに$\in$は、集合に対する元の帰属関係を表す。
つまり$\alpha,\beta$は、複素数の集合$\mathbb{C}$の元であることを示す。

##✅ qubitの状態はなぜブロッホ球でうまく表現できるのか？

qubitは以下の数式で表せるということだった。

```math
|\psi\rangle = \alpha|0\rangle + \beta|1\rangle 　・・・(1)
```
```math
|\alpha|^2+|\beta|^2=1・・・(2)
```

複素数は実数・虚数の２つの自由度を持っている（複素平面は２次元）。
式(1)の右辺で自由度を考えてみると、２つの複素数があるため合計で４の自由度ということになる。
さらに(2)の規格化条件により、自由度が１つ減り３になることから、３次元で表現できる。

式(1)をオイラーの公式などを使って変形することで、以下の数式が得られる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/494282/2eb28e88-8ff3-8440-3079-9a10921e6d4c.png)　※「EMANの物理学・量子力学」より

これを球にプロットしたものが**ブロッホ球**ということになる。
以下が詳しい。

+ [EMANの物理学・量子力学・ブロッホ球](https://eman-physics.net/quantum/bloch_sphere.html)
+ [LangEdge,Inc. 古典プログラマ向け量子プログラミング入門 -量子ゲート編-（P75参照）](https://www.ossal.org/qc/Sal-QC-Prog-1st.pdf)

#■トラブルシューティング

##✅ [5_ibm_q.ipynb]でエラーが出る（UsageError）

> ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/494282/0b8ab7af-b869-914e-fe56-86c7ae9ffc1c.png)

マジックコマンドが使えないとのことで、以下のようにコードを書きかえてやればよさそうだ。

```PYTHON
#%qiskit_backend_monitor backend_ibmq

from qiskit.tools.monitor import backend_monitor
backend_monitor(backend_ibmq)
```
[API Reference - qiskit.tools.monitor](https://qiskit.org/documentation/apidoc/tools/monitor/monitor.html)

##✅ [5_ibm_q.ipynb]でエラーが出る（TypeError）

> ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/494282/9f23f45a-efdf-8cd8-82e2-ac3c058f9ac1.png)

現在、「monitor_async」なるキーワード引数はない。
[API Reference - job_monitor](https://qiskit.org/documentation/api/qiskit.tools.monitor.job_monitor.html#qiskit.tools.monitor.job_monitor)

エラーなく動かすために、以下のように書き換える。

```python
from qiskit.tools.monitor import job_monitor

#job_monitor(job, monitor_async=True)
job_monitor(job)
```

モニタリングについては[こちら（IBMQ + Qiskit 使い方まとめ）](https://qiita.com/N-H-Shimada/items/f165e3c6407cc1a0ab83)にも情報がある。

#おわりに
マルレクの教材はわかりやすくできていると思います。
Qiskitの基本的な使い方を知ることが出来ました。

但し、説明部分においては、多少の前提知識がないと唐突な印象を受ける点がいくつかあるかもしれません。
書籍等とあわせて学習されることをおすすめします。