Safe Haskell | None |
---|
Algorithms.TF.QWTFP
Contents
Description
This module provides an implementation of the Quantum Walk for the Triangle Finding Problem.
The algorithm works by performing a Grover-based quantum walk on a larger graph H, called the Hamming graph associated to G. We refer to this part of the algorithm as the outer walk. The subroutine used to check whether a triangle has been found is itself a quantum walk, the inner walk.
The overall algorithm is parameterized on integers l, n and r specifying respectively the length l of the integers used by the oracle, the number 2n of nodes of G and the size 2r of Hamming graph tuples.
- a1_QWTFP :: QWTFP_spec -> Circ (Bit, CNode, IntMap CNode, IntMap (IntMap Bit))
- a2_ZERO :: QShape a qa ca => a -> Circ qa
- a3_INITIALIZE :: QShape a qa ca => a -> Circ qa
- a4_HADAMARD :: QData qa => qa -> Circ qa
- a5_SETUP :: QWTFP_spec -> IntMap QNode -> Circ (IntMap QNode, IntMap (IntMap Qubit))
- a6_QWSH :: QWTFP_spec -> IntMap QNode -> QDInt -> QNode -> IntMap (IntMap Qubit) -> Circ (IntMap QNode, QDInt, QNode, IntMap (IntMap Qubit))
- a7_DIFFUSE :: QData qa => qa -> Circ qa
- a8_FetchT :: QData qa => QDInt -> IntMap qa -> qa -> Circ (QDInt, IntMap qa, qa)
- a9_StoreT :: QData qa => QDInt -> IntMap qa -> qa -> Circ (QDInt, IntMap qa, qa)
- a10_FetchStoreT :: QData qa => QDInt -> IntMap qa -> qa -> Circ (QDInt, IntMap qa, qa)
- a11_FetchE :: QDInt -> IntMap (IntMap Qubit) -> IntMap Qubit -> Circ (QDInt, IntMap (IntMap Qubit), IntMap Qubit)
- a12_FetchStoreE :: QDInt -> IntMap (IntMap Qubit) -> IntMap Qubit -> Circ (QDInt, IntMap (IntMap Qubit), IntMap Qubit)
- a13_UPDATE :: QWTFP_spec -> IntMap QNode -> QNode -> IntMap Qubit -> Circ (IntMap QNode, QNode, IntMap Qubit)
- a14_SWAP :: QCData qa => qa -> qa -> Circ (qa, qa)
- standard_qram :: Qram
- type GCQWRegs = (IntMap QDInt, QDInt, QDInt, IntMap Qubit, QDInt, Qubit)
- a15_TestTriangleEdges :: QWTFP_spec -> IntMap QNode -> IntMap (IntMap Qubit) -> Circ (IntMap QNode, IntMap (IntMap Qubit), QNode, Qubit, Qubit)
- a16_TriangleTestT :: IntMap (IntMap Qubit) -> Circ (IntMap (IntMap Qubit), Qubit)
- a17_TriangleTestTw :: QWTFP_spec -> IntMap QNode -> IntMap (IntMap Qubit) -> QNode -> Circ (IntMap QNode, IntMap (IntMap Qubit), QNode, Qubit)
- a18_TriangleEdgeSearch :: QWTFP_spec -> IntMap QNode -> IntMap (IntMap Qubit) -> Qubit -> Circ (IntMap QNode, IntMap (IntMap Qubit), QNode, Qubit)
- a19_GCQWalk :: QWTFP_spec -> IntMap QNode -> IntMap (IntMap Qubit) -> QNode -> Qubit -> Circ (IntMap QNode, IntMap (IntMap Qubit), QNode, Qubit, QDInt)
- a20_GCQWStep :: QWTFP_spec -> IntMap QNode -> IntMap (IntMap Qubit) -> QNode -> GCQWRegs -> Circ (IntMap QNode, IntMap (IntMap Qubit), QNode, GCQWRegs)
Main TF algorithm
a1_QWTFP :: QWTFP_spec -> Circ (Bit, CNode, IntMap CNode, IntMap (IntMap Bit))Source
Algorithm 1. Do a quantum walk on the Hamming graph associated with G. Returns a quadruple (testTMeasure, wMeasure, TMeasure, EMeasure) where wMeasure contains a node of the triangle with the other two nodes in TMeasure.
Utility subroutines
a2_ZERO :: QShape a qa ca => a -> Circ qaSource
Algorithm 2.
Initialize the qubits in a register to a specified state.
Defined using the more generic qinit
.
a3_INITIALIZE :: QShape a qa ca => a -> Circ qaSource
Algorithm 3. Initialize to a specified state then apply a Hadamard gate to the qubits in a register.
a4_HADAMARD :: QData qa => qa -> Circ qaSource
Algorithm 4.
Apply a Hadamard gate to every qubit in the given quantum data.
Defined using the more generic map_hadamard
.
a5_SETUP :: QWTFP_spec -> IntMap QNode -> Circ (IntMap QNode, IntMap (IntMap Qubit))Source
Algorithm 5. Set up the register ee with the edge information for the nodes contained in tt.
The outer quantum walk and the standard Qram
a6_QWSH :: QWTFP_spec -> IntMap QNode -> QDInt -> QNode -> IntMap (IntMap Qubit) -> Circ (IntMap QNode, QDInt, QNode, IntMap (IntMap Qubit))Source
Algorithm 6. Do a quantum walk step on the Hamming graph.
a7_DIFFUSE :: QData qa => qa -> Circ qaSource
Algorithm 7. Diffuse a piece of quantum data, in the Grover search sense of reflecting about the average.
Note: relies on
corresponding to the “all false” state.
shape
q
a8_FetchT :: QData qa => QDInt -> IntMap qa -> qa -> Circ (QDInt, IntMap qa, qa)Source
Algorithm 8. Perform a quantum-addressed fetch operation. This fetches the i-th element from tt into ttd. Precondition: ttd = 0.
This could be implemented more efficiently using the qRAM implementation in Alternatives.
a9_StoreT :: QData qa => QDInt -> IntMap qa -> qa -> Circ (QDInt, IntMap qa, qa)Source
Algorithms 9.
Perform a quantum-addressed store operation:
store ttd into the i-th element from tt.
Analogous to a8_FetchT
.
a11_FetchE :: QDInt -> IntMap (IntMap Qubit) -> IntMap Qubit -> Circ (QDInt, IntMap (IntMap Qubit), IntMap Qubit)Source
Algorithm 11. Perform a quantum-addressed fetch operation. This is a somewhat specialized addressed fetching operation.
a12_FetchStoreE :: QDInt -> IntMap (IntMap Qubit) -> IntMap Qubit -> Circ (QDInt, IntMap (IntMap Qubit), IntMap Qubit)Source
Algorithm 12.
Perform a quantum-addressed swap. Analogous to a11_FetchE
.
a13_UPDATE :: QWTFP_spec -> IntMap QNode -> QNode -> IntMap Qubit -> Circ (IntMap QNode, QNode, IntMap Qubit)Source
Algorithm 13. Given a list of nodes tt, a distinguished node ttd, and a list of bits eed, either:
- store the edge information for (ttd,tt) into eed, if eed is initially 0; or
- zero eed, if it initially holds the edge information.
a14_SWAP :: QCData qa => qa -> qa -> Circ (qa, qa)Source
Algorithm 14. Swap two registers of equal size. This is a generic function and works for any quantum data type.
The qRAM operations from Algorithms 8–10 wrapped into a Qram
object.
The inner quantum walk
type GCQWRegs = (IntMap QDInt, QDInt, QDInt, IntMap Qubit, QDInt, Qubit)Source
A type to hold the Graph Collision Quantum Walk Registers
(tau, iota, sigma, eew, cTri, triTestT), used in a20_GCQWStep
.
Arguments
:: QWTFP_spec | The ambient oracle. |
-> IntMap QNode | tt, an R-tuple of nodes. |
-> IntMap (IntMap Qubit) | ee, a cache of the edge information between nodes in tt. |
-> Circ (IntMap QNode, IntMap (IntMap Qubit), QNode, Qubit, Qubit) | Return (tt, ee, w, triTestT,triTestTw). |
Algorithm 15: TestTriangleEdges. Test whether the nodes tt contain a pair that can be extended to a triangle in the graph. Used as the test function in the outer quantum walk. Seeks triangles in two different ways:
- Entirely within the nodes tt. If found, set qubit triTestT.
- With two vertices from tt, a third anywhere in the graph. If found, set qubit triTestTw, and return the third vertex as w. This is implemented using an “inner quantum walk” to seek w.
a16_TriangleTestT :: IntMap (IntMap Qubit) -> Circ (IntMap (IntMap Qubit), Qubit)Source
Algorithm 16: TriangleTestT ee triTestT. Search exhaustively over the array ee of edge data, seeking a triangle. Whenever one is found, flip the qubit triTestT.
Arguments
:: QWTFP_spec | The ambient oracle. |
-> IntMap QNode | tt, an R-tuple of nodes. |
-> IntMap (IntMap Qubit) | ee, a cache of the edge data for T. |
-> QNode | w, another node. |
-> Circ (IntMap QNode, IntMap (IntMap Qubit), QNode, Qubit) | return (tt,ee,w,triTestTw). |
Algorithm 17: TriangleTestTw ee triTestTw. Search exhaustively for a pair of nodes in tt that form a triangle with w. Whenever a triangle found, flip qubit triTestTw.
Arguments
:: QWTFP_spec | The ambient oracle. |
-> IntMap QNode | tt, an R-tuple of nodes. |
-> IntMap (IntMap Qubit) | ee, a cache of edge data for R. |
-> Qubit | triTestT, test qubit recording if a triangle has already been found. |
-> Circ (IntMap QNode, IntMap (IntMap Qubit), QNode, Qubit) | Return (tt, ee, w, regs). |
Algorithm 18: TriangleEdgeSearch. Use Grover search to seek a node w that forms a triangle with some pair of nodes in tt, unless a triangle has already been found (recorded in triTestT), in which case do nothing.
Arguments
:: QWTFP_spec | The ambient oracle. |
-> IntMap QNode | tt, an R-tuple of nodes. |
-> IntMap (IntMap Qubit) | ee, a cache of the edge data for tt. |
-> QNode | w, a node. |
-> Qubit | triTestT, test qubit to record if a triangle has already been found. |
-> Circ (IntMap QNode, IntMap (IntMap Qubit), QNode, Qubit, QDInt) | Return (tt,ee,w,triTestT,cTri). |
Algorithm 19: GCQWalk (“Graph Collision Quantum Walk”)
Perform graph collision on the R-tuple tt and the node w, to determine (with high probability) whether w forms a triangle with some pair of nodes in tt.
a20_GCQWStep :: QWTFP_spec -> IntMap QNode -> IntMap (IntMap Qubit) -> QNode -> GCQWRegs -> Circ (IntMap QNode, IntMap (IntMap Qubit), QNode, GCQWRegs)Source
Algorithm 20: GCQWStep
Take one step in the graph collision walk (used in a19_GCQWalk
above).
Uses many auxiliary registers.
The arguments are, in this order:
- The ambient oracle.
- tt, an R-tuple of nodes.
- ee, a cache of the edge data for tt.
- w, a node.
- regs, various workspace/output registers.
- ttd, eed, taud, eewd, and eedd, local ancillas.
The function returns (tt, ee, w, regs).