#量子コンピュータの勉強、いくら紙あっても足りんわ。
……ということで、ゲート演算をいい感じにやってくれるライブラリ作ってみました。
https://github.com/gyu-don/gate_operation
#特徴
- 量子コンピュータの参考書などに出てくる小さい量子回路を再現するのが目的
- メソッドチェーンっぽい書き方ができる
- IPythonやJupyter Notebookなどのインタラクティブな環境での使いやすさを重視
- 回路を作り終えてからシミュレートするのではなく、ゲートを適用するたびに計算が走る
- バックエンドにNumPy版とSymPy版の両方を用意している(ただし SymPyはNumPyより遅い)
- Qubitと、ユニタリ行列と、後で再利用できるよう操作を覚えておくためのクラスの3種類を用意している
- 現時点ではコロコロ仕様変えるかも。バグったコードをmasterにpushしたりとかもよくある。
##まだだけど、そのうちやりたいこと(上の方が、優先したいお気持ちが強い)
- 高速化
- いろんな量子回路を組んで、examplesとしてgithubに載せる
- ユニタリ行列のフィデリティを計算する機能を追加
- 観測を何度も行うとか、量子トモグラフィ的なやつとか、そういう機能の充実
- Jupyter Notebook用の表示をもっとかっこよくする(Displayとか使う)
- UnitTest作る
- ドキュメント書く
- OpenQLプロジェクトとの統合
- PyPIに登録
- OpenQASMや、qiskitのQuantumProgram、pyquilのProgramへの変換
#使い方
##量子テレポーテーションやってみよう
量子テレポーテーション
import np_gate # NumPy backendを使用
# aliceに何か1Qubitもたせる。
alice = np_gate.Qubit(1).h(0).t(0)
# シミュレータなので、クローンできる。
# |circuit> = |alice>
circuit = alice.clone()
# |0>を2個付け加える
# |circuit> = |alice>|00>
circuit.append_qubit(2)
# 付け加えた2つをベル状態にする
# |circuit> = (|alice>|00> + |alice>|11>) / sqrt(2)
circuit.h(1).cx(1, 2)
# 以下の量子ゲートを適用
# --*--H-----*--
# --|-----*--|--
# --X-----X--Z--
circuit.cx(0, 1).h(0).cx(1, 2).cz(0, 2)
# 1番目、0番目のQubitを捨てる(観測される)
circuit.drop_qubit(1).drop_qubit(0)
# 残ってるやつとaliceのQubitとのフィデリティを取ると、だいたい1になる(テレポーテーション成功)
print(alice.fidelity(circuit)) # => Almost 1
##2ビットのGroverでもっと詳細な使い方
ここに置いてます。
https://github.com/gyu-don/gate_operation/blob/master/examples/Grover%20algorithm%202qubit.ipynb
##Shorの誤り訂正符号(1Qubit送るのに9Qubit使ったら、そのうちの1つがごちゃごちゃになっても復元できるやつ)
ここに置いてます。ちなみに、SymPyでやると9Qubitは非常に計算が重かったので、NumPyでやってます。
https://github.com/gyu-don/gate_operation/blob/master/examples/Shor%20error%20correcting%20code.ipynb
#まとめ
量子コンピュータはいいぞ