量子回路をキレイにお手軽に作図したい

# この記事について
量子ゲートの記事を投稿する際に、説明のために下記の様な、量子回路をお絵描きしたい。

<img width=700 src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183826/a80293a8-69a2-a14a-e0c3-74404cb1240d.png>


一方で、

* **専用のソフトや環境を構築することなく**サクッと回路を描きたい
* 可能であれば、**Webサービス**でそういったのがあれば、、

そんなポエムの様な記事です。
また、他の量子コンピュータ関係の他の記事は、下記で紹介しています。

https://qiita.com/shnchr/items/41fa7fd1284d74007a7c


# 量子回路を書く
## 1)Quirk
まず頭に浮かんだのが、これです。
JavaScriptで実装されたシミュレータでドラッグ＆ドロップで量子回路を描ける上に、簡単な計算であれば、このシミュレータ上で動きを確認することもできます。（本当に便利）

* [Quirkで、量子回路を開く](https://algassert.com/quirk#circuit={%22cols%22:[[%22X^t%22],[%22Z^t%22,%22H%22],[1,%22%E2%80%A2%22,%22X%22],[%22%E2%80%A2%22,%22X%22],[%22H%22],[%22Measure%22,%22Measure%22],[1,%22%E2%80%A2%22,%22X%22],[%22%E2%80%A2%22,1,%22Z%22],[1,1,%22Bloch%22]]})

<img width=800 src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183826/efc8105b-dd55-610d-d683-079d6f3025d3.gif>

ただ、やはり、こういった凝った回路は描くことが出来ません。。

<img width=500 src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183826/68bdf7cd-54dc-e41d-18d3-bc3e362d5a56.png>

## 2) StrangeWorks(Qiskit)
次に浮かんだのが、こちらでQiskitの量子回路をStrangeWorksで表示する。
Qiskitそのままでも良いのですが、なんとなくStrangeWorksが頭に浮かんだので。。
一応、

* 回路は描くことはできるが、複雑なモノはやはり厳しい。
* Qiskitでプログラムを記述し、回路への配置は自動で行われるので、
    * 良い点でいえば、細かいことを気にしなくて良い
    * 悪い点でいえば、ゲートの位置が細かく調整できない

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183826/bdcd5673-dea2-ab77-8ce1-e2a947ef5b95.png)


## 3)QCEngine
[こちらの本](https://www.oreilly.co.jp/books/9784873119199/)で紹介されている、シミュレータです。

* Qiskit&StrangeWorksと同じようにコードを描くだけで回路が作図できます。
* 一方で、回路の表記が若干独特だったり、ブロッホ球が円表示だったり慣れが必要です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183826/3f6fbbd2-6dd9-197a-c53d-703dad1b827d.png)

回路はこんな感じに作図できます。
関数毎にブロックが出来上がるんで、コメントを付けたり補記するのには良さそうですね。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183826/170df430-3b11-b90a-aa06-ed2e87cc50e1.png)

# 一旦のまとめ

|#|ツール|作図に<br/>使うモノ|メリット|デメリット|
|:--:|:--:|:--:|:--|:--|
|1|[Quirk](https://algassert.com/quirk#circuit={%22cols%22:[]})|マウス|・マウスでD&Dなので操作が簡単<br/>・回路の装飾もシンプル|・部分的に囲む、コメント等が不可|
|2|[Qiskit & StrangeWorks](https://strangeworks.com/)|ソースコード|・配置を気にしなくて良い|・位置の微調整不可<br/>・囲む、コメント等が不可(同上)|
|3|[QCEngine](https://oreilly-qc.github.io/)|ソースコード|・配置を気にしなくて良い<br/>・関数で処理が表現可能|・表示が独特|

# でたどり着いたのが
結局キレイに作図したいという点で、$LATEX$のライブラリである**Q-circuit**にたどり着きました。。

* https://physics.unm.edu/CQuIC/Qcircuit/Qtutorial.pdf

でも、当初掲げた、お手軽に（環境準備不要）を実現するために、WebでTexが使える

* https://ja.overleaf.com/

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183826/447cd533-2333-0733-43da-566f6147fdeb.png)

にたどり着きました。。

* 複数名での共同編集等が必要であれば、有償アカウントが必要ですが、
* １名でメモ書き程度であれば、無償版のアカウントでも対応できるかと思います。

# 使った感じ
Texの記法、Q-circuitの記法になれる必要がありますが、さすが論文執筆でも使われる組み合わせ
作図もキレイですし、囲む、コメントする等も意のままです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183826/d916437b-31c0-815c-a92c-be7d52cad916.png)

Texのコードを参考までに載せておきます（あまりキレイじゃないです）

```tex
\documentclass[12pt,border={25pt 5pt 5pt 5pt}]{standalone}
\usepackage{qcircuit}
\usepackage{braket}

\begin{document}

\Qcircuit @C=1.3em @R=.8em {
& & & & & & \mbox{Syndrome Measurement} & & & &
\mbox{Recovery}\\
& \qw & \qw & \ctrl{3} & \qw & \qw & \qw &
\ctrl{5} & \qw & \qw &
\multigate{2}{\ \mathcal{R}\ } & \qw\\
& \qw & \qw & \qw & \ctrl{2} & \ctrl{3} & \qw & \qw & \qw & \qw & \ghost{\ \mathcal{R}\ } \qw &\qw\\
& \qw & \qw & \qw & \qw & \qw & \ctrl{2} & \qw &\ctrl{3} & \qw & \ghost{\ \mathcal{R}\ } \qw &\qw\\
& & \lstick{\ket{0}} & \targ \qw & \targ \qw & \qw & \qw & \qw & \qw & \measure{M_a} &\control \cw \cwx\\
& & \lstick{\ket{0}} & \qw & \qw & \targ \qw &\targ \qw & \qw & \qw & \measure{M_b} &\control \cw \cwx\\
& & \lstick{\ket{0}} & \qw & \qw & \qw & \qw &\targ \qw & \targ \qw & \measure{M_c}
\gategroup{2}{2}{7}{10}{.8em}{--} &
\control \cw \cwx
}

\end{document}
```

# まとめ
サクッと、簡単に作図したいときはやはり、**手書きｗ** or [**Quirk**](https://algassert.com/quirk#circuit={%22cols%22:[]})でしょうか。
一方で、やっぱり図はきれいな方が良い！というこだわりを持ちたい時は、

* **[Overleaf](https://ja.overleaf.com/)　と [Q-circuit](https://physics.unm.edu/CQuIC/Qcircuit/Qtutorial.pdf)**

の組み合わせが良さそうです。で、Tex環境とかが手元にあればやはり、普通にTexで描くのが良いのでしょうね。
それを言ってしまったら、この記事は何？とツッコミを受けそうですが、そんなまとめでございました。

何かあれば、コメント等。よろしければ**LGTM**いただければ幸いです。