The Quipper System

Safe HaskellNone




This module provides implementations of an oracle for the Triangle Finding Algorithm.

This oracle injects the graph G into the space {0, 1, . . . , 2l − 1} of l-bit integers, and each oracle call requires the extensive use of modular arithmetic.

The circuits produced by running this "orthodox" oracle are very big. We therefore also provide a "blackbox" oracle, which is simply a placeholder for an actual oracle call, to replace the orthodox oracle when running subroutines and for resource estimation. The oracle circuit is the same every time it is used, so for resource estimation purposes, it only needs to be generated once, rather than inlined at every use site.


Orthodox oracle

o1_ORACLE :: Int -> QNode -> QNode -> Qubit -> Circ (QNode, QNode, Qubit) Source #

Algorithm O-1. The two QNode inputs u and v are assumed to be of equal length.

o1_ORACLE_aux :: Int -> Int -> (QNode, QNode) -> Circ ((QNode, QNode), (QIntTF, QIntTF, QIntTF, QIntTF, QIntTF, QIntTF), (Qubit, Qubit, Qubit, Qubit, Qubit, Qubit, Qubit)) Source #

Compute the various auxiliary data for o1_ORACLE.

o2_ConvertNode :: Int -> QNode -> Int -> Circ (QNode, QIntTF) Source #

Algorithm O-2. Convert a QNode into a freshly assigned QIntTF,

o3_TestEqual :: QIntTF -> QIntTF -> Circ (QIntTF, QIntTF, Qubit) Source #

Algorithm O-3. Compare if two QIntTF’s are equal; return the result in a fresh Qubit.

This function is in general iffy: 00…00 and 11…11 do not test as equal, as they should. However, that case does not arise in the oracle: on the one hand, both 00…00 and 11…11 are literal fixed points of o4_POW17, and on the other, o5_MOD3 never outputs 00.

o4_POW17 :: QIntTF -> Circ (QIntTF, QIntTF) Source #

Algorithm O-4. Compute 17th power of a 31-bit QIntTF x, into a freshly 31-bit QIntTF.

square :: QIntTF -> Circ (QIntTF, QIntTF) Source #

Map a QIntTF x to (x,x^2).

A subroutine factored out of o4_POW17.

o5_MOD3 :: QIntTF -> Circ (QIntTF, QIntTF) Source #

Algorithm O-5. Compute residue modulo 3 of the lower-order bits of a QIntTF, into a fresh 2-bit QIntTF.

This algorithm is size-limited — works for up to 31-bit integers, but not beyond.

This also currently is mismatched with our specification of QIntTF, since it produces output in the range 1–3, rather than 0–2. However, output of this algorithm is only used via '03_TestEqual', so this is not a problem in practice.

o6_SUB :: QIntTF -> Int -> Circ (QIntTF, QIntTF) Source #

Algorithm O-6. Subtract an integer parameter from a QIntTF. Return the result as a second, freshly assigned QIntTF.

o7_ADD :: QIntTF -> QIntTF -> Circ (QIntTF, QIntTF, QIntTF) Source #

Algorithm O-7. Add two QIntTFs. Return the result as a third, freshly assigned QIntTF.

o7_ADD_controlled :: (ControlSource ctrl, Labelable ctrl String) => ctrl -> QIntTF -> QIntTF -> Circ (QIntTF, QIntTF, QIntTF) Source #

Controlled version of o7_ADD. Returns either a copy of the first input (if controls are “off”) or the sum of the inputs (if controls are “on”).

We make this version explicitly, rather than just using controlled, because the controls only need to be applied to a very few selected gates in the routine.

o8_MUL :: QIntTF -> QIntTF -> Circ (QIntTF, QIntTF, QIntTF) Source #

Algorithm O-8. Multiply two QIntTFs; return the result as a third, freshly assigned QIntTF.

double_TF :: QIntTF -> Circ QIntTF Source #

Double a QIntTF in place.

A subroutine factored out of o8_MUL.

Blackbox oracle

placeholder_oracle :: QNode -> QNode -> Qubit -> Circ Qubit Source #

A black-box oracle for testing. Produces a labelled black-box gate in place of the actual oracle circuit.