LaTeXで量子回路を描く

最近は量子コンピュータという言葉を聞く機会が増え、量子回路を描く必要が増している…はずです。
そのため本記事では**業界標準[^1]であるLaTeXのqcircuitパッケージ**を利用した量子回路の描き方について解説します。

[^1]: 歴史的にはqcircuitパッケージの元となるQ-circuitマクロをM. A. Nielsenも利用していますし、QISKit等最近の量子SDKでも出力として利用されていることから、業界標準と言っても過言ではないはずです。


## TL;DR
LaTeXのqcircuitパッケージを利用すると次のようなカッコイイ量子回路が描けます。

<img src="https://qiita-image-store.s3.amazonaws.com/0/278138/bd2a4359-4d10-fa46-74b4-018e45634972.png" alt="qcircuitによる量子回路例" height="200" />

<!-- ![qcircuitによる量子回路例](https://qiita-image-store.s3.amazonaws.com/0/278138/bd2a4359-4d10-fa46-74b4-018e45634972.png) -->

### 前提
私の環境はWindows 10 + TeX Live 2018です。
最近のTeXディストリビューションが導入されており、適切にPDFが生成できるなら問題ないと思います。
ただしqcircuit及び依存するxy-picとif­pdfパッケージがなければ導入して下さい。


## 実際に量子回路を描く
例として上に掲載した量子回路のLaTeXファイルを見てみましょう。

```LaTeX:sample.tex
\documentclass[12pt,border={25pt 5pt 5pt 5pt}]{standalone}

\usepackage[T1]{fontenc}
\usepackage{lmodern}
\usepackage[cmex10]{amsmath}

\usepackage{qcircuit}
\usepackage{braket}

\begin{document}

\Qcircuit @C=1em @R=.7em {
  \lstick{\ket{0}} & \gate{H} & \ctrl{1} & \qw          & \qw      & \meter \\
  \lstick{\ket{0}} & \qw      & \targ    & \ctrl{1}     & \qw      & \meter \\
  \lstick{\ket{0}} & \qw      & \gate{H} & \control \qw & \gate{H} & \meter
}

\end{document}
```

このようなファイルを用意し`pdflatex sample.tex`等としてコンパイルするとPDFのカッコイイ量子回路が得られます[^2]。
なお本記事では得られたPDFをImageMagickでPNGに変換したものを掲載しています。

[^2]: (u)pLaTeX+dvipdfmxでも問題ありませんが、特に理由がなければコンパイル時間が短くて済むpdfLaTeXをオススメします。

上記LaTeXソースには様々なパッケージやコマンドが含まれていますが、カッコイイ量子回路を作製するために必要な知識は次の2点です。

- standaloneクラスとborderオプション
- Qcircuitコマンド

とりあえず後者の明らかに量子回路に関係するコマンドから解説していきましょう。


## Qcircuit
qcircuitでは方眼紙のように要素を行と列で区切って量子回路を表現します。
解りやすくするために区切り線とコマンドを記載した量子回路図を用意しました。

<img src="https://qiita-image-store.s3.amazonaws.com/0/278138/01644896-060a-3c77-cfbd-6d4fa343c8e3.png" alt="量子回路とコマンド" height="300" />

<!-- ![量子回路とコマンド](https://qiita-image-store.s3.amazonaws.com/0/278138/01644896-060a-3c77-cfbd-6d4fa343c8e3.png) -->

先程のQcircuitコマンドと比較すれば一目瞭然ですね。
LaTeXにおけるテーブルと同様に列方向の区切りには`&`、行区切りには`\\`を使用します。

```LaTeX
\Qcircuit @C=1em @R=.7em {
  \lstick{\ket{0}} & \gate{H} & \ctrl{1} & \qw          & \qw      & \meter \\
  \lstick{\ket{0}} & \qw      & \targ    & \ctrl{1}     & \qw      & \meter \\
  \lstick{\ket{0}} & \qw      & \gate{H} & \control \qw & \gate{H} & \meter
}
```

`\Qcircuit`に続く`@C=1em`は列(column)、`@R=.7em`は行(row)の間隔です。
量子回路の中でケットベクトルを利用したいのでbraketパッケージの`\ket`コマンドを利用しています[^3]。

[^3]: `\usepackage[braket]{qcircuit}`としてqcircuitパッケージが提供する`\bra`及び`\ket`コマンドを利用することも出来ます。


### コマンド
上記の例のように量子ゲートを配置するには`\gate{H}`等とします。今回使用したコマンドは以下の通りです。

| コマンド | 効果 | 備考 |
| :-- | :-- | :-- |
| `\qw` | 何もしない量子線(quantum wire)を出力 | `\qw`がない場合には横線が無くなります |
| `\gate{#1}` | `#1`で表される量子ゲートを出力 | `#1`は標準で数式環境ですので`$H$`等とすると怒られます[^4] |
| `\ctrl{#1}` | 条件を示す点及び`#1`個下への線を出力 | `#1`は負の値も利用できます |
| `\targ` | CNOTゲート等の対象として利用される排他的論理和(XOR)記号を出力 | |
| `\control` | CZゲート等の対象として利用される点を出力 | このコマンドは点のみを出力するため通常は`\qw`と一緒に利用されます |
| `\meter` | 測定を表す記号を出力 | |

この他にも`\qswap`や`\multigate`等のコマンドがあります。
詳しくは`texdoc qcircuit`を実行してマニュアルを見て下さい。例文が載っており非常に解りやすいです。

[^4]: `\gate{\text{gate}}`等とすることで文章を書くこともできます。なおtextコマンドはamsmathパッケージに含まれます。


## standaloneクラス
qcircuitパッケージを利用する上では`\documentclass{article}`でも良いですが、この場合大きな余白を持ったPDFファイルが生成されます。
そこでstandaloneクラスを利用すると簡単に余白を削ることができます。

ただし`\lstick`コマンドを使う場合にはオプションとして`border={25pt 5pt 5pt 5pt}`等として左余白を大きくしないと表示されないので、注意して下さい。
なお引数は余白のサイズで`{左 下 右 上}`の順で指定できます。

## おわりに
qcircuitパッケージを利用すると業界標準のカッコイイ量子回路を描くことができます。

そして今回紹介していないqcircuitパッケージの機能やXy-picパッケージの知識を用いれば、次のようなすごいカッコイイ量子回路を描くことだって出来ます[^5]。

[^5]: ちなみに区切り線とコマンドを記載した量子回路図もLaTeXで作製しています。

<img src="https://qiita-image-store.s3.amazonaws.com/0/278138/2787f6f2-1b8b-2fc6-8c5b-60a6e914274b.png" alt="表面符号の量子回路" height="400" />

<!-- ![表面符号の量子回路](https://qiita-image-store.s3.amazonaws.com/0/278138/2787f6f2-1b8b-2fc6-8c5b-60a6e914274b.png) -->

このようなすごいカッコイイ量子回路ついては[LaTeXで量子回路を描く（応用編）](https://qiita.com/squary/items/b9de9d723e03381c9e9b)を参照下さい。