#!/usr/bin/env pyscript # $Id: flower_algorithm.py,v 1.5 2006/02/14 14:23:09 paultcochrane Exp $ """ Quite a complex example of using the quantumcircuits library. This shows the quantum circuit of the flower algorithm. """ # import the relevant pyscript libraries from pyscript import * import pyscript.lib.quantumcircuits as qc # define the default units for the diagram defaults.units=UNITS['cm'] # define some handy LaTeX macros defaults.tex_head=r""" \documentclass{article} \pagestyle{empty} \newcommand{\ket}[1]{\mbox{$|#1\rangle$}} \newcommand{\bra}[1]{\mbox{$\langle #1|$}} \newcommand{\braket}[2]{\mbox{$\langle #1|#2\rangle$}} \newcommand{\op}[1]{\mbox{\boldmath $\hat{#1}$}} \begin{document} """ # the main paths through the diagram p1 = Path(P(-.8,0), P(11,0), linewidth=2) p2 = Path(P(0,2), P(6.7,2)) p3 = Path(P(0,4), P(6.7,4)) p4 = Path(P(0,5), P(6.7,5)) # define the quantum fourier transform box r = Rectangle(c=P(6,3.5), width=.8, height=4.2, bg=Color(1)) t = TeX(r'QFT$^\dagger$') t.rotate(-90) t.c = r.c qft = Group(r, t) # define a vacuum state ket0 = TeX(r'\ket{0}') # define a detector det = qc.detector() # define the horizontal and vertical dots TeX objects dots = TeX(r'$\cdots$') vdots = TeX(r'$\vdots$') # define a Hadamard gate H = qc.Boxed(TeX(r'H')) # ancilla qubits label anc = TeX('$q$ ancilla qubits') anc.rotate(-90) # render the diagram render( # the paths through the circuit p1, p2, p3, p4, # place the dots in the diagram Rectangle(s=P(2.7,-.2), height=5.4, width=.5, bg=Color(1), fg=Color(1)), dots.copy(c=P(2.7,0)), dots.copy(c=P(2.7,2)), dots.copy(c=P(2.7,4)), dots.copy(c=P(2.7,5)), vdots.copy(c=P(-.2,3)), vdots.copy(c=P(1,3)), vdots.copy(c=P(6.8,3)), # place the Hadamard gates H.copy(c=P(1,2)), H.copy(c=P(1,4)), H.copy(c=P(1,5)), # describe the classical path qc.classicalpath(Path(P(6.7,2), P(7.5,2), P(7.5,5), P(6.7,5)), Path(P(6.7,4), P(7.5,4)), Path(P(7.5,3), P(9,3), P(9,0)), ), # place boxes for the various unitary operations qc.cbox(TeX(r'$\;U^{2^0}\;$'), 1.8, 0, 2), qc.cbox(TeX(r'$U^{2^{q-2}}$'), 3.8, 0, 4), qc.cbox(TeX(r'$U^{2^{q-1}}$'), 5, 0, 5), # place the detectors det.copy(c=p2.end), det.copy(c=p3.end), det.copy(c=p4.end), # place the displacement of the state \rho and a label qc.Boxed(TeX(r'$\mathcal{D}$'), c=P(9,0)), TeX(r'\renewcommand{\arraycolsep}{1mm}$\left\{\begin{array}{ccc}0&\mathrm{w.p.}&1-p(E_j)\\1&\mathrm{w.p.}&p(E_j)\end{array}\right.$', w=P(9.1,3)), qc.Boxed(TeX(r'$\phi_j$'), c=P(7.5,3)), qc.Dot(P(9,3)), # place the vacuum states ket0.copy(e=p2.start), ket0.copy(e=p3.start), ket0.copy(e=p4.start), # place some labels TeX(r'$\rho$', e=p1.start-P(.1,0)), TeX(r'$\mathcal{E}(\rho)$', w=p1.end+P(.1,0)), TeX(r'\ket{E_j}', s=P(7.5,0.1)), # place the ancilla qubits label anc(c=P(-1,3.5)), # place the quantum fourier transform qft, # output file name file="flower_algorithm.eps") # vim: expandtab shiftwidth=4: