% Q-circuit version 1.06 % Copyright (C) 2004 Steve Flammia & Bryan Eastin % 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 \usepackage[matrix,frame,arrow]{xy} \usepackage{amsmath} %\newcommand{\bra}[1]{\left\langle{#1}\right\vert} %\newcommand{\ket}[1]{\left\vert{#1}\right\rangle} % Defines Dirac notation. \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]{*{\xy *+<.6em>{#1};p\save+LU;+RU **\dir{-}\restore\save+RU;+RD **\dir{-}\restore\save+RD;+LD **\dir{-}\restore\POS+LD;+LU **\dir{-}\endxy} \qw} % Boxes the argument, making a gate. \newcommand{\meter}{\gate{\xy *!<0em,1.1em>h\cir<1.1em>{ur_dr},!U-<0em,.4em>;p+<.5em,.9em> **h\dir{-} \POS <-.6em,.4em> *{},<.6em,-.4em> *{} \endxy}} % Inserts a measurement meter. \newcommand{\measure}[1]{*+[F-:<.9em>]{#1} \qw} % Inserts a measurement bubble with user defined text. \newcommand{\measuretab}[1]{*{\xy *+<.6em>{#1};p\save+LU;+RU **\dir{-}\restore\save+RU;+RD **\dir{-}\restore\save+RD;+LD **\dir{-}\restore\save+LD;+LC-<.5em,0em> **\dir{-} \restore\POS+LU;+LC-<.5em,0em> **\dir{-} \endxy} \qw} % Inserts a measurement tab with user defined text. \newcommand{\measureD}[1]{*{\xy*+=+<.5em>{\vphantom{#1}}*\cir{r_l};p\save*!R{#1} \restore\save+UC;+UC-<.5em,0em>*!R{\hphantom{#1}}+L **\dir{-} \restore\save+DC;+DC-<.5em,0em>*!R{\hphantom{#1}}+L **\dir{-} \restore\POS+UC-<.5em,0em>*!R{\hphantom{#1}}+L;+DC-<.5em,0em>*!R{\hphantom{#1}}+L **\dir{-} \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}}\save[0,0].[#1,0];p\save !C *{#2},p+LU+<0em,0em>;+RU+<-.8em,0em> **\dir{-}\restore\save +LD;+LU **\dir{-}\restore\save +LD;+RD-<.8em,0em> **\dir{-} \restore\save +RD+<0em,.8em>;+RU-<0em,.8em> **\dir{-} \restore \POS !UR*!UR{\cir<.9em>{r_d}};!DR*!DR{\cir<.9em>{d_l}}\restore \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}{*-=-{\bullet}} % Inserts an unconnected control. \newcommand{\controlo}{*!<0em,.04em>-<.07em,.11em>{\xy *=<.45em>[o][F]{}\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}{*{\xy{<0em,0em>*{} \ar @{ - } +<.4em,0em> \ar @{ - } -<.4em,0em> \ar @{ - } +<0em,.4em> \ar @{ - } -<0em,.4em>},*+<.8em>\frm{o}\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}} \qw \POS[0,0].[#1,0];p !C *{#2},p \save+LU;+RU **\dir{-}\restore\save+RU;+RD **\dir{-}\restore\save+RD;+LD **\dir{-}\restore\save+LD;+LU **\dir{-}\restore} % 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} \newcommand{\ghostnowire}[1]{*+<1em,.9em>{\hphantom{#1}}} % 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. % \gategroup can appear at the end of any gate entry, but it's good form to pick 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.