Advent Calendar

量子回路をLaTeXで描いてみよう!(Quantikz)

⚠記事の内容は学生個人の見解であり、所属する学科組織を代表するものではありません。
$$ \def\bra#1{\mathinner{\left\langle{#1}\right|}} \def\ket#1{\mathinner{\left|{#1}\right\rangle}} \def\braket#1#2{\mathinner{\left\langle{#1}\middle|#2\right\rangle}} $$

はじめに

どうも,物理学科3年のKokiといいます.弊学物理学科学生有志による五月祭企画「Physics Lab. 2023」の量子物理学班の班長をしております.人によっては,趣味や生活に関することを語っていますが今回はだいぶ真面目寄りのトピックを書き連ねていきます. 新聞やニュースでも,たびたびトピックになる量子コンピュータ.その回路図の作成方法を紹介します.ただ,LaTeXで量子回路を描く で紹介されているqcircuitではなく,quantikzについて紹介していきます.パッケージのダウンロード先はQuantikz CTANから飛ぶことができます.

どんな回路図が描けるか?

例としては,次のようなコードで下図が書けます!(最初だけ,documentclassなどの情報を入れてます.)

\documentclass[12pt,border={25pt 5pt 5pt 5pt}]{standalone}

\usepackage[dvipdfmx]{graphicx}
\usepackage{physics}
\usepackage{quantikz}
\begin{document}

\begin{quantikz}[thin lines]
  \lstick{{$\ket{0}$}} & \gate{H} & \ctrl{1} &\gate{U} 
  & \ctrl{1} &\swap{2} & \ctrl{1} &\qw \\
  \lstick{{$\ket{0}$}} & \gate{H} & \targ{} &\octrl{-1} 
  & \control{} &\qw & \octrl{1} &\qw \\
  &&&&& \targX{} & \gate{U} & \qw
\end{quantikz}

\begin{document}

qiita_ex1.jpg

\begin{quantikz}[row sep = 0.7em, thin lines]
  \lstick{$\ket{\psi}$} & \qw 
  & \qw & \ctrl{1} & \gate{H} 
  & \meter{} & \cwbend{2} & \\
  \lstick{$\ket{0}$} & \qw 
  & \targ{} & \targ{} & \qw 
  & \meter{} \vcw{1} & &\\
  \lstick{$\ket{0}$} & \gate{H} 
  & \ctrl{-1} & \qw & \qw 
  & \gate{X} & \gate{Z} & \rstick{$\ket{\psi}$} \qw 
\end{quantikz}

qiita_ex2.jpg さらに複雑な回路だと,この様な回路も書くことができます(コードは長いんで省略しました.量子回路の内容が気になる方は参考文献を見てみてください).

monster_cir.jpg

環境条件

qcircuitでは,Xy-picパッケージ,Ifpdfパッケージに依存していましたが,quantikzパッケージのみ有れば使えるものとなっています. それでなおかつ,qcircuitとかなり共通点の多いパッケージとなっており,それでいて自由度の高いものとなっています!

実際に描いてみよう!

この節の内容はほとんど,LaTeXで量子回路を描く とほとんど同じ内容を含んでおります.参考としてそちらもご覧ください1.殊にテーブルを使って説明されている部分はこちらの記事に準拠した内容となっています.

コードの見方

quantikzでも,行列テーブルのようにコマンド要素について行と列で区切って,量子回路を表現します.先達に倣って,解りやすくするために区切り線とコマンドを記載した量子回路図を用意しました2qiita_ex3.jpg

\begin{quantikz}[row sep = 0.7em, thin lines]
  \lstick{$\ket{0}$} & \gate{H} & \ctrl{1} & \qw          & \qw              & \meter{} \\
  \lstick{$\ket{0}$} & \qw      & \targ{}  & \ctrl{1}     & \qw              & \meter{} \\
  \lstick{$\ket{0}$} & \qw      & \gate{Z} & \control \qw & \gate{T^\dagger} & \meter{1}
\end{quantikz}

quantikzにおいても,LaTeXの行列のように列区切りには&,行区切りには\\を使います.ここで,量子回路ダイアグラムの見易さのために,設定を[row sep =0.7em, thin lines]として引数として入れていますが,細かい設定については下で説明していきます.

ここで注意としては量子状態の表現で\(\hspace{0.2em}\ket{0}\hspace{0.2em}\)を使っていますが,これはphysicsパッケージやbraketパッケージを用いないと使えないので,気を付けてください3

基本コマンド

上で使っている基本コマンドを説明していきます.これだけでも覚えれば基本的な量子回路は描くことができます.ここで数式を表す引数は#1を,テキストを表す引数は#2で書きます.単なる数字を表す場合には#3とします.

コマンド 効果 備考
\lstick{#2} このコマンド位置のテーブル位置の右側に#2を出力 あまり拘らない場合は,#2で表した量子状態を配置する程度の理解で問題ないです
\qw 何もしない量子結線(quantum wire)を出力 \qwがない場合には横線が無くなります
\gate{#1} #1で表される量子ゲートを出力 #1は標準で数式環境ですので$H$等とすると怒られます[^4]
\ctrl{#3} 制御ビットを表す黒点と#3個下への線を出力 #3は負の値も利用できます
\targ{} XORの意味を含む,対象ビットをXフリップさせるゲート記号の出力 {}の中の引数はあまり意味をなさない...?
\control CZゲート等の対象として利用される点を出力 このコマンドは点のみを出力するため通常は\qwと一緒に利用されます
\meter{#2} 測定を表す記号を出力 #2は入れなくても問題ないが,入れると記号の上に#2が出力される 

個人的に思うQuantikzの優れた点

Q-circuitはかなり前に作られたもので,おそらく今なお業界標準のパッケージではあります.しかしながら,非常に巨大な回路図を作ることを考えた時に各行&の数を統一する必要があり,一つ数え間違えるとエラーが出てしまうため,体裁を整えるのに微調整が非常に面倒でした. しかしながら,tikzの特徴上,各行&の数は任意なので微妙な位置にオブジェクトを置きたいと思った時に,簡易的にできる点で優れていると思います. さらに,Xypicsの特徴上,量子回路向きではない記法の使い方があったところを改善したことによって,使いやすくなっているところも良いと思います.(例えば,Q-circuitの公式documentで挙げられていた良くあるエラーが構造上起こらない.)

更に以下で挙げるような詳細で挙げますが,tikzの自由度を利用してやれることが増えました.

詳細

ここまでの内容でバラエティに富んだ量子回路を作れるのですけど,細部を究めたい人向けに,詳細を連ねていきます.自分にとっては以下の内容が重要な本文だと思っています.

回路の設定

\begin{quantikz}の後に[]の中に入れる設定を紹介していきます.それなりに多い要素を含むので区分分けして紹介します.以下,ここで数式を表す引数は#1を,テキストを表す引数は#2で書きます.単なる数字を表す場合には#3とします

テーブル間隔設定

引数 効果 備考 
row sep = #3 行(row)間隔を#3に合わせる 但し,回路オブジェクトのサイズが#3を上回る場合は,回路オブジェクトのサイズに合うようにしてくれる
column sep = #34 列(column)間隔を#3に合わせる. 上と同様
row sep = {#3,between origins} 全ての列間隔をに#3に合わせる. オブジェクトが重なるのを無視して合わせる.ちなみに#3,betweenの間にスペースを入れるとエラーとなる.
column sep = {#3,between origins} 全ての行間隔をに#3に合わせる. 上と同様

結線,オブジェクト描画設定

引数 効果 備考 
\line thins 結線,回路オブジェクトの枠線を細くする
\transparent 回路オブジェクトの配色を白から透明にする

\transparent\linethroughと併用することによって例に示したように擬立体的な回路を作成できる便利な機能です.

適用例

この様な回路を作る場合には,元々\qwが入る位置に\linethroughを入力すると良いです.

trans.jpg

回路,文字のスケール設定

引数 効果 備考 
scale=#3 回路全体の大きさを#3倍にする
width=#3\textwidth 回路全体の幅を#3倍にする

量子状態の配置

基本コマンドで\lstick{#1}を使って\(\hspace{0.2em}\ket{\psi}\hspace{0.2em}\)などの,状態を最初に配置したと思いますが,この\lstickの意味について説明していきます. はじめに,\lstick{#1}とはLeft Stick outから来ており,テーブル要素の配置位置の中心から#1を左(Left)方向へはみだす(Stick out)という操作を表しています.そのため,stick out方向として左,右,上,下(left, right, up, down)を指定してあげれば,

上図のようにテーブル要素中心の各方向に好きなオブジェクトを配置することができます.(qcircuitには\ustick,\dstickがありましたが,quantikzにはない様です.)

stickに関するコマンドを以下の表にまとめました.

コマンド 効果
\lstick{#1} #1をコマンドの記入したテーブル要素の左側に配置する.
\rstick{#1} #1をコマンドの記入したテーブル要素の右側に配置する.

結線,1量子ゲート,測定器,位相因子など

コマンド 効果 備考 
\gate{#1} 1量子ゲートを配置する.
\phase{#1} 結線とともに位相因子を表す記号を配置する.
\push{#1} 結線とともに数式を配置する
\meter{#1} 測定器を配置する #2に入れた文字が,測定器記号の上部に配置される
\meterD{#2} D字型の測定器を配置する #1に入れた数式が,測定器記号の内部に配置される
\measuretab{#1} 特殊な形状の測定器を配置する #1に入れた数式が,測定器記号の内部に配置される
\metesure{#1} 円盤型の測定器を配置する #1に入れた数式が,測定器記号の内部に配置される
\qw 何も要素のない結線を配置する
\vqw{#3} 垂直方向の結線を配置する(例は次節を参照.) #3に対応する長さの結線を下方向に伸ばします
\cw 古典的結線を配置する
\vcw{#3} 垂直方向の結線を配置する(例は次節を参照.) #3に対応する長さの結線をした方向に伸ばします

gates.jpg measures.jpg cw.jpg

2量子ゲート

コマンド 効果 備考 
\ctrl{#3} 制御ビットを表す黒点の出力と#3の長さの結線を下方向に伸ばす \control{}というコマンドもありますが,これは結線を伸ばすことはしません
\octrl{#3} 制御ビットを表す白点の出力と#3の長さの結線を下方向に伸ばす 白点の意味は文脈依存であると思います
\swap{#3} SWAPゲートを表す×の出力と#3の長さの結線を下方向に伸ばす 微妙に\ctrlの結線と種類が異なります
\targ{} Xフリップを表す記号の出力 引数を入力しても変化は現れません
\targX{} SWAPゲートを表す×のみ出力 \swap{#3}と併用するのがほとんどのケースかと思います

2gates.jpg

結線,量子ゲートに関するオプション

\gate{}等とは,\gate{},\meter{},\push{},\phase{}を指します.

コマンド 効果 備考
\hphantom{wide} \gate{}等の後に入力することで,そのオブジェクトの幅を大きくする very wideとすることもできます
&[#3] 区切り文字&について,この様に入力することでオブジェクト間の長さを#3にする
\qwbundle{#1} \gate{}等の後に入力することで,結線の束を表す記号を出力する. #1はその記号の横に出力される
\qwbundle[akternate] \gate{}の後に入力することで,直前の結線を束状(3本線)に出力する  

wide.jpg 2番目の&[#3]に関して大きく間隔をとった回路です. betww.jpg bundle1.jpg bundle2.jpg

多量子ビット操作関連

コマンド 効果 備考
\gate[wires = #3][#4]{#1} #3に対応するの数の多量子ビットゲートを出力する.#4を入力でゲートの長さが決まる wires=#3とする代わりに#3だけでも問題ない
\lstick[#3]{#1} #3に対応するの数の量子ビットにかかって,左カッコ{ を出力する, 例の入力部の\(\hspace{0.2em}\ket{000}\hspace{0.2em}\)のカッコに対応している
\rstick[#3]{#1} #3に対応するの数の量子ビットにかかって,左カッコ{ を出力する, 例の出力部の\(\hspace{0.2em}\ket{10}\hspace{0.2em}\)のカッコに対応している
\gateinput[#3]{#1} #3に対応するの数の量子ビットにかかって,左カッコ{ を出力するとともに,ゲート入力部に#1を出力する.
\gateoutput[#3]{#1} #3に対応するの数の量子ビットにかかって,右カッコ} を出力するとともに,ゲート出力部に#1を出力する. \gateinputの直後に入力するのが一番良い
\gate[#3,disable auto height]{#1} 上で説明した\gateと内容は変わらないが,この様に入力することで#1の出力の高さ調整を無効化する ゲートの自由度の高いラベル付(縦方向や2段)が可能となる

例1

multi1.jpg

\begin{quantikz}[transparent]
  \lstick[wires = 3]{$\ket{000}$} & \gate{X} \vqw{1} & \meterD{} \\
  & \gate[wires=2][1.5cm]{U} & \qw \rstick[wires = 2]{$\ket{10}$} \\
  & \qw & \qw
\end{quantikz}

例2

multi2.jpg

\begin{quantikz}[transparent]
  \lstick[wires = 3]{$\ket{\psi}$} 
  & \gate[wires=3][1.9cm]{\mathcal{O}} \gateinput[2]{$x$}
  \gateoutput[2]{$x$} 
  & \meterD{} \\
  & \qw
  & \qw \\
  & \qw \gateinput{$y$}\gateoutput{$y \oplus f(x) $} & \qw
\end{quantikz}

例3

右側がdisable auto heightを追加したものです.

multi3.jpg

\begin{quantikz}[transparent]
  \lstick[wires = 3]{$\ket{\psi}$} & \gate[wires=3, disable auto height][2.5cm]{\begin{array}{c} Quantum \\ Oracle \end{array}{c} } 
  \gateinput[2]{$x$} \gateoutput[2]{$x$} 
  & \meterD{} \\
  & \qw
  & \qw \\
  & \qw \gateinput{$y$}\gateoutput{$y \oplus f(x) $} & \qw
\end{quantikz}

締め

いかがでしたでしょうか?ここまで読んできて,quantikzの最低限の知識を身に付けられたと思いますので,皆さんも量子回路を描きたくなったことでしょう.参考文献に載っている公式ドキュメントを読むと,さらにできることが増えると思います(Gate Grouping,波線の活用,量子回路の色付け,など暇ができたら追加していこうかと思います). 未だに量子計算機が抱える問題は数多くありますが,地道な技術発展によって10,20年前では不可能と考えられた問題でも少しずつ解消して,新しい技術が生み出されているのが現状況だと考えています.近い将来ではないですが,いつの日か量子計算機が我々の知見を深める機械として活躍してくれる日々が来るのを気長に待ちましょう.

参考文献

  1. Quantikz CTAN
  2. LaTeXで量子回路を描く
  3. 公式ドキュメント
  4. どんな回路図が描けるか?で挙げている量子回路が描かれた元論文

脚注

  1. 但し,QuantikzとQ-circuitでは微妙な部分で差異があるのでその点は気を付けてください.

  2. \sliceというコマンドによって,回路要素に区切ることが簡単になっているのでこの様な回路図でも非常に作りやすくなっています.

  3. physicsパッケージの説明はLaTeX で物理学徒が最低限知っておくべきこと・私が気を付けていること などを参照すると良いと思います.

  4. 公式ドキュメントにこれに関する一部誤植あり.col sep = #3とするとエラーとなる.