quipper-demos-0.9.0.0: Quipper/Demos/SynthesisTest.hs
-- | Some demos for "Quipper.Libraries.Synthesis".
import Quipper
import Quipper.Libraries.Synthesis
import Quantum.Synthesis.Ring
import Quantum.Synthesis.Matrix
import Quantum.Synthesis.MultiQubitSynthesis
import System.Random
-- ----------------------------------------------------------------------
-- * Some demos for Quipper.Libraries.Synthesis
-- | Import a compressed Clifford+/T/ operator as a Quipper circuit.
main1 :: IO ()
main1 = do
print_simple Preview (exact_synthesis1 (0x1d00d27a0188b095b8cdd4ead9a244198d8b22e :: Integer))
-- | Exact synthesis of a Clifford+/T/ circuit from an exact matrix
-- representation.
main2 :: IO ()
main2 = do
print_simple Preview (exact_synthesis1 op)
where
op :: Matrix Two Two DOmega
op = roothalf^4 * matrix2x2 ( 1 - 2*roottwo, 2 + roottwo - i )
( -2 - roottwo - i, 1 - 2*roottwo )
-- | Exact synthesis of a multi-qubit Clifford+/T/ circuit from an
-- exact matrix representation.
main3 :: IO ()
main3 = do
print_generic Preview (exact_synthesis_alt op) [qubit, qubit]
where
op :: Matrix Four Four DOmega
op = matrix4x4 ( 1, 0, 0, 0 )
( 0, -s, s, 0 )
( 0, 0, 0, 1 )
( 0, s, s, 0 )
s = roothalf
-- | Exact synthesis of a multi-qubit Clifford+/T/ circuit from an
-- exact matrix representation.
main3a :: IO ()
main3a = do
print_generic Preview (exact_synthesis_alt op) [qubit, qubit, qubit]
where
op :: Matrix Eight Eight DOmega
op = matrix [[ 1, 0, 0, 0, 0, 0, 0, 0 ],
[ 0, s, -s, 0, 0, 0, 0, 0 ],
[ 0, 0, 0, 1, 0, 0, 0, 0 ],
[ 0, s, s, 0, 0, 0, 0, 0 ],
[ 0, 0, 0, 0, 1, 0, 0, 0 ],
[ 0, 0, 0, 0, 0, 1, 0, 0 ],
[ 0, 0, 0, 0, 0, 0, 0, 1 ],
[ 0, 0, 0, 0, 0, 0, 1, 0 ]]
s = roothalf
-- | Approximate synthesis of a /z/-rotation as a Clifford+/T/ circuit.
-- Angle θ = π\/128, precision ε = 10[sup −30].
main4 :: IO ()
main4 = do
g <- newStdGen -- a source of randomness
print_simple Preview (approximate_synthesis_zrot prec (pi/128) g)
where
prec = 30 * digits
-- | Approximate synthesis of a global phase.
-- Angle α = π\/128, precision ε = 10[sup −30].
main5 :: IO ()
main5 = do
g <- newStdGen -- a source of randomness
print_simple Preview (approximate_synthesis_phase True prec (pi/128) g)
where
prec = 30 * digits
-- | Approximate synthesis of an arbitrary single-qubit operator,
-- given by Euler angles. Precision ε = 2[sup −50].
main6 :: IO ()
main6 = do
g <- newStdGen -- a source of randomness
let circ = approximate_synthesis_euler True prec (alpha, beta, gamma, delta) g
print_simple Preview circ
where
prec = 50 * bits
alpha = 0.1 * pi
beta = 0.2 * pi
gamma = 0.5 * pi
delta = -0.6 * pi
-- | Approximate synthesis of an arbitrary single-qubit operator,
-- given as a matrix. The matrix is given in an exact notation.
-- Precision ε = 10[sup −10].
main7 :: IO ()
main7 = do
g <- newStdGen -- a source of randomness
let circ = approximate_synthesis_u2 True prec op g
print_simple Preview circ
where
prec = 10 * digits
op = matrix2x2 ( 0.6, 0.8*i )
(-0.8, 0.6*i )
-- | Run any of the above main functions:
main = main3a