IBM謹製の量子計算フレームワークQiskitのまとめ

# Qiskitとは

「研究、教育及びビジネスにおいて今日の量子計算を活性化させるためのオープンソースの量子計算フレームワーク」である。Qiskitは、Terra、Aer及びAquaの3つで構成される。

> An open-source quantum computing framework for leveraging today's quantum processors in research, education, and business

by https://qiskit.org/

## Qiskit Terra

Qiskit Terraは「ソフトウェア・スタックのためのプラットフォーム」である。Terraには、「回路及びパルスのレベルで量子プログラムを構成し、特定の物理的な量子プロセッサの制約に合わせて量子プログラムを最適化し、リモートで実験のバッチ実行を管理するための一連のツール」がある。また、Terraは「モジュールで構成されているため、回路最適化とバックエンドの機能拡張は容易」である。

> Qiskit Terra provides the foundational roots for our software stack. Within Terra is a set of tools for composing quantum programs at the level of circuits and pulses, optimizing them for the constraints of a particular physical quantum processor, and managing the batched execution of experiments on remote-access backends. Terra is modularly constructed, simplifying the addition of extensions for circuit optimizations and backends. We welcome your contributions!

by https://qiskit.org/terra

## Qiskit Aer

Qiskit Aerは、「Qiskitソフトウェア・スタックのためのハイパフォーマンス・シミュレータ・フレームワーク」である。Aerは、「Terraでコンパイルされた回路を実行するための最適化済C++シミュレータ」を持ち、「実デバイスでの実行中に発生するエラーによる実ノイズ環境をシミュレーションするために、様々な調整が可能なノイズモデルを構築するためのツール」が含まれる。

> Qiskit Aer provides a high performance simulator framework for the Qiskit software stack. It contains optimized C++ simulator backends for executing circuits compiled in Qiskit Terra, and tools for constructing highly configurable noise models for performing realistic noisy simulations of the errors that occur during execution on real devices.

by https://qiskit.org/aer

## Qiskit Aqua

Qiskit Aquaは、「短期間の量子計算アプリの開発に使うクロス・ドメイン量子アルゴリズムのライブラリ」が含まれる。Aquaは、「量子アルゴリズムを容易に追加できるプラガブルなフレームワーク」である。現在のところ、「短期間の量子コンピュータのための、化学、AI、最適化及び金融のアプリケーションを実験」できる。

> Qiskit Aqua contains a library of cross-domain quantum algorithms upon which applications for near-term quantum computing can be built. Aqua is designed to be extensible, and employs a pluggable framework where quantum algorithms can easily be added. It currently allows the user to experiment on chemistry, AI, optimization and finance applications for near-term quantum computers.

by https://qiskit.org/aqua

# インストール

## システム要件

- OS
    - Ubuntu 16.04 or later
    - macOS 10.12.6 or later
    - Windows 7 or later
- Python
    - Python 3.5 or later.

by https://qiskit.org/documentation/install.html

## 事前準備

事前にpython-envをインストールしておく、しないと [「Python.h: そのようなファイルやディレクトリはありません」](https://orebibou.com/2016/10/%E3%80%8E%E8%87%B4%E5%91%BD%E7%9A%84%E3%82%A8%E3%83%A9%E3%83%BC-python-h-%E3%81%9D%E3%81%AE%E3%82%88%E3%81%86%E3%81%AA%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%82%84%E3%83%87%E3%82%A3%E3%83%AC/) というエラーが出る。

```bash
sudo apt install python-dev
sudo apt install python3-dev
```

## pyenv

仮想環境作成。

```bash
mkdir qiskit
python3 -m venv qiskit
```

## pip

pipでインストール。

```bash
pip install qiskit qiskit-aqua
```

または、公式サイトがJupiterNotebookを公開しているので、そこで動かしてみる手もある。

https://mybinder.org/v2/gh/QISKit/qiskit-tutorial/master?filepath=index.ipynb

# 開発の流れ

Qiskitを使った量子計算のワークフローは以下の2つで構成される。

1. Build：量子回路を作成
2. Execute：さまざまなバックエンドでそれらを実行

以下で[Getting Started with Qiskit](https://hub.mybinder.org/user/qiskit-qiskit-tutorial-gfo8syzg/notebooks/qiskit/basics/getting_started_with_qiskit.ipynb)に沿って、ワークフローの実例を紹介する。

## Build

### 量子ビット定義

3量子ビットを定義。

```python
import numpy as np
from qiskit import QuantumCircuit, ClassicalRegister, QuantumRegister
from qiskit import execute
q = QuantumRegister(3, 'q')
```

### 量子回路定義

量子回路 `circ` を生成して、アダマール演算子Hと制御NOT演算子Cxを適用する。

```python
circ = QuantumCircuit(q)
circ.h(q[0])
circ.cx(q[0], q[1])
circ.cx(q[0], q[2])
```

## Execute

### 実験

#### バックグラウンド定義

CPUでいうとx86とx86_64みたいなアーキテクチャの違いみたいなものが量子コンピュータにもあるらしく、Qiskitはそれを「バックグランド」と呼んでいる。
で、典型的なバックグラウンドはすでに用意されているのでそれを使っておく。

```python
from qiskit import BasicAer
backend = BasicAer.get_backend('statevector_simulator')
```

#### 計算実行

計算を実行する。

```python
job = execute(circ, backend)
```

#### 結果取得

計算結果を取得する。

```python
result = job.result()
outputstate = result.get_statevector(circ, decimals=3)
```

### 実験結果確認

#### 文字列出力

実験結果を文字列出力する。

```python
print(outputstate)
```

こんなんでてきた。

```python
[0.707+0.j 0.   +0.j 0.   +0.j 0.   +0.j 0.   +0.j 0.   +0.j 0.   +0.j
 0.707+0.j]
```


#### グラフ出力

実験結果をグラフ出力する。

```python
from qiskit.tools.visualization import plot_state_city
plot_state_city(outputstate)
```

こんなんでてきた。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/114392/89201593-d65f-174e-134a-f30438276d27.png)

by [Getting Started with Qiskit](https://hub.mybinder.org/user/qiskit-qiskit-tutorial-gfo8syzg/notebooks/qiskit/basics/getting_started_with_qiskit.ipynb)


# Qiskit Aqua
## Oracle

Aquaのアルゴリズムはブラックボックス化された[Oracle](https://qiskit.org/documentation/aqua/oracles.html)を与えることで駆動する。[GiHub](https://github.com/Qiskit/qiskit-aqua/tree/master/qiskit/aqua/components/oracles)を見ると、Oracleは[Python EDA](https://pyeda.readthedocs.io/en/latest/index.html#)の単なるラッパーである。PythonEDAにより、ブール代数演算をサポートし、量子演算への変換を容易にしているようだ。