Safe Haskell | None |
---|---|

Language | Haskell2010 |

Qubits and operations on them, using the indexing conventions of <https://arxiv.org/abs/1711.02086/>.

The example below creates a wavefunction for the Bell state and then performs a measurement on its highest qubit.

>>> import Control.Monad.Random (evalRandIO) >>> import Data.Qubit ((^^*), groundState, measure) >>> import Data.Qubit.Gate (h, cnot) -- Construct the Bell state. >>> let bell = [h 0, cnot 0 1] ^^* groundState 2 >>> bell 0.7071067811865475|00> + 0.7071067811865475|11> @ [1,0] -- Measure the Bell wavefunction. >>> bell' <- evalRandIO $ measure [1] bell >>> bell' ([(1,0)],1.0|00> @ [1,0]) -- Measure it again. >>> evalRandIO $ measure [1] bell' ([(1,0)],1.0|00> @ [1,0]) -- Measure another Bell wavefunction. >>> evalRandIO $ measure [1] bell ([(1,0)],1.0|00> @ [1,0]) -- Measure another Bell wavefunction. >>> evalRandIO $ measure [1] bell ([(1,1)],1.0|11> @ [1,0])

- type QIndex = Int
- data QState
- type Amplitude = Complex Double
- data Wavefunction
- data Operator
- qubit :: QIndex -> (Amplitude, Amplitude) -> Wavefunction
- pureQubit :: QIndex -> QState -> Wavefunction
- qubits :: [Amplitude] -> Wavefunction
- groundState :: Int -> Wavefunction
- pureState :: [QState] -> Wavefunction
- qubitsOperator :: [QIndex] -> [Amplitude] -> Operator
- wavefunctionOrder :: Wavefunction -> Int
- wavefunctionIndices :: Wavefunction -> [QIndex]
- wavefunctionAmplitudes :: Wavefunction -> [([QState], Amplitude)]
- rawWavefunction :: Wavefunction -> Tensor Amplitude
- operatorOrder :: Operator -> Int
- operatorIndices :: Operator -> [QIndex]
- operatorAmplitudes :: Operator -> [(([QState], [QState]), Amplitude)]
- rawOperator :: Operator -> Tensor Amplitude
- (^*^) :: Operator -> Operator -> Operator
- (^*) :: Operator -> Wavefunction -> Wavefunction
- (*^) :: Wavefunction -> Operator -> Wavefunction
- (^^*) :: Foldable t => t Operator -> Wavefunction -> Wavefunction
- (*^^) :: Foldable t => Wavefunction -> t Operator -> Wavefunction
- probabilities :: [QIndex] -> Wavefunction -> [([(QIndex, QState)], Double)]
- project :: [(QIndex, QState)] -> Wavefunction -> Wavefunction
- measure :: RandomGen g => [QIndex] -> Wavefunction -> Rand g ([(QIndex, QState)], Wavefunction)
- wavefunctionProbability :: Wavefunction -> Amplitude

# Types

States of a quibit.

data Wavefunction Source #

A wavefunction for qubits.

An operator on wavefunctions.

# Construction

:: QIndex | The index of the qubit in the wavefunction. |

-> (Amplitude, Amplitude) | The amplitude of the 0 and 1 states, respectively. |

-> Wavefunction | The wavefunction for the qubit. |

Construct a qubit from the amplitudes of its states.

The squares of the norms of the amplitudes must sum to one.

:: QIndex | Which qubit. |

-> QState | The state of the qubit. |

-> Wavefunction | The wavefunction. |

Construct a qubit with a pure state.

:: [Amplitude] | The amplitudes. |

-> Wavefunction | The wavefunction. |

Construct a wavefunction for the amplitudes of its qubit states.

Amplitudes ordered so that the 0 state appears before the 1 state and the lower qubit indices cycle faster than then higher qubit indices. For example, a two-qubit state has its amplitudes ordered |00>, |01>, |10>, |11>. This ordering can be generated as follows, where qubits are orderd from higher indices to lower ones:

`>>>`

[[0,0,0],[0,0,1],[0,1,0],[0,1,1],[1,0,0],[1,0,1],[1,1,0],[1,1,1]]`sequence $ replicate 3 [minBound..maxBound] :: [[QState]]`

The squares of the norms of the amplitudes must sum to one.

:: Int | Number of qubits. |

-> Wavefunction | The ground state wavefunction. |

Construct the ground state where each qubit is in state 0.

:: [QState] | The state of each qubit, ordered from higher index to lower index. |

-> Wavefunction | The wavefunction. |

Constructa a pure state.

:: [QIndex] | The qubit indices for which the operator applies, in descending order according to <https://arxiv.org/pdf/1711.02086/>. |

-> [Amplitude] | The amplitudes of the operator matrix, in row-major order with the states ordered from higher indices to lower ones. |

-> Operator | The wavefunction operator. |

Construct an operator on qubit wavefunctions.

Amplitudes in row-major order where amplitudes are ordered so that the 0 state appears before the 1 state and the lower qubit indices cycle faster than then higher qubit indices. For example, a three-qubit operator has its amplitudes ordered <00|00>, <00|01>, <00|10>, <00|11>, <01|00>, <01|01>, <01|10>, <01|11>, <10|00>, <10|01>, <10|10>, <10|11>, <11|00>, <11|01>, <11|10>, <11|11>, where states in the bras and kets are correspond to the order of the first argument to `qubitsOperator`

. This ordering can be generated as follows:

`>>>`

[([0,0],[0,0]),([0,0],[0,1]),([0,0],[1,0]),([0,0],[1,1]),([0,1],[0,0]),([0,1],[0,1]),([0,1],[1,0]),([0,1],[1,1]),([1,0],[0,0]),([1,0],[0,1]),([1,0],[1,0]),([1,0],[1,1]),([1,1],[0,0]),([1,1],[0,1]),([1,1],[1,0]),([1,1],[1,1])]`fmap (splitAt 2) . sequence $ replicate (2 * 2) [minBound..maxBound] :: [([QState], [QState])]`

The operator must be unitary.

# Properties

wavefunctionOrder :: Wavefunction -> Int Source #

Number of qubits in a wavefunction.

:: Wavefunction | The wavefunction. |

-> [QIndex] | List of qubit indices. |

Qubit indices in a wavefunction.

wavefunctionAmplitudes Source #

:: Wavefunction | The wavefunction. |

-> [([QState], Amplitude)] | List of qubit states and their amplitudes, where indices of states are ordered according to |

Amplitudes of states in a qubit wavefunction.

rawWavefunction :: Wavefunction -> Tensor Amplitude Source #

The `Tensor`

encoding the wavefunction.

operatorOrder :: Operator -> Int Source #

Number of qubits for an operator.

Qubit indices in an operator.

:: Operator | The wavefunction. |

-> [(([QState], [QState]), Amplitude)] | List of qubit state transitions and their amplitudes, in row-major order with the states ordered according to |

Amplitudes of state transitions in a qubit operator.

# Operations

(^*) :: Operator -> Wavefunction -> Wavefunction infixr 6 Source #

Apply an operator to a wavefunction.

(*^) :: Wavefunction -> Operator -> Wavefunction infixl 6 Source #

Apply an operator to a wavefunction.

(^^*) :: Foldable t => t Operator -> Wavefunction -> Wavefunction infixr 6 Source #

Apply a sequence of operators to a wavefunction.

(*^^) :: Foldable t => Wavefunction -> t Operator -> Wavefunction infixl 6 Source #

Apply a sequence of operators to a wavefunction.

:: [QIndex] | Which qubits. |

-> Wavefunction | The wavefunciton. |

-> [([(QIndex, QState)], Double)] | The probabilities for the combinations of qubit states. |

Probabilities of a selection of qubits.

:: [(QIndex, QState)] | The qubits for the state. |

-> Wavefunction | The wavefunction. |

-> Wavefunction | The projected wavefunction. |

Project a wavefunction onto a particular state.

:: RandomGen g | |

=> [QIndex] | Which qubits to measure. |

-> Wavefunction | The wavefunction. |

-> Rand g ([(QIndex, QState)], Wavefunction) | Action for the resulting measurement and wavefunction. |

Measure qubits in a wavefunction.

wavefunctionProbability :: Wavefunction -> Amplitude Source #

The total probability for the wave function, which should be 1.