Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
132 changes: 132 additions & 0 deletions Qcircuit.tex
Original file line number Diff line number Diff line change
@@ -0,0 +1,132 @@
% Q-circuit version 2
% Copyright (C) 2004 Steve Flammia & Bryan Eastin
% Last modified on: 9/16/2011
%
% This program is free software; you can redistribute it and/or modify
% it under the terms of the GNU General Public License as published by
% the Free Software Foundation; either version 2 of the License, or
% (at your option) any later version.
%
% This program is distributed in the hope that it will be useful,
% but WITHOUT ANY WARRANTY; without even the implied warranty of
% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
% GNU General Public License for more details.
%
% You should have received a copy of the GNU General Public License
% along with this program; if not, write to the Free Software
% Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA

% Thanks to the Xy-pic guys, Kristoffer H Rose, Ross Moore, and Daniel Müllner,
% for their help in making Qcircuit work with Xy-pic version 3.8.
% Thanks also to Dave Clader, Andrew Childs, Rafael Possignolo, Tyson Williams,
% Sergio Boixo, Cris Moore, Jonas Anderson, and Stephan Mertens for helping us test
% and/or develop the new version.

\usepackage{xy}
\xyoption{matrix}
\xyoption{frame}
\xyoption{arrow}
\xyoption{arc}

\usepackage{ifpdf}
\ifpdf
\else
\PackageWarningNoLine{Qcircuit}{Qcircuit is loading in Postscript mode. The Xy-pic options ps and dvips will be loaded. If you wish to use other Postscript drivers for Xy-pic, you must modify the code in Qcircuit.tex}
% The following options load the drivers most commonly required to
% get proper Postscript output from Xy-pic. Should these fail to work,
% try replacing the following two lines with some of the other options
% given in the Xy-pic reference manual.
\xyoption{ps}
\xyoption{dvips}
\fi

% The following resets Xy-pic matrix alignment to the pre-3.8 default, as
% required by Qcircuit.
\entrymodifiers={!C\entrybox}

\newcommand{\bra}[1]{{\left\langle{#1}\right\vert}}
\newcommand{\ket}[1]{{\left\vert{#1}\right\rangle}}
% Defines Dirac notation. %7/5/07 added extra braces so that the commands will work in subscripts.
\newcommand{\qw}[1][-1]{\ar @{-} [0,#1]}
% Defines a wire that connects horizontally. By default it connects to the object on the left of the current object.
% WARNING: Wire commands must appear after the gate in any given entry.
\newcommand{\qwx}[1][-1]{\ar @{-} [#1,0]}
% Defines a wire that connects vertically. By default it connects to the object above the current object.
% WARNING: Wire commands must appear after the gate in any given entry.
\newcommand{\cw}[1][-1]{\ar @{=} [0,#1]}
% Defines a classical wire that connects horizontally. By default it connects to the object on the left of the current object.
% WARNING: Wire commands must appear after the gate in any given entry.
\newcommand{\cwx}[1][-1]{\ar @{=} [#1,0]}
% Defines a classical wire that connects vertically. By default it connects to the object above the current object.
% WARNING: Wire commands must appear after the gate in any given entry.
\newcommand{\gate}[1]{*+<.6em>{#1} \POS ="i","i"+UR;"i"+UL **\dir{-};"i"+DL **\dir{-};"i"+DR **\dir{-};"i"+UR **\dir{-},"i" \qw}
% Boxes the argument, making a gate.
\newcommand{\meter}{*=<1.8em,1.4em>{\xy ="j","j"-<.778em,.322em>;{"j"+<.778em,-.322em> \ellipse ur,_{}},"j"-<0em,.4em>;p+<.5em,.9em> **\dir{-},"j"+<2.2em,2.2em>*{},"j"-<2.2em,2.2em>*{} \endxy} \POS ="i","i"+UR;"i"+UL **\dir{-};"i"+DL **\dir{-};"i"+DR **\dir{-};"i"+UR **\dir{-},"i" \qw}
% Inserts a measurement meter.
% In case you're wondering, the constants .778em and .322em specify
% one quarter of a circle with radius 1.1em.
% The points added at + and - <2.2em,2.2em> are there to strech the
% canvas, ensuring that the size is unaffected by erratic spacing issues
% with the arc.
\newcommand{\measure}[1]{*+[F-:<.9em>]{#1} \qw}
% Inserts a measurement bubble with user defined text.
\newcommand{\measuretab}[1]{*{\xy*+<.6em>{#1}="e";"e"+UL;"e"+UR **\dir{-};"e"+DR **\dir{-};"e"+DL **\dir{-};"e"+LC-<.5em,0em> **\dir{-};"e"+UL **\dir{-} \endxy} \qw}
% Inserts a measurement tab with user defined text.
\newcommand{\measureD}[1]{*{\xy*+=<0em,.1em>{#1}="e";"e"+UR+<0em,.25em>;"e"+UL+<-.5em,.25em> **\dir{-};"e"+DL+<-.5em,-.25em> **\dir{-};"e"+DR+<0em,-.25em> **\dir{-};{"e"+UR+<0em,.25em>\ellipse^{}};"e"+C:,+(0,1)*{} \endxy} \qw}
% Inserts a D-shaped measurement gate with user defined text.
\newcommand{\multimeasure}[2]{*+<1em,.9em>{\hphantom{#2}} \qw \POS[0,0].[#1,0];p !C *{#2},p \drop\frm<.9em>{-}}
% Draws a multiple qubit measurement bubble starting at the current position and spanning #1 additional gates below.
% #2 gives the label for the gate.
% You must use an argument of the same width as #2 in \ghost for the wires to connect properly on the lower lines.
\newcommand{\multimeasureD}[2]{*+<1em,.9em>{\hphantom{#2}} \POS [0,0]="i",[0,0].[#1,0]="e",!C *{#2},"e"+UR-<.8em,0em>;"e"+UL **\dir{-};"e"+DL **\dir{-};"e"+DR+<-.8em,0em> **\dir{-};{"e"+DR+<0em,.8em>\ellipse^{}};"e"+UR+<0em,-.8em> **\dir{-};{"e"+UR-<.8em,0em>\ellipse^{}},"i" \qw}
% Draws a multiple qubit D-shaped measurement gate starting at the current position and spanning #1 additional gates below.
% #2 gives the label for the gate.
% You must use an argument of the same width as #2 in \ghost for the wires to connect properly on the lower lines.
\newcommand{\control}{*!<0em,.025em>-=-<.2em>{\bullet}}
% Inserts an unconnected control.
\newcommand{\controlo}{*+<.01em>{\xy -<.095em>*\xycircle<.19em>{} \endxy}}
% Inserts a unconnected control-on-0.
\newcommand{\ctrl}[1]{\control \qwx[#1] \qw}
% Inserts a control and connects it to the object #1 wires below.
\newcommand{\ctrlo}[1]{\controlo \qwx[#1] \qw}
% Inserts a control-on-0 and connects it to the object #1 wires below.
\newcommand{\targ}{*+<.02em,.02em>{\xy ="i","i"-<.39em,0em>;"i"+<.39em,0em> **\dir{-}, "i"-<0em,.39em>;"i"+<0em,.39em> **\dir{-},"i"*\xycircle<.4em>{} \endxy} \qw}
% Inserts a CNOT target.
\newcommand{\qswap}{*=<0em>{\times} \qw}
% Inserts half a swap gate.
% Must be connected to the other swap with \qwx.
\newcommand{\multigate}[2]{*+<1em,.9em>{\hphantom{#2}} \POS [0,0]="i",[0,0].[#1,0]="e",!C *{#2},"e"+UR;"e"+UL **\dir{-};"e"+DL **\dir{-};"e"+DR **\dir{-};"e"+UR **\dir{-},"i" \qw}
% Draws a multiple qubit gate starting at the current position and spanning #1 additional gates below.
% #2 gives the label for the gate.
% You must use an argument of the same width as #2 in \ghost for the wires to connect properly on the lower lines.
\newcommand{\ghost}[1]{*+<1em,.9em>{\hphantom{#1}} \qw}
% Leaves space for \multigate on wires other than the one on which \multigate appears. Without this command wires will cross your gate.
% #1 should match the second argument in the corresponding \multigate.
\newcommand{\push}[1]{*{#1}}
% Inserts #1, overriding the default that causes entries to have zero size. This command takes the place of a gate.
% Like a gate, it must precede any wire commands.
% \push is useful for forcing columns apart.
% NOTE: It might be useful to know that a gate is about 1.3 times the height of its contents. I.e. \gate{M} is 1.3em tall.
% WARNING: \push must appear before any wire commands and may not appear in an entry with a gate or label.
\newcommand{\gategroup}[6]{\POS"#1,#2"."#3,#2"."#1,#4"."#3,#4"!C*+<#5>\frm{#6}}
% Constructs a box or bracket enclosing the square block spanning rows #1-#3 and columns=#2-#4.
% The block is given a margin #5/2, so #5 should be a valid length.
% #6 can take the following arguments -- or . or _\} or ^\} or \{ or \} or _) or ^) or ( or ) where the first two options yield dashed and
% dotted boxes respectively, and the last eight options yield bottom, top, left, and right braces of the curly or normal variety. See the Xy-pic reference manual for more options.
% \gategroup can appear at the end of any gate entry, but it's good form to pick either the last entry or one of the corner gates.
% BUG: \gategroup uses the four corner gates to determine the size of the bounding box. Other gates may stick out of that box. See \prop.

\newcommand{\rstick}[1]{*!L!<-.5em,0em>=<0em>{#1}}
% Centers the left side of #1 in the cell. Intended for lining up wire labels. Note that non-gates have default size zero.
\newcommand{\lstick}[1]{*!R!<.5em,0em>=<0em>{#1}}
% Centers the right side of #1 in the cell. Intended for lining up wire labels. Note that non-gates have default size zero.
\newcommand{\ustick}[1]{*!D!<0em,-.5em>=<0em>{#1}}
% Centers the bottom of #1 in the cell. Intended for lining up wire labels. Note that non-gates have default size zero.
\newcommand{\dstick}[1]{*!U!<0em,.5em>=<0em>{#1}}
% Centers the top of #1 in the cell. Intended for lining up wire labels. Note that non-gates have default size zero.
\newcommand{\Qcircuit}{\xymatrix @*=<0em>}
% Defines \Qcircuit as an \xymatrix with entries of default size 0em.
\newcommand{\link}[2]{\ar @{-} [#1,#2]}
% Draws a wire or connecting line to the element #1 rows down and #2 columns forward.
\newcommand{\pureghost}[1]{*+<1em,.9em>{\hphantom{#1}}}
% Same as \ghost except it omits the wire leading to the left.
30 changes: 30 additions & 0 deletions QcircuitDemo.tex
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
% Qcircuit demonstration graphic
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

\documentclass{amsart}

\usepackage[matrix,frame,arrow]{xypic}
\input{Qcircuit}

\vfuzz2pt % Don't report over-full v-boxes if over-edge is small

%%% ----------------------------------------------------------------------
\begin{document}
\[
\Qcircuit @C=1.0em @R=.7em {
& \gate{H} & \ctrlo{3} & \qw & \qw & \qw & \ctrl{5} & \qw & \gate{H} & \multigate{2}{U^\dag} & \qw\\
\lstick{\begin{array}{r}\alpha\ket{000}\ \ \ \\+\beta\ket{111}\end{array}}
& \gate{H} & \qw & \qswap \qwx[2] & \ctrl{3} & \qw & \qw & \qw & \gate{H} & \ghost{U^\dag} \qw & \qw\\
& \gate{H} & \qw & \qw & \qw & \ctrl{2} & \qw & \ctrl{3} & \gate{H} & \ghost{U^\dag} \qw & \qw\\
& \lstick{\ket{0}} & \targ & \qswap \qw & \qw & \qw & \qw & \qw & \qw & \measure{answer} \cwx\\
& \lstick{\ket{1}} & \qw & \qw & \control \qw & \targ & \qw & \qw & \qw & \meter\\
& \lstick{\ket{0}} & \qw & \qw & \qw \gategroup{6}{3}{6}{5}{1.0em}{_\}} & \qw & \targ & \gate{Y} & \qw & \measuretab{M_{abc}} \gategroup{1}{9}{6}{10}{1em}{--} & \control \cw \cwx[3] \\
& & & & & & \vdots \\
\\
& \qw & \qw & \qw & \qw & \qw & \qw & \qw & \qw & \qw & \multigate{2}{\mathcal{F}} & \qw\\
& \qw & \qw & \qw & {\backslash} \qw & \qw & \qw & \qw & \qw & \qw & \ghost{\mathcal{F}} \qw & \qw\\
& \qw & \qw & \qw & \qw & \qw & \qw & \qw & \qw & \qw & \ghost{\mathcal{F}} \qw & \qw
}
\]
\end{document}
% ------------------------------------------------------------------------
Loading