What is a Quantum Reference Frame?

One school of thought is that quantum states are relative states. In other words, things don't "have" quantum states, except with reference to some observer, or some subsystem considered to be "observer."

Let's consider how this might work in terms of a Wigner's Friend type set-up. Let's consider three spin-$\frac{1}{2}$ states $A$, $B$, and $C$. $A$ is "Wigner," $B$ is his "friend," and $C$ is the spin to be measured, in this case in the state $\mid \uparrow \rangle + \mid \downarrow \rangle$.

Let's write down the initial state "from $A$'s perspective":

$\mid \uparrow \rangle_{A}^{A} \mid \uparrow \rangle_{B}^{A} (\mid \uparrow \rangle + \mid \downarrow \rangle)_{C}^{A}$.

The notation here is that $()_{B}^{A}$ means the state of $B$ relative to $A$, or $A$'s perspective on $B$. So at the beginning of the experiment, from $A$'s perspective, $B$ is $\uparrow$ and $C$ is in a superposition of $\uparrow$ and $\downarrow$.

Then, $B$ measures the spin $C$, which from $A$'s point of view is a unitary entangling operation: e.g., a $CNOT$.

Now the state from $A$'s perspective is:

$\mid \uparrow \rangle_{A}^{A} (\mid \uparrow \uparrow \rangle + \mid \downarrow \downarrow \rangle)_{BC}^{A}$.

Okay, but what about the state from $B$'s perspective?


The whole crux of the matter is this: from its own perspective, a spin-$\frac{1}{2}$ is always $\uparrow$. In other words, "orientation" is relative: from your own perspective, you're always "up," and everyone else is tilted. So that if you had $\mid \uparrow \rangle_{A}^{A} \mid \downarrow \rangle_{B}^{A}$, then $\mid \uparrow \rangle_{B}^{B} \mid \downarrow \rangle_{A}^{B}$. $A$ and $B$ would each consider themselves to be $\uparrow$ in their own terms, the other one being down.

This is quite natural and intuitive classically. In the quantum case, however, there is a bit of a surprise with regard to how superposition and entanglement come into play.

First off, suppose we had $\mid \uparrow \rangle_{A}^{A} (\mid \uparrow \rangle + \mid \downarrow \rangle)_{B}^{A}$.

If $A$ is regarded as $\uparrow$, then $B$ is in an even superposition of $\uparrow$ and $\downarrow$: in other words, there's a 50/50 chance that $A$ and $B$ agree. But geometrically, this just means: $B$ is $\rightarrow$.

Conversely, if $B$ is regarded as $\uparrow$, then: $(\mid \uparrow \rangle - \mid \downarrow \rangle)_{A}^{B} \mid \uparrow \rangle_{B}^{B}$.

There's still a 50/50 chance they agree, but $B$ would claim it was $A$ who was in a superposition. Why the negative sign? Because geometrically, if when $A$ is $\uparrow$, $B$ is $\rightarrow$, then when $B$ is $\uparrow$, then $A$ would be $\leftarrow$. Of course, $(\mid \uparrow \rangle + \mid \downarrow \rangle)_{A}^{B} \mid \uparrow \rangle_{B}^{B}$ would have worked too, in the sense that the relative relationships are the same: the one is just the mirror image of the first.

So the first thing to say is that: superposition is in the eye of the beholder.


So we had this state from $A$'s perspective:

$\mid \uparrow \rangle_{A}^{A} (\mid \uparrow \uparrow \rangle + \mid \downarrow \downarrow \rangle)_{BC}^{A}$.

We want to transform into $B$'s perspective. We know this much: from $B$'s perspective, $B$ is $\uparrow$. Since $B$ and $C$ are in the entangled state $\mid \uparrow \uparrow \rangle + \mid \downarrow \downarrow \rangle$, then if $B$ is $\uparrow$, then $C$ must also be $\uparrow$. So far so good. But what about $A$ from $B$'s perspective? From $A$'s perspective, there's a 50/50 chance that $A$ agrees with $B$ (and $C$). So to maintain this, we'd have to say that $B$ would regard $A$ to be 50/50 $\uparrow$ or $\downarrow$. In fact, we should say: $\mid \uparrow \rangle + \mid \downarrow \rangle$.

In other words:

$\mid \uparrow \rangle_{A}^{A} (\mid \uparrow \uparrow \rangle + \mid \downarrow \downarrow \rangle)_{BC}^{A} \Rightarrow (\mid \uparrow \rangle + \mid \downarrow \rangle)_{A}^{B} \mid \uparrow \rangle_{B}^{B} \mid \uparrow \rangle_{C}^{B}$.


Following Hamette and Galley (2020), we define the following:

$ U_{g}$ is a unitary matrix which prepares $\mid g \rangle$ from the "vacuum" state $\begin{pmatrix} 1 \\ 0 \\ 0 \\ \vdots \end{pmatrix}$, in other words: $U_{g}\mid 0 \rangle = \mid g \rangle$. It can be easily calculated by forming a matrix $M$ of all zeros, except for the first column being $\mid g \rangle$. One can use the QR factorization to break down the matrix $M$ into $QR$, with $Q$ unitary and $R$ an upper triangle matrix. $Q$ is our $U_{g}$, up to sign.

In this way, for each state $\mid g \rangle$, we can associate a "group element" $U_{g}$. Naturally, there will be an inverse group element $U_{g}^{\dagger}$, and we'll write the state corresponding $U_{g}^{\dagger}$ as $\mid g^{-1} \rangle$. In other words, $\mid g^{-1} \rangle = U_{g}^{\dagger}\mid 0 \rangle$.

We can then write down a unitary transformation $P$ which implements our perspective switch. Suppose we are working with $n$ systems, each of which lives in a $d$ dimensional complex vector space ($2$, for a qubit) and we want to switch perspectives from the $0^{th}$ subsystem to the $k^{th}$ subsystem. Then:

$P_{0 \rightarrow k} = SWAP_{0 \leftrightarrow k} \sum_{i=0}^{d} I^{0} \otimes (\mid g_{i}^{-1} \rangle \langle g_{i} \mid)^{k} \otimes U_{g_{i}}^{\otimes^{n-2}}$

Here $I^{0}$ applies to the $0^{th}$ sybsystem, $(\mid g_{i}^{-1} \rangle \langle g_{i} \mid)^{k}$ applies to the $k^{th}$ subsystem, and $U_{g_{i}}^{\otimes^{n-2}}$ is applied to the rest.


For example, if we have $\mid \uparrow \rangle_{A}^{A} (\mid \uparrow \rangle + \mid \downarrow \rangle)_{B}^{A}$, and we want to switch to $B$'s perspective, first we note that by the above method, we can take:

$\mid g_{0} \rangle = \begin{pmatrix} 1 \\ 0 \end{pmatrix}$ and $\mid g_{1} \rangle = \begin{pmatrix} 0 \\ 1 \end{pmatrix}$.

$U_{g_{0}} = \begin{pmatrix} 1 & 0 \\ 0 & 1 \end{pmatrix}$ and $U_{g_{1}} = \begin{pmatrix} 0 & -1 \\ -1 & 0 \end{pmatrix}$.

$\mid g_{0}^{-1} \rangle = U_{g_{0}}^{\dagger} \mid 0 \rangle = \begin{pmatrix} 1 \\ 0 \end{pmatrix} $

$\mid g_{1}^{-1} \rangle = U_{g_{1}}^{\dagger} \mid 0 \rangle = \begin{pmatrix} 0 \\ -1 \end{pmatrix} $

$ P_{A\rightarrow B} = SWAP_{0 \leftrightarrow 1} \big{(} I \otimes \begin{pmatrix} 1 \\ 0 \end{pmatrix} \begin{pmatrix} 1 & 0 \end{pmatrix} + I \otimes \begin{pmatrix} 0 \\ -1 \end{pmatrix} \begin{pmatrix} 0 & 1 \end{pmatrix} \big{)} $

In [ ]:
import qutip as qt
import numpy as np
from examples.magic import *

################################################################################################

def U_g(g):
    m = np.zeros((g.shape[0], g.shape[0]), dtype=complex)
    m[:,0] = g.full().T[0]
    return qt.Qobj(np.linalg.qr(m)[0])

def g_inv(g):
    d = g.shape[0]
    return U_g(g).dag()*qt.basis(d,0)

def pov(state, k):
    if k == 0:
        return state
    n = len(state.dims[0])
    d = state.dims[0][0]
    O = sum([qt.tensor(*[qt.identity(d) if j == 0 else \
                         g_inv(qt.basis(d,i))*qt.basis(d,i).dag() if j == k else \
                         U_g(qt.basis(d, i)) for j in range(n)])
                                       for i in range(d)])
    return qt.tensor_swap(O*state, (0, k))

################################################################################################

def to_xyz(dm):
    return np.array([qt.expect(qt.sigmax(), dm),\
                     qt.expect(qt.sigmay(), dm),\
                     qt.expect(qt.sigmaz(), dm)])
def disp_subsystems(state):
    for i in range(len(state.dims[0])):
        p = state.ptrace(i)
        print("%d: e: %.3f | %s\n%s" % (i, qt.entropy_vn(p), to_xyz(p), p.full()))
    print()

################################################################################################

state_A = qt.tensor(qt.basis(2,0), (qt.basis(2,0)+qt.basis(2,1)).unit())
state_B = pov(state_A, 1)
disp_subsystems(state_A)
disp_subsystems(state_B)

disp_subsystems(dm) displays the density matrix for each subsystem, along with its entropy (to see if we're dealing with a pure state or not), and its $X, Y, Z$ expectation values.

In other words, as desired, we get:

$(\mid \uparrow \rangle - \mid \downarrow \rangle)_{A}^{B} \mid \uparrow \rangle_{B}^{B}$.


In the case of $\mid \uparrow \rangle_{A}^{A} (\mid \uparrow \uparrow \rangle + \mid \downarrow \downarrow \rangle)_{BC}^{A} $, we have:

$ P_{A\rightarrow B} = SWAP_{0 \leftrightarrow 1} \big{(} I \otimes \begin{pmatrix} 1 \\ 0 \end{pmatrix} \begin{pmatrix} 1 & 0 \end{pmatrix} \otimes \begin{pmatrix} 1 & 0 \\ 0 & 1 \end{pmatrix} + I \otimes \begin{pmatrix} 0 \\ -1 \end{pmatrix} \begin{pmatrix} 0 & 1 \end{pmatrix} \otimes \begin{pmatrix} 0 & -1 \\ -1 & 0 \end{pmatrix} \big{)} $

You can see that the negative signs in $\begin{pmatrix} 0 & -1 \\ -1 & 0 \end{pmatrix}$ cancel out the negative sign in $\begin{pmatrix} 0 \\ -1 \end{pmatrix} \begin{pmatrix} 0 & 1 \end{pmatrix}$, which is why we get:

$(\mid \uparrow \rangle + \mid \downarrow \rangle)_{A}^{B} \mid \uparrow \rangle_{B}^{B} \mid \uparrow \rangle_{C}^{B}$.

In [ ]:
import qutip as qt
from qutip.qip.gates import swap

import numpy as np
from examples.magic import *

################################################################################################

def U_g(g):
    m = np.zeros((g.shape[0], g.shape[0]), dtype=complex)
    m[:,0] = g.full().T[0]
    return qt.Qobj(np.linalg.qr(m)[0])

def g_inv(g):
    d = g.shape[0]
    return U_g(g).dag()*qt.basis(d,0)

def pov(state, k):
    if k == 0:
        return state
    n = len(state.dims[0])
    d = state.dims[0][0]
    O = sum([qt.tensor(*[qt.identity(d) if j == 0 else \
                         g_inv(qt.basis(d,i))*qt.basis(d,i).dag() if j == k else \
                         U_g(qt.basis(d, i)) for j in range(n)])
                                       for i in range(d)])
    return qt.tensor_swap(O*state, (0, k))

################################################################################################

def to_xyz(dm):
    return np.array([qt.expect(qt.sigmax(), dm),\
                     qt.expect(qt.sigmay(), dm),\
                     qt.expect(qt.sigmaz(), dm)])
def disp_subsystems(state):
    for i in range(len(state.dims[0])):
        p = state.ptrace(i)
        print("%d: e: %.3f | %s\n%s" % (i, qt.entropy_vn(p), to_xyz(p), p.full()))
    print()

################################################################################################

state_A = qt.tensor(qt.basis(2,0), qt.bell_state("00"))
state_B = pov(state_A, 1)
disp_subsystems(state_A)
disp_subsystems(state_B)

And so we can see that even entanglement is in the eye of the beholder. If $B$ and $C$ are entangled from $A$'s perspective, then from $B$ or $C$'s perspective, $B$ and $C$ just agree (if they're in the $\mid \uparrow \uparrow \rangle + \mid \downarrow \downarrow \rangle$ state: if they were in the antisymmetric state, they'd disagree!), whereas $A$ is regarded as being in a superposition.

One can consider more baroque cases:

In [ ]:
import qutip as qt
import numpy as np
np.set_printoptions(precision=2)
from examples.magic import *

################################################################################################

def U_g(g):
    m = np.zeros((g.shape[0], g.shape[0]), dtype=complex)
    m[:,0] = g.full().T[0]
    return qt.Qobj(np.linalg.qr(m)[0])

def g_inv(g):
    d = g.shape[0]
    return U_g(g).dag()*qt.basis(d,0)

def pov(state, k):
    if k == 0:
        return state
    n = len(state.dims[0])
    d = state.dims[0][0]
    O = sum([qt.tensor(*[qt.identity(d) if j == 0 else \
                         g_inv(qt.basis(d,i))*qt.basis(d,i).dag() if j == k else \
                         U_g(qt.basis(d, i)) for j in range(n)])
                                       for i in range(d)])
    return qt.tensor_swap(O*state, (0, k))

################################################################################################

def to_xyz(dm):
    return np.array([qt.expect(qt.sigmax(), dm),\
                     qt.expect(qt.sigmay(), dm),\
                     qt.expect(qt.sigmaz(), dm)])
def disp_subsystems(state):
    for i in range(len(state.dims[0])):
        p = state.ptrace(i)
        print("%d: e: %.3f | %s\n%s" % (i, qt.entropy_vn(p), to_xyz(p), p.full()))
    print()

################################################################################################

state = qt.tensor(qt.basis(2,0), qt.bell_state("11"), qt.rand_ket(2))
states = [pov(state, i) for i in range(len(state.dims[0]))]
for i, s in enumerate(states):
    print("%d's POV:" % i)
    disp_subsystems(s)

Here, from $0$'s perspective, $1$ and $2$ are in the antisymmetric state, and $3$ is in some superposition. From $1$'s perspective, $2$ is $\downarrow$, and $0$ and $3$ are entangled. Similarly, from $2$'s perspective, with the role of $\uparrow$ and $\downarrow$ swapped. And so on.


Returning to the Wigner's friend set-up, let's analyze it each step of the way.

Initially, we have:

$\mid \uparrow \rangle_{A}^{A} \mid \uparrow \rangle_{B}^{A} (\alpha \mid \uparrow \rangle + \beta \mid \downarrow \rangle)_{C}^{A}$

$\mid \uparrow \rangle_{A}^{B} \mid \uparrow \rangle_{B}^{B} (\alpha \mid \uparrow \rangle + \beta \mid \downarrow \rangle)_{C}^{B}$

$(\alpha \mid \uparrow \uparrow \rangle + \beta \mid \downarrow \downarrow \rangle)_{A}^{C} \mid \uparrow \rangle_{C}^{C}$

From the perspectives of both $A$ (Wigner) and $B$ (his friend), the spin is in a superposition $\alpha \mid \uparrow \rangle + \beta \mid \downarrow \rangle$. Conversely, from the spin's perspective, it's Wigner and his friend that are in an entangled superposition with the same amplitudes.

Then, the friend measures the spin. From Wigner's perspective, this is a unitary $CNOT$ applied to the friend and the spin. Recall that $CNOT \big{(} \mid \uparrow \rangle \otimes (\alpha \mid \uparrow \rangle + \beta \mid \downarrow \rangle)\big{)} = \alpha \mid \uparrow \uparrow \rangle + \beta \mid \downarrow \downarrow \rangle $, where the second qubit is the control and the first qubit is the target. After which we have:

$\mid \uparrow \rangle_{A}^{A} (\alpha \mid \uparrow \uparrow \rangle + \beta \mid \downarrow \downarrow \rangle)_{BC}^{A}$

$(\alpha \mid \uparrow \rangle + \beta \mid \downarrow \rangle)_{A}^{B} \mid \uparrow \rangle_{B}^{B} \mid \uparrow \rangle_{C}^{B} $

$(\alpha \mid \uparrow \rangle + \beta \mid \downarrow \rangle)_{A}^{C} \mid \uparrow \rangle_{B}^{C} \mid \uparrow \rangle_{C}^{C} $

We can see, however, from the perspective of the friend and the spin: the two of them simply agree, but instead regard Wigner as being in the same superposition as the original spin.

Now, departing somewhat from Hamette and Galley, we could say: well, now suppose Wigner wants to ask his friend what he got. From a third person point of view, this means: another $CNOT$ with the friend as control and Wigner as a target. But it doesn't make much sense to apply it to the state from Wigner's perspective, since he regards himself always as $\uparrow$. In other words, if we imagine choosing a subsystem whose perspective we're going take as implementing Von Neumann's cut, I'm only allowing unitaries to apply to the observed portion of the world.

But if we imagine the $CNOT$ to be applied to Wigner and his friend from the spin's perspective, nothing happens: since the friend is always in the $\uparrow$ state, applying the $CNOT$ has no effect since $CNOT$ only flips the target qubit if the control qubit is $\downarrow$, otherwise leaving the target the same. Moreover, even if the friend had been in a different state, Wigner is not in the $\mid \uparrow \rangle$ state which he (or his memory) is supposed to be in, if the $CNOT$ is to do its job correctly.

So in order to model Wigner's asking his friend what he got, we'd have to include a fourth system, who after Wiger is $CNOT$'d with his friend, would describe the world this way:

$(\alpha \mid \uparrow \uparrow \uparrow \rangle + \beta \mid \downarrow \downarrow \downarrow \rangle)_{ABC}^{D} \mid \uparrow \rangle_{D}^{D} $

So that from Wigner's perspective, we get the correct agreement between the spin, his friend, and himself.

$ \mid \uparrow \rangle_{A}^{A} \mid \uparrow \rangle_{B}^{A} \mid \uparrow \rangle_{C}^{A} (\alpha \mid \uparrow \rangle + \beta \mid \downarrow \rangle)_{D}^{A} $

Notice, however, that even as by switching perspectives, we've seemed to avoid ever having to project a state into an eigenstate of a measurement operator, it's clear we've only shunted the original amplitudes elsewhere. If $A$, $B$, and $C$ are to agree, then they have to regard $D$ as precisely being in the very same superposition as the original spin!

In other words, we've modeled how Wigner's memory, his friend's memory, and the spin state all come to be in the same state without any collapse, at the cost of: introducing an uncertainty about the orientation of the rest of world relative to them. If we're just interested in the dynamics of agreement, we can avoid collapse, if we're willing to shunt the uncertainty to the "world outside."


So far we've only worked with qubits, but check out ref_frame.py! You can set some initial state, which should be the tensor product of several spin states, all with the same dimensionality, in other words, all spin-$\frac{1}{2}$'s or all spin-$1$'s or all spin-$\frac{3}{2}$'s, etc. Visually, you'll see a grid of spheres, each sphere representing a density matrix: the first row represents the subsystems from the POV of the first subsystem; the second row represents the subsystems from the POV of the second subsystem; and so on. So that along the diagonal, the states are all in the relevant $\uparrow$ state: all the stars at Z+. One can then evolve the state (implemented as some random unitary acting on all the states beyond the cut from the POV of the first system), and watch the perspectives all evolve in time.


One question this brings up is: does this work if we have a collection of subsystems that live in different Hilbert spaces? In general, no. The whole idea depends on the relevant symmetry group being represented on each subspace: to wit, in the above, there has to be a way of rotating each of the subspaces. If we included position states, for example, we'd have to demand that they rotate in the correct way as well. And then we'd also have to take into account translations of position: each subsystem would regard itself at "position 0," and so forth.

What about a bunch of spins with different $j$ values? Well, it makes sense to take the POV of a spin-$\frac{1}{2}$ on a higher spin, since $SU(2)$ rotations can act on any spin-$j$; but not the reverse. On the other hand, one can work in the symmeterized tensor representation of spin, and take the perspective of a single symmeterized spin-$\frac{1}{2}$ which is part of a larger spin state. One interesting thing is that from such a POV, the rest of the spins may rearrange themselves into spin states with different $j$ values than you started with!

In [ ]:
import qutip as qt
import numpy as np
np.set_printoptions(precision=2)
from examples.magic import *

################################################################################################

def U_g(g):
    m = np.zeros((g.shape[0], g.shape[0]), dtype=complex)
    m[:,0] = g.full().T[0]
    return qt.Qobj(np.linalg.qr(m)[0])

def g_inv(g):
    d = g.shape[0]
    return U_g(g).dag()*qt.basis(d,0)

def pov(state, k):
    if k == 0:
        return state
    n = len(state.dims[0])
    d = state.dims[0][0]
    O = sum([qt.tensor(*[qt.identity(d) if j == 0 else \
                         g_inv(qt.basis(d,i))*qt.basis(d,i).dag() if j == k else \
                         U_g(qt.basis(d, i)) for j in range(n)])
                                       for i in range(d)])
    return qt.tensor_swap(O*state, (0, k))

################################################################################################

def to_xyz(dm):
    return np.array([qt.expect(qt.sigmax(), dm),\
                     qt.expect(qt.sigmay(), dm),\
                     qt.expect(qt.sigmaz(), dm)])
def disp_subsystems(state):
    for i in range(len(state.dims[0])):
        p = state.ptrace(i)
        print("%d: e: %.3f | %s\n%s" % (i, qt.entropy_vn(p), to_xyz(p), p.full()))
    print()

################################################################################################

state = qt.tensor(qt.basis(2,0), qt.basis(3,2), qt.basis(3,1))

js = [(d-1)/2 for d in state.dims[0]]
S = qt.tensor(*[sym_spin(int(2*j)).dag() for j in js])
sym_state = repair(S*state)

states = [pov(sym_state, i) for i in range(len(sym_state.dims[0]))]
for i, s in enumerate(states):
    print("%d's POV:" % i)
    disp_subsystems(s)

Finally, it's worth mentioning that the idea of a "quantum reference frame" is often used in a related, but different sense. For example, suppose one wants to measure a spin-$\frac{1}{2}$ but lacks a reference frame for it, a set of $X, Y, Z$ directions. One could use, for example, a large spin-$j$ particle, in a coherent state with all the stars at the same location, as a reference. Since one lacks a frame of reference, all one can measure about the two particles is their total angular momentum, not any of the components of the angular momentum. By the Clebsch-Gordan decomposition, one will get a spin-$(j+\frac{1}{2})$ state or a spin-$(j-\frac{1}{2})$ state, each with a certain probability depending on the relative orientation of the spin-$\frac{1}{2}$ and the reference spin. And so one can try to deduce the relative orientation from these probabilities, perhaps of many different spins relative to the reference. But crucially, the more one employs the same big spin-$j$ as a reference, the more it degrades as a reference, until the probabilities don't tell you anything meaningful about the relative orientation. So that one models reference frames as a resource that can be exhausted.

And finally, naturally, there is a relationship to "covariant" physics, since in principle all reference frames are systems inside the universe.