module Teleport where
import FunQ
teleport :: QBit -> QM QBit
teleport :: QBit -> QM QBit
teleport psi :: QBit
psi = do
QBit
a <- Bit -> QM QBit
new 0
QBit
b <- Bit -> QM QBit
new 0
QBit -> QM QBit
hadamard QBit
a
(QBit, QBit) -> QM (QBit, QBit)
cnot (QBit
a,QBit
b)
(QBit, QBit) -> QM (QBit, QBit)
cnot (QBit
psi,QBit
a)
QBit -> QM QBit
hadamard QBit
psi
Bit
m_psi <- QBit -> QM Bit
measure QBit
psi
Bit
m_a <- QBit -> QM Bit
measure QBit
a
QBit -> QM QBit
pauliX QBit
b QM QBit -> Bit -> QM ()
forall a. QM a -> Bit -> QM ()
`controlbit` Bit
m_a
QBit -> QM QBit
pauliZ QBit
b QM QBit -> Bit -> QM ()
forall a. QM a -> Bit -> QM ()
`controlbit` Bit
m_psi
QBit -> QM QBit
forall (m :: * -> *) a. Monad m => a -> m a
return QBit
b
exampleTeleport :: QM Bit
exampleTeleport :: QM Bit
exampleTeleport = do
QBit
q <- Bit -> QM QBit
new 0
QBit -> QM QBit
hadamard QBit
q
QBit
q' <- QBit -> QM QBit
teleport QBit
q
QBit -> QM Bit
measure QBit
q'
correction :: QBit -> (Bit, Bit) -> QM QBit
correction :: QBit -> (Bit, Bit) -> QM QBit
correction q :: QBit
q (x :: Bit
x,y :: Bit
y) = do
QBit -> QM QBit
pauliX QBit
q QM QBit -> Bit -> QM ()
forall a. QM a -> Bit -> QM ()
`controlbit` Bit
y
QBit -> QM QBit
pauliZ QBit
q QM QBit -> Bit -> QM ()
forall a. QM a -> Bit -> QM ()
`controlbit` Bit
x
QBit -> QM QBit
forall (m :: * -> *) a. Monad m => a -> m a
return QBit
q
teleport' :: QBit -> QM QBit
teleport' :: QBit -> QM QBit
teleport' psi :: QBit
psi = do
(a :: QBit
a,b :: QBit
b) <- (Bit, Bit) -> QM (QBit, QBit)
bell (0,0)
(Bit, Bit)
m <- (QBit, QBit) -> QM (Bit, Bit)
bellMeasure (QBit
psi,QBit
a)
QBit -> (Bit, Bit) -> QM QBit
correction QBit
b (Bit, Bit)
m