超絶初心者がqiskitを使って1+1を実装するまで

### 初投稿です
#### 自己紹介
[tax_free](https://twitter.com/taxfree_python)です。
普段は[hatena](https://taxfree-python.hatenablog.com/)で参加した勉強会とかを書いています。
学校の期末テストと記事の日が被って苦しい
高校一年生です
#### 環境

自分の開発環境

- Mac OS Catalina 10.15.1
- Python 3.7.4

#### モチベーション
今は高校生なのですが、大学では量子コンピューティングの研究をしたいと考えていたら、今回のアドベントカレンダーを見つけたので参加しました。  
タイトルにも書いているように超絶初心者なので、間違えていたりしたら教えてください!
量子コンピュータについての知識はネットの初心者向け記事くらいのレベルです。

#### Qiskitとは
> Qiskitは、量子コンピュータ用のオープンソースのフレームワークである。量子回路（英語版）を作成し、プロトタイプの量子デバイスやシミュレーション上で実行するためのツールを提供する。量子チューニングマシン（英語版）の量子回路（英語版）に対応しており、これに従う量子ハードウェアに使用することができる。(wikipediaより)

#### なぜQiskitなのか
私が知っているPythonで動く量子コンピューティング関連のライブラリは、Qiskitと[Qgate](https://github.com/shinmorino/qgate)の二つでした。最初は、Qgateを使おうと思っていた(PyConJPで聞いた)のですが、私の環境では、CUDA関係でうまく使うことができなかったので、代りにQiskitを使いました。
また、Qiskitは[IBMQ](https://quantum-computing.ibm.com/)を使えるのも選んだ理由です。
Qgateは分かりませんが、QiskitはJupyter notebookをサポートしています。

#### 準備
前置きはこれくらいにして、準備をしていきます。
まずは、Qiskitをインストールします。適当な環境を作って

```
pip install qiskit
```
で、インストールできます。詳しくは[公式ドキュメント](https://qiskit.org/documentation/install.html)を見てださい。 ~~丸投げ~~

また、IBMQのアカウントを作っておくと後からクラウドに接続する時に、楽です。

#### 実装
まず、sample.pyファイルを作って

```python

import qiskit

print(2)
```
です!!!!!!!!!!
簡単に書けますよね。
あとは、

```
python3 sample.py
````
を実行すれば

```
2
```
返ってきます。 1+1の結果は2なので、正解ですね。

#### まとめ
いかがでしたか?
量子コンピュータと聞くと難しく感じますが、簡単に書くことができましたね。ニッコリ

## 茶番終了
盛大な茶番で、すみませんでした。~~後悔はしていない~~

#### 本番開始
上に書いたようにQiskitをインストールします。

#### 実装
適当な環境を作ります。今回は、Jupyter notebookを使います。

1. 最初に必要なライブラリをimportします。

```python
from qiskit import * #とりあえず全部import
from qiskit.tools.monitor import backend_overview
from qiskit.tools.visualization import plot_histogram
from qiskit.providers.ibmq import least_busy
```
2.IBMQアカウントを登録して、アカウントをロードします。ここでwarningが出ましたが無視します。

```python
IBMQ.save_account('IBMQのtoken')
provider = IBMQ.load_account()
```

3.回路を登録していきます。
最終的にこの回路を作ります
<img width="401" alt="" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/273421/69c7c2b3-9620-4ad2-4918-8a6566e2ed37.png">


```python
qc = QuantumCircuit(4,4)
```
これで、4個ずつ量子ビットと4個の古典ビットを登録しました。
なんで量子ビットだけじゃないのと思ったかもしれませんが、この古典ビットに量子ビットの計算結果を保存します。

4.ゲートを追加します

```python
qc.h(0)
qc.h(1)
qc.x(0)
qc.x(1)
```
hゲートでqubitの一番目(q_0)と二番目(q_1)を重ね合せ状態にします。また、xゲートはNOT回路と同じような働きをします。

```
qc.ccx(0,1,2)
qc.cx(0,3)
qc.cx(1,3)
```
ここで足し算に必要なゲートを追加します。詳しくは[ここ](https://eman-physics.net/quantum/computer4.html)

```python
qc.measure(0,3)
qc.measure(1,2)
qc.measure(2,1)
qc.measure(3,0)
```
measureはとても大切で、3で書いたようにn番目の量子ビットの状態をn番目の古典ビットに保存します。
ここまで書いたら、

```
qc.draw()
```
を使って回路を見てみましょう。しっかり、ゲートが適用されているはずです。

5.最適なBackendを選択
ここは完全に[他の人](https://dojo.qulacs.org/ja/latest/notebooks/3.2_Qiskit_IBMQ.html)のコピペです。許して

```python
large_enough_devices = IBMQ.backends(filters=lambda x: x.configuration().n_qubits > 3 \
                                     and not x.configuration().simulator)
backend = least_busy(large_enough_devices)
print("The best backend is " + backend.name())
```
実際に最適なbackendが表示されるはずです。

6.実際にjobを投げる

```python
backends = ['xxxxx','xxxx','least_busyだったbackend']
backend_q = IBMQ.get_backend(backend[1])
result = execute(qc,backend_q,shots='1024').result()
```
backendsで複数個のbackendを設定して、backend_qのbackend[n]で要素を指定しています。
executeでjobを投げています。shotsは何回計算させるかで、数を大きくすると結構時間がかかります。最大で4096だったような。

7.結果を見る
最後に結果を確認します。

```python

print(result.get_counts(qc))
plot_histogram(result.get_counts(qc))
```
これで、確認することができます。
plot_histogramがあると視覚化できるので良い!

####まとめ
量子コンピュータを使うためには、もっと数学をガリガリする必要があると思っていたけど意外と簡単だった。
とりあえず、手を動かしてみることは大切だと思った。
来年のカレンダーでは数式の説明ができるように一年勉強します。