物理から学ぶ量子コンピューティング（俺メモ）

# はじめに、とお願い
前に物理を専攻していたニートが、量子コンピュータを少し本格的に学ぼうかなと思案中。どのように勉強したらいいのかわからんので、アドバイスあればください。

量子力学は第二量子化くらいまではわかっていた（今はあやしい）。Python と JavaScript は大体かける。論理学はわかる、回路設計はできない、アルゴリズムは少しわかる。どちらかというと量子ゲートの方に興味がある。英語は苦でない。予算は10万くらい。約半年間、毎日数時間は勉強の時間はとれそう。

現在の学習計画

- Youtubeに上がっている慶応の講座(90min x 15)を見る
- sympy, openfermion を使えるようにする
- なんかの体系だった本を読む（洋書でも可）

# ツール1. sympy
http://docs.sympy.org/latest/index.html
Pythonのライブラリ。`conda` を入れておけばすぐに入る。量子ゲートまわりのクラスや関数が存在するようだ。

```py
>>> from sympy.physics.quantum.gate import X,Y,Z,H,CNOT,SWAP
>>> from sympy.physics.quantum.qubit import Qubit
>>> Qubit('0101')
|0101>
```


# ツール2. OpenFermion
http://openfermion.readthedocs.io/en/latest/openfermion.html
Pythonのライブラリ。こっちは量子アニーリングに使うのかな。生成消滅演算子をつかって系を記述する。格子系、イジングモデルとかを記述できそう。

```py
>>> from openfermion.ops import FermionOperator
>>> my_term = FermionOperator(((3, 1), (1, 0)))
>>> my_term
1.0 [3^ 1]
```

# 資料1. 慶応が提供するYoutubeでの講座

Youtube 再生リスト
https://www.youtube.com/playlist?list=PLB1324F2305C028F7

>2005年3月22~24日慶應義塾大学理工学部で開催された量子コンピューティングに関する一連の講義。講師は阿部英介博士と山口文子博士でスペシャルゲストとして古田彩氏を迎えています。テキストとしてはNielsenとCuangによる有名な教科書Quantum Computation and Quantum Information (Cambridge Universtiy Press)に基づきますが独自のテキストも講義資料はPDFで http://www.appi.keio.ac.jp/Itoh_group... からダウンロードできます。

スライド
https://www.appi.keio.ac.jp/Itoh_group/abe/lecture.html#link2


## 資料1-1メモ: 量子ビットと量子ゲート

動画: https://www.youtube.com/watch?v=R2fyLl7KZXM
スライド: https://www.appi.keio.ac.jp/Itoh_group/abe/pdf/qc1.pdf

- 量子ビット
    - 二準位系、N個の粒子からなる系。
        - `2**N` のヒルベルト空間。
        - 各粒子の状態を0, 1 で表す。例：`|0101>`
    - 重ね合わせ状態を考える
        - とはいえ、基底(|0>,|1>)の出力を調べれば十分
        - 重ね合わせ状態は基底の出力を混ぜ合わせればよい（線形性ばんざい）
        - （たぶん）混合状態は扱わない。
- 量子ゲート
    - 量子ゲート＝ユニタリ変換（例：ハミルトニアンによる時間発展）
        - 物理的な実装は考慮外
    - N = 1
        - X, Y, Z : パウリ行列に対応。 X は NOT に等しいという性質がある
        - H: 基底状態⇒重ね合わせ状態
    - N = 2
        - CNOT: 制御ビットの状態をターゲットに足すと解釈できる
        - SWAP: ビットの交換
        - CZ: 制御とターゲットの区別がない(nonlocal)
    - N = 3
        - Toffoli: C2NOTとも呼ばれる

感想：計算に癖があるので手を動かさないと難しい部分があった。(HXH=Zとか)それ以外は量子力学の復習という感じなので、今のところ何とかなる。

## 資料1-2メモ: 量子テレポーテーション
動画: https://www.youtube.com/watch?v=mose-W49uF8
スライド: https://www.appi.keio.ac.jp/Itoh_group/abe/pdf/qc2.pdf

- ベルペア
    - 2粒子系
    - エンタングルした4つの基底でも記述可能
    - ベル測定＝上記の基底に射影する観測のこと
    - 基底変換
        - 普通の基底（粒子ごとのテンソル積）からベル測定の基底への変換
        - 量子サーキットで実現可能
- 量子テレポーテーション **QT**
    - ベルペア(Alice,Bob)＋ターゲット状態をもつ粒子(Victor)の3粒子系
    - 何これ？
        - ベル測定の基底(|beta00>)と任意の状態|ψ>を入力とする
        - Bobの状態を |ψ> にする
    - どうやって？
        - Aliceでベル測定
        - 結果を古典チャネルでBobに通知
        - 結果に応じてBobのベル粒子に操作を施す（Recovery)
        - Bobの状態が |ψ> になる
- 重要な概念
    - 測定とリカバリは可換
    - 量子回路という観点ではQTとSWAPはそれほど違いはない

式を追うことはできた。ただ、「結局量子テレポーテーションって、ただのSWAPのことだったの？実は大した発明ではない？」みたいに混乱はしている。

## 資料1-3メモ: DJアルゴリズム
動画: https://www.youtube.com/watch?v=vHIag48qFMA
スライド: https://www.appi.keio.ac.jp/Itoh_group/abe/pdf/qc3.pdf

- n-qubit の状態の10進表現
    - 2進数⇒10進表現と対応づけ可能 `|101> ⇒ |5>`
    - 各qubitの|0>にHをかけると、10進表現のlinear superpositon になる
- 量子並列計算
    - レジスタビット（n-qubit |x>）とワークビット（1-qubit |y>）の系
    - この二つをもつれさせるFゲート: `|x>|y> -> |x>|y+f(x)>` があるとする
    - もつれた後に、レジスタビットの測定をすると、
    - 測定結果に応じて、f(x) の一部が得られる
    - 1回しかゲートを通していないにもかかわらず
    - f(0),f(1),.... が得られるので並列計算したようなもの
    - ただし測定は複数しなければならないので、対処が必要
- DJアルゴリズム
    - Fゲートが、constantもしくはbalancedであるとする
    - Fゲートが constant か balanced であるかを決定づけるアルゴリズム

## 資料1-4メモ: グローバーアルゴリズム
動画: https://www.youtube.com/watch?v=U6HszEyIuEw
スライド: https://www.appi.keio.ac.jp/Itoh_group/abe/pdf/qc4.pdf

- グローバーのアルゴリズム
    - 何これ
        - 重ね合わせ状態から、特定の状態を見つける
        - `2**N`の linear superposition を 特定の `|β>` に収束させる量子ゲートを構築する方法 
    - どうやって
        - オラクル（検算器のようなもの）を使って特定の状態の確率振幅だけ符号転換
        - Inversion about mean　と呼ばれる操作をすると、特定の状態が増幅
        - 上記二つをまとめてグローバーオペレータといって
        - 何回かやるときちんと収束に近い状態にもっていける
- オラクル
    - n-qubit(入力用)とm-qubit(workspace)と1-qubit(出力用,oracle-qubit)の系
    - `|x>|*>|q> -> |x>|*>|q+f(x)>` とするものがオラクル
    - q として `|0>-|1>`を採用すると、入力の位相変化に帰着
    - つまり、オラクルの再定義: `|x> -> (-1)^f(x) |x>`
- 2次元系での理解
    - 2次元（特定の状態の振幅、それ以外の状態全部の状態の振幅）で考える
    - グローバーオペレータでその二つ組がどのように変化するかを追うと
    - グローバーオペレータは回転に帰着
    - y軸にできるだけ近づけたい、と問題を再定義できて
    - O(√N)回グローバーオペレータを書けるのが最適とわかる