quipper-demos-0.9.0.0: Quipper/Demos/Teleport.hs
import Quipper
plus_minus :: Bool -> Circ Qubit
plus_minus b = do
q <- qinit b
q <- hadamard q
return q
share :: Qubit -> Circ (Qubit, Qubit)
share a = do
b <- qinit False
b <- qnot b `controlled` a
return (a,b)
bell00 :: Circ (Qubit, Qubit)
bell00 = do
a <- plus_minus False
(a,b) <- share a
return (a,b)
alice :: Qubit -> Qubit -> Circ (Bit,Bit)
alice q a = do
a <- qnot a `controlled` q
q <- hadamard q
(x,y) <- measure (q,a)
return (x,y)
bob :: Qubit -> (Bit,Bit) -> Circ Qubit
bob b (x,y) = do
b <- gate_X b `controlled` y
b <- gate_Z b `controlled` x
cdiscard (x,y)
return b
teleport :: Qubit -> Circ Qubit
teleport q = do
(a,b) <- bell00
(x,y) <- alice q a
b <- bob b (x,y)
return b
-- ----------------------------------------------------------------------
-- main functions
main_alice =
print_simple Preview alice
main_bob =
print_simple Preview bob
main_teleport =
print_simple Preview teleport
main = main_teleport