Source code for toqito.states.pusey_barrett_rudolph
"""Construct a set of mutually unbiased bases."""
import itertools
import numpy as np
from toqito.matrices import standard_basis
from toqito.matrix_ops import tensor
[docs]
def pusey_barrett_rudolph(n: int, theta: float) -> list[np.ndarray]:
r"""Produce set of Pusey-Barrett-Rudolph (PBR) states [@Pusey_2012_On].
Let \(\theta \in [0, \pi/2]\) be an angle. Define the states
\[
|\psi_0\rangle = \cos(\frac{\theta}{2})|0\rangle +
\sin(\frac{\theta}{2})|1\rangle
\quad \text{and} \quad
|\psi_1\rangle = \cos(\frac{\theta}{2})|0\rangle -
\sin(\frac{\theta}{2})|1\rangle.
\]
For some \(n \geq 1\), define a basis of \(2^n\) states where
\[
|\Psi_i\rangle = |\psi_{x_i}\rangle \otimes \cdots \otimes |\psi_{x_n}\rangle.
\]
These PBR states are defined in Equation (A6) from [@Pusey_2012_On].
Examples:
Generating the PBR states can be done by simply invoking the function with a given choice of `n` and
`theta`:
```python exec="1" source="above"
from toqito.states import pusey_barrett_rudolph
print(pusey_barrett_rudolph(n=1, theta=0.5))
```
Args:
n: The number of states in the set.
theta: Angle parameter that defines the states.
Returns:
Vector of trine states.
"""
e_0, e_1 = standard_basis(2)
psi_0 = np.cos(theta / 2) * e_0 + np.sin(theta / 2) * e_1
psi_1 = np.cos(theta / 2) * e_0 - np.sin(theta / 2) * e_1
psi = [psi_0, psi_1]
binary_strings = list(itertools.product([0, 1], repeat=n))
states = []
for b_str in binary_strings:
state = []
for b in b_str:
state.append(psi[b])
states.append(tensor(state))
return states