Rehash of the Climax:

On Counting in Quantum Mechanics

We begin with a lowly spin-$\frac{1}{2}$ state:

$\alpha\mid \uparrow \rangle + \gamma\mid\downarrow\rangle = \begin{pmatrix} \alpha \\ \beta \end{pmatrix}$

To second quantize, we introduce two quantum harmonic oscillators, one associated with $\mid \uparrow \rangle$ and one associated with $\mid \downarrow \rangle$. The $\uparrow$ oscillator counts the number of $\uparrow$ quanta, and the $\downarrow$ oscillator counts the number of $\downarrow$ quanta. And for simplicity, we cap the number of excitations in each oscillator to two.

This leads to a three dimensional trunctation of the quantum harmonic oscillator Hilbert space, and we have the following matrix representation for:

$a = \begin{pmatrix} 0 & 1 & 0 \\ 0 & 0 & \sqrt{2} \\ 0 & 0 & 0 \end{pmatrix}$

$a^{\dagger} = \begin{pmatrix} 0 & 0 & 0 \\ 1 & 0 & 0 \\ 0 & \sqrt{2} & 0 \\\end{pmatrix}$

We have:

$a_{\uparrow} = a \otimes I_{3} = \begin{pmatrix} 0 & 1 & 0 \\ 0 & 0 & \sqrt{2} \\ 0 & 0 & 0 \end{pmatrix} \otimes \begin{pmatrix} 1 & 0 & 0 \\ 0 & 1 & 0 \\ 0 & 0 & 1 \end{pmatrix}$

$a_{\downarrow} = I_{3} \otimes a = \begin{pmatrix} 1 & 0 & 0 \\ 0 & 1 & 0 \\ 0 & 0 & 1 \end{pmatrix} \otimes \begin{pmatrix} 0 & 1 & 0 \\ 0 & 0 & \sqrt{2} \\ 0 & 0 & 0 \end{pmatrix}$

We can consider the total number operator, which is going to count the "number of stars."

$ N = N_{\uparrow} + N_{\downarrow} = a_{\uparrow}^{\dagger}a_{\uparrow} + a_{\downarrow}^{\dagger}a_{\downarrow}$

It's matrix representation is:

$\begin{pmatrix} 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & \\ 0 & 1 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & \\ 0 & 0 & 2 & 0 & 0 & 0 & 0 & 0 & 0 & \\ 0 & 0 & 0 & 1 & 0 & 0 & 0 & 0 & 0 \\ 0 & 0 & 0 & 0 & 2 & 0 & 0 & 0 & 0 \\ 0 & 0 & 0 & 0 & 0 & 3 & 0 & 0 & 0 \\ 0 & 0 & 0 & 0 & 0 & 0 & 2 & 0 & 0 \\ 0 & 0 & 0 & 0 & 0 & 0 & 0 & 3 & 0 \\ 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 4 \end{pmatrix}$

We can list out the basis states:

$ \{{} \mid 00 \rangle, \mid 01 \rangle, \mid 02 \rangle, \mid 10 \rangle, \mid 11 \rangle, \mid 12 \rangle, \mid 20 \rangle, \mid 21 \rangle, \mid 22 \rangle \} $

We can see that the total number in each of these states is:

$\{{} 0, 1, 2, 1, 2, 3, 2, 3, 4 \}$

Which are exactly the eigenvalues of the matrix for $N$, and indeed: they are the values along the diagonal.

We can expand a state vector in terms of these basis states:

$\alpha\mid 00 \rangle + \beta\mid 01 \rangle + \gamma\mid 02 \rangle +\delta \mid 10 \rangle + \epsilon\mid 11 \rangle + \zeta\mid 12 \rangle + \eta\mid 20 \rangle + \theta \mid 21 \rangle + \iota \mid 22 \rangle$

But what if we rearranged the basis vectors in a different order:

$ \{{} \mid 00 \rangle, \mid 10 \rangle, \mid 01 \rangle, \mid 20 \rangle, \mid 11 \rangle, \mid 02 \rangle, \mid 21 \rangle, \mid 12 \rangle, \mid 22 \rangle \} $

With total numbers:

$\{{} 0, 1, 1, 2, 2, 2, 3, 3, 4 \}$

In other words, we could obviously order the basis vectors in terms of their eigenvalues from least to greatest instead of using the naive ordering that the tensor product gave us. If we wanted we could apply a matrix which does the permutation:

$\begin{pmatrix}1 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 \\ 0 & 0 & 0 & 1 & 0 & 0 & 0 & 0 & 0 \\ 0 & 1 & 0 & 0 & 0 & 0 & 0 & 0 & 0 \\ 0 & 0 & 0 & 0 & 0 & 0 & 1 & 0 & 0 \\ 0 & 0 & 0 & 0 & 1 & 0 & 0 & 0 & 0 \\ 0 & 0 & 1 & 0 & 0 & 0 & 0 & 0 & 0 \\ 0 & 0 & 0 & 0 & 0 & 0 & 0 & 1 & 0 \\ 0 & 0 & 0 & 0 & 0 & 1 & 0 & 0 & 0 \\ 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 1 \end{pmatrix} $

So we could think about our state vector like this:

$\alpha\mid 00 \rangle + \delta \mid 10 \rangle + \beta\mid 01 \rangle + \eta\mid 20 \rangle + \epsilon\mid 11 \rangle + \gamma\mid 02 \rangle + \theta \mid 21 \rangle + \zeta\mid 12 \rangle + \iota\mid 22 \rangle$

More better yet, like this:

$\alpha \oplus \begin{pmatrix} \delta \\ \beta \end{pmatrix} \oplus \begin{pmatrix} \eta \\ \epsilon \\ \gamma \end{pmatrix} \oplus \begin{pmatrix} \theta \\ \zeta \end{pmatrix} \oplus \iota $

In other words, as a concatenation of Hilbert spaces:

$ H_{1} \oplus H_{2} \oplus H_{3} \oplus H_{2} \oplus H_{1} $

Now the idea is that that each subspace with $N$ total excitations should correspond to the spin-$\frac{N}{2}$ Hilbert space. In what follows, the notation should be interpreted as $\mid n m\rangle \rightarrow \mid j, m\rangle$.

Total number: $0$

$\mid 0 0 \rangle \rightarrow \mid 0, 0 \rangle$.

Not that interesting: we just have the 1-dim spin-$0$ space.

On the other hand, the double oscillator Hilbert subspace with 1 total excitation should correspond to the spin-$\frac{1}{2}$ Hilbert space. Its basis states are: one star at the North Pole, and one star at the South Pole.

Total number: $1$

$\mid 1 0 \rangle \rightarrow \mid \frac{1}{2}, \frac{1}{2} \rangle$

$\mid 0 1 \rangle \rightarrow \mid \frac{1}{2}, -\frac{1}{2} \rangle$

Moving along, the subspace with 2 total excitations should correspond to the spin-$1$ Hilbert space. We have two stars, and its basis states are: two stars at the North Pole, one star at the North and South Poles, and two stars at the South Pole.

Total number: $2$

$\mid 2 0 \rangle \rightarrow \mid 1, 1 \rangle$

$\mid 1 1 \rangle \rightarrow \mid 1, 0 \rangle$

$\mid 0 2 \rangle \rightarrow \mid 1, -1 \rangle$

Next we have the double oscillator basis states: $\mid 21 \rangle$ and $\mid 12 \rangle$. These have 3 total excitations, and so should live in the spin-$\frac{3}{2}$ Hilbert space. But because of the finite truncation of our oscillators, we only have two out of the four basis vectors. We could add in: $\mid 30\rangle$ and $\mid 0 3\rangle$, and just set their components to zero.

Total number: $3$

$\mid 3 0 \rangle \rightarrow \mid \frac{3}{2}, \frac{3}{2} \rangle$

$\mid 2 1 \rangle \rightarrow \mid \frac{3}{2}, \frac{1}{2} \rangle$

$\mid 1 2 \rangle \rightarrow \mid \frac{3}{2}, -\frac{1}{2} \rangle$

$\mid 0 3 \rangle \rightarrow \mid \frac{3}{2}, -\frac{3}{2} \rangle$

Similarly, in terms of basis states with 4 total excitations, we just end with $\mid 22\rangle$. This should live in the spin-$2$ Hilbert space, so we have to add four extra basis vectors

Total number: $4$

$\mid 4 0 \rangle \rightarrow \mid 2, 2 \rangle$

$\mid 3 1 \rangle \rightarrow \mid 2, 1 \rangle$

$\mid 2 2 \rangle \rightarrow \mid 2, 0 \rangle$

$\mid 1 3 \rangle \rightarrow \mid 2, -1 \rangle$

$\mid 04 \rangle \rightarrow \mid 2, -2 \rangle$

We can then rewrite our state vector as:

$\alpha \oplus \begin{pmatrix} \delta \\ \beta \end{pmatrix} \oplus \begin{pmatrix} \eta \\ \epsilon \\ \gamma \end{pmatrix} \oplus \begin{pmatrix} 0 \\ \theta \\ \zeta \\0 \end{pmatrix} \oplus \begin{pmatrix} 0 \\ 0 \\ \iota \\ 0 \\ 0 \end{pmatrix} $

which lives in the Hilbert space: $S_{0} \oplus S_{\frac{1}{2}} \oplus S_{1} \oplus S_{\frac{3}{2}} \oplus S_{2}$.

So we can decompose the Hilbert space of two quantum harmonic oscillators into a tower of spin-$j$ states. At the very least, the dimensionality works out. We'll see how this is more than just a trick in what follows.

Now: we can interpret the two oscillators as providing a second quantization of the spin-$\frac{1}{2}$ Hilbert space: in other words, as a Fock space for a variable number of spin-$\frac{1}{2}$'s, with any number of such "particles" as we like, including superpositions over different number states.

Here's the crucial philosophical point: Quantum mechanics takes seriously the idea that one can only count "indistinguishable things." In other words, indistinguishability is the precondition for countability. Indeed, only indistinguishable things can be counted because they are fungible, exchangeable for each other like pebbles in a pile, $1$'s in a whole number considered as a sum.

When we combine quantum systems we use the tensor product: $H_{A} \otimes H_{B}$. Now if we tensor two states $A \otimes B$, in general, this is going to be different from $B \otimes A$. The order matters. Since, however, we're interested in countability, we want the order not to matter.

Classically speaking, the only combined states where the order doesn't matter are just $n$ copies of the same state: e.g., $\mid \uparrow \uparrow \rangle$ or $\mid \downarrow\downarrow \rangle$. To say the order doesn't matter is to say: if we permute the order of the two subspaces, we get the same result.

But quantum mechanically, we can take sums of tensor states and they also live in the tensor product Hilbert space. This is precisely what makes quantum mechanics special, irriducible to classical mechanics. So we could also consider the state: $\mid \uparrow \downarrow \rangle + \mid \downarrow \uparrow \rangle$. This is an entangled state. And if we permute the order of the two subspaces, it remains the same.

So in the quantum case, we actually have not two, but three permutation invariant states of 2 spin-$\frac{1}{2}$'s:' $\mid \uparrow \uparrow \rangle, \mid \uparrow \downarrow \rangle + \mid \downarrow \uparrow \rangle, \mid \downarrow \downarrow \rangle$. And this allows for a much richer structure: indeed, to state the matter somewhat imprecisely, with permutation symmetric states of a spinning object, classically we could only ever pick out a single point on the sphere, but quantum mechanically, we can pick out an arbitrary constellation, and so encode arbitrary quantum states in the entanglement relations between permutation symmetric particles.

If we add the permutation antisymmetric state $\mid \uparrow \downarrow \rangle - \mid \downarrow \uparrow \rangle$ into the mix, we get a complete basis for $H_{A} \otimes H_{B}$.

But let's just consider the perfectly permutation symmetric states. There are three of them, and we've claimed they correspond to the three states of a spin-$1$ particle:

$\mid \uparrow \uparrow \rangle \rightarrow \mid 1, 1 \rangle$

$ \mid \uparrow \downarrow \rangle + \mid \downarrow \uparrow \rangle \rightarrow \mid 1, 0 \rangle$

$ \mid \downarrow \downarrow \rangle \rightarrow \mid 1, -1 \rangle$

On the other hand, thinking in second quantized terms, we have a basis for the permutation invariant subspace of two spin-$\frac{1}{2}$'s, where their ordering doesn't matter, and so we can imagine them "jumbled up" in a pile, and thus be counted. In other words, these are the states with exactly two spin-$\frac{1}{2}$'s which are indistinguishable with respect to the ordering of the tensor product.

Going up the chain, we'll have:

$0 \oplus S_{\frac{1}{2}} \oplus P(S_{\frac{1}{2}}, S_{\frac{1}{2}}) \oplus P(S_{\frac{1}{2}}, S_{\frac{1}{2}}, S_{\frac{1}{2}}) \oplus \dots $

Where $P()$ denotes the permutation symmetric subspace of the full tensor product of $n$ spin-$\frac{1}{2}$ Hilbert spaces.

We could now think about our state vector

$\alpha\mid 00 \rangle + \delta \mid 10 \rangle + \beta\mid 01 \rangle + \eta\mid 20 \rangle + \epsilon\mid 11 \rangle + \gamma\mid 02 \rangle + \theta \mid 21 \rangle + \zeta\mid 12 \rangle + \iota\mid 22 \rangle$

as:

$\alpha\mid 0 \rangle \\ + \delta \mid \uparrow \rangle \\ + \beta\mid \downarrow \rangle \\ + \eta\mid \uparrow \uparrow \rangle \\ + \epsilon(\mid \uparrow \downarrow \rangle + \mid \downarrow \uparrow \mid) \\ + \gamma\mid \downarrow \downarrow \rangle \\ + \theta (\mid \uparrow \uparrow \downarrow \rangle + \mid \uparrow \downarrow \uparrow \rangle + \mid\downarrow\uparrow\uparrow\rangle) \\+ \zeta(\mid \downarrow \downarrow \uparrow \rangle + \mid \downarrow \uparrow \downarrow \rangle+ \mid\uparrow\downarrow\downarrow\rangle) \\ +\iota( \mid\uparrow\uparrow\downarrow\downarrow\rangle + \mid\downarrow\downarrow\uparrow\uparrow\rangle + \mid \uparrow \downarrow \downarrow \uparrow \rangle + \mid \downarrow \uparrow \uparrow \downarrow \rangle + \mid \uparrow \downarrow \uparrow \downarrow \rangle + \mid \downarrow \uparrow \downarrow \uparrow \rangle )$

So it's clear that the tensor space of the two oscillators can be interpreted as a tower of states with variable numbers of spin-$\frac{1}{2}$'s, indistinguishable with respect to the tensor product, each of which also corresponds to a state in the $\mid j, m\rangle$ representation.

Indeed, suppose we choose $n$ random spinors, say two of them: $\begin{pmatrix}a \\ b\end{pmatrix}$ and $ \begin{pmatrix}c \\ d \end{pmatrix} $, and we take their permutation symmetric product:

$ \frac{1}{2} \Big{(} \begin{pmatrix} a \\ b \end{pmatrix} \otimes \begin{pmatrix} c \\ d \end{pmatrix} + \begin{pmatrix} c \\ d \end{pmatrix} \otimes \begin{pmatrix} a \\ b \end{pmatrix} \Big{)} = \frac{1}{2} \Big{(} \begin{pmatrix} ac \\ ad \\ bc \\ bd \end{pmatrix} + \begin{pmatrix} ca \\ cb \\ da \\ db \end{pmatrix} \Big{)} = \begin{pmatrix} ac \\ \frac{1}{2}(ad + bc) \\ \frac{1}{2}(ad + bc) \\ bd \end{pmatrix}$.

This is a map from two unordered spinors into the permutation symmetric subspace of two spin-$\frac{1}{2}$. And we can see, just from inspecting the components, that the vector space is clearly 3 dimensional.

Indeed, every permutation symmetric state can be obtained by a choice of $n$ unordered spinors to symmeterize, up to phase. Ultimately the reason is: the fundamental theorem of algebra.

One way of seeing this is to consider the two polynomials derived from the two spinors:

$f(z) = az - b$ and $g(z) = cz - d$.

Let's multiply them together:

$(f \odot g)(z) = (az - b)(cz - d) = acz^{2} - adz - bcz + bd = acz^{2} - (ad + bc)z + bd$.

This polynomial has two roots at $\frac{b}{a}$ and $\frac{d}{c}$. This is why the bijection is between unordered spinors up to phase, since we only remember the ratios between the components. These ratios, considered as roots of a polynomial, by the fundamental theorem of algebra, uniquely pick out an ordered sequence of coefficients. Specifically, these polynomials lie in a three dimensional vector space, which can be bijected onto the four dimensional vector space of the tensor product of two spin-$\frac{1}{2}$, and which will lie in the permutation symmetric subspace. Indeed, to take the permutation symmetric tensor product is as much to: multiply two polynomials in the same variable and follow the laws of algebra.

It's worth mentioning an interesting fact here about "symmetric polynomials," involving ring theory. "Symmetric polynomials" are polynomials such that $f(a, b, c) = f(c, b, a) = f(b, a, c) = f(c, a, b) = f(a, c, b) = f(b, c, a) $. In other words, interchanging the roles of the unknowns has no effect on such a function: it's symmetric with regard to its arguments. (We could think of $f(a, b, c)$ like a permutation symmetric tensor product.)

Okay, suppose we had a single variable polynomial with three roots $\alpha = \{a, b, c \}$:

$f(z) = (z-a)(z-b)(z-c) = z^{3} - (a + b + c)z^{2} + (ab + ac + bc)z - abc = c_{3}z^{3} + c_{2}z^{2} + c_{1}z + c_{0}$

Notice that:

$c_{3} = 1 \\ -c_{2} = (a + b + c) \\ c_{1} = ab + ac + bc \\ -c_{0} = abc$

In other words, if $n_{r}$ is the number of roots:

$(-1)^{n_{r}-n} c_{n} = \sum \prod_{n_{r}-n} \alpha$

What this means is: aside from the powers of $-1$, the coefficients of a polynomial are given by the sums of the roots multiplied none at a time, one at a time, two at a time, three at a time. These are Vieta's formulas. (By the way, recall we have $n_{r}$ roots, and so for each polynomial there will be $\begin{pmatrix} n_{r} \\ n_{r}-n\end{pmatrix}$ terms in each equation. Clearly the binomial coefficient in Majorana's formula essentially normalizes each coefficient proportional to the number of terms that contribute to it.)

Now consider these coefficients $c_{n}$ as themselves polynomials with the roots as unknowns. Obviously, they will be symmetric polynomials. (And let's ignore the $-1$'s for now: you'll see they are immaterial to our point here.)

$c_{3}(a, b, c) = 1 \\ c_{2}(a, b, c) = a + b + c \\ c_{1}(a, b, c) = ab + ac + bc \\ c_{0}(a, b, c) = abc$

It's also clear that sums of these symmetric polynomials will themselves be symmetric, and so linear combinations of them will be so as well. What isn't necessarily as obvious is that these symmetric polynomials are "elementary symmetric polynomials." What this means is that any symmetric polynomial in three unknowns can be written as a polynomial expression in these elementary symmetric polynomials (excluding $1$). This involves ring theory.

Okay, back to the main theme.

So: we can specify the symmeterized product in terms of location of the two points on the complex plane (or $\infty$), which are formed from the ratios of the spinors. Moreover, these ratios can be interpreted as roots of a polynomial, and these polynomials form a three dimensional vector space. And so, additionally, we can interpret this space as the 3D space of a spin-$1$ particle. We recall our Majorana formula, where $a_{i}$ is the $i^{th}$ component of the $\mid j, m\rangle$ vector, and the normalization of terms basically comes from Vieta's formulas relating the roots of a polynomial to its coefficients:

$p(z) = \sum_{m=-j}^{m=j} (-1)^{j+m} \sqrt{\frac{(2j)!}{(j-m)!(j+m)!}} a_{j+m} z^{j-m}$.

Using it in reverse, we get: $\begin{pmatrix} \frac{ac}{ (-1)^{0}\sqrt{\begin{pmatrix} 2 \\ 0 \end{pmatrix}}} \\ \frac{-(ad + bc)}{(-1)^{1}\sqrt{\begin{pmatrix} 2 \\ 1 \end{pmatrix}}} \\ \frac{bd}{(-1)^{2}\sqrt{\begin{pmatrix} 2 \\ 2 \end{pmatrix}}} \end{pmatrix}$ or $\begin{pmatrix} ac \\ \frac{1}{\sqrt{2}}(ad + bc) \\ bd \end{pmatrix}$. This is a spin-$1$ state.

So clearly, we can interpret a permutation symmetric state of $n$ spin-$\frac{1}{2}$ particles as a constellation of $n$ points on the Riemann sphere, which pick out, up to phase, a spin-$\frac{n}{2}$ state.

Why the sphere? Recall that in order to deal with a spinor like $\begin{pmatrix} 0 \\ 1 \end{pmatrix}$, which has no roots as a polynomial (since $f(z) = -1 \neq 0$), we have to add one extra point to the complex plane, a point at infinity, which turns the plane into the sphere. We could have alternatively begun with homogenous polynomials$f(w,z) = az - bw$ and $g(w, z) = cz - dw$, whose roots coincide with the single variable polynomial up to a choice of w (e.g., $w=1$), but which allow for a root at $h(0, 1)$ if, for example, $h(w, z)=w$. This leads directly to the second quantized picture, interpreting $z$ and $w$ as the creation operators of the two harmonic oscillators.

To summarize: suppose we had a constellation of $n$ points on the sphere, and we wanted to rotate $\theta$ radians around the $x$ axis. We could:

  • Draw the points on an actual sphere, and do the rotation ourselves.
  • We could act on $(x, y, z)$ coordinates with a $3$ x $3$ real $SO(3)$ matrix. This would be the obvious thing to do.
  • We could stereographically project the points on the sphere to the complex plane $\mathbb{C} + \infty$ and use a certain Mobius transformation: $f(z) = \frac{az+b}{cz+d}$, remembering the rules about dealing with $\infty$.
  • We could create spinors $\begin{pmatrix} 1 \\ z\end{pmatrix}$ or $\begin{pmatrix} 0 \\ 1 \end{pmatrix}$if $z=\infty$ such that the ratio between the components is $z$ the streographic projection of $(x, y, z)$. We could act on these with $U = e^{-iX_{\frac{1}{2}}\theta}$ , where $X_{\frac{1}{2}}$ corresponds to the spin-$\frac{1}{2}$ representation: the Pauli matrix: $\begin{pmatrix} 0 & \frac{1}{2}\\\frac{1}{2} & 0 \end{pmatrix}$. This $U$ is just $U = \begin{pmatrix} a & b \\ c & d \end{pmatrix}$, the same $a, b, c, d$ in the expression for the Mobius transformation. In other words, we could do $U\mid \phi_{0} \rangle$, $U\mid \phi_{1} \rangle$,$U\mid \phi_{2} \rangle$, in other words transform all the spinors by $U$. If we normalize these, we have $n$ spin-$\frac{1}{2}$ quantum states.
  • We could form the polynomial$f(z) = (z-\alpha)(z-\beta)(z-\gamma)$ whose roots are $\alpha, \beta, \gamma$, which correspond to the ratios between the components of each of the three spinors, and are the stereographic projections of the ($x, y, z$) points. Normalizing via the Majorana equation, the coefficients can be interpreted as the components of a state in the $\mid j, m \rangle$ representation, where $j$ in this case is $\frac{3}{2}$. We could then form: $V = e^{-iX_{\frac{3}{2}}\theta}$, where $X_{\frac{3}{2}}$ corresponds to the spin-$\frac{3}{2}$ Pauli: $\begin{pmatrix} 0 & \frac{\sqrt{3}}{2} & 0 & 0 \\ \frac{\sqrt{3}}{2} & 0 & 1 & 0 \\ 0 & 1 & 0 & \frac{\sqrt{3}}{2} \\ 0 & 0 & \frac{\sqrt{3}}{2} & 0\end{pmatrix} $.
  • We could apply $ \Big{(} (U\otimes I_{2} \otimes I_{2}) + (I_{2} \otimes U \otimes I_{2}) + (I_{2} \otimes I_{2} \otimes U)(\mid \phi_{0} \otimes \phi_{1} \otimes \phi_{2} \rangle + \\ \mid \phi_{0} \otimes \phi_{2} \otimes \phi_{1}\rangle + \mid \phi_{1} \otimes \phi_{0} \otimes \phi_{2}\rangle + \mid\phi_{1} \otimes \phi_{2} \otimes \phi_{0}\rangle + \mid\phi_{2} \otimes \phi_{0} \otimes \phi_{1}\rangle + \mid\phi_{2} \otimes \phi_{1} \otimes \phi_{0}\rangle)$, appropriately normalized.
    • In other words, apply: $(U_{0} + U_{1} + U_{2})P(\phi_{0}, \phi_{1}, \phi_{2})$. We could take the permutation tensor product of the spinors and rotate each of the permutation symmetric spin-$\frac{1}{2}$ tensor pieces equally under $U$.
  • Finally, we could upgrade $U$ to $W = \begin{pmatrix} a_{0}^{\dagger} & a_{1}^{\dagger} \end{pmatrix} \begin{pmatrix} a & b \\ c & d \end{pmatrix} \begin{pmatrix} a_{0} \\ a_{1}\end{pmatrix}$, which acts on the double quantum harmonic oscillator space, specifically the state obtained by: reinterpreting the spin-$\frac{3}{2}$ state $\alpha\mid \frac{3}{2}, \frac{3}{2} \rangle + \beta \mid \frac{3}{2}, \frac{1}{2} \rangle + \gamma\mid \frac{3}{2}, -\frac{1}{2} \rangle + \delta \mid \frac{3}{2}, -\frac{3}{2} \rangle$ state as $\alpha\mid 30 \rangle + \beta \mid 21 \rangle + \gamma\mid 12 \rangle + \delta\mid 03 \rangle$.
    • Indeed, if we second quantize the $X_{\frac{1}{2}}$ operator, then the resulting second quantized matrix, when properly permuted, is just a block matrix with $X_{0}, X_{\frac{1}{2}}, X_{1}, \dots$, the Pauli matrices for each $j$, along the diagonal. In other words, an $X$ rotation of the whole "field" of a variable number of spin-$\frac{1}{2}$ particles leads to an $X$ rotation individually on each of the spin-$j$ subspaces. This space can also be interpreted via the position basis as the polarization plane of a light wave.

Now let's do a simple example not involving spin, just for comparison. Suppose we want a second quantize a scalar particle, one which has only a position state, and in fact, which can only be in $3$ possible locations: $\mid I \rangle, \mid II \rangle, \mid III \rangle$. So we introduce three quantum harmonic oscillators, with annihilation operators $a_{I}, a_{II}, a_{III}$, each acting on separate pieces of the tensor product of the three oscillators. Let's say we cap each one at $d$ excitations. We could list out the basis vectors in terms of the total number $n$ of excitations, and associate them with states in the permutation symmetric tensor product of $n$ position states. In this way, we'll form a map from the tensor product of three oscillator Hilbert spaces $O_{d}$ to a tower of permutation symmetric products of $H_{3}$, the position Hilbert space.

$ O_{d} \otimes O_{d} \otimes O_{d} \rightarrow 0 \oplus H_{3} \oplus P(H_{3}, H_{3}) \oplus P(H_{3}, H_{3}, H_{3}) \oplus \dots$

$\begin{matrix}\mid 000 \rangle & \mid 0\rangle\\ \\ \mid 100 \rangle & \mid I \rangle\\ \mid 010\rangle & \mid II \rangle \\ \mid 001 \rangle & \mid III \rangle \\ \\ \mid 2 0 0 \rangle & \mid I, I \rangle \\ \mid 110\rangle & \mid I, II \rangle + \mid II, I \rangle \\\mid 020 & \mid II, II \rangle \\ \mid 101 \rangle & \mid I, III \rangle + \mid III, I \rangle \\\mid 011 \rangle & \mid II, III \rangle + \mid III, II \rangle \\\mid002\rangle & \mid III, III \rangle \\ \\\mid 300 \rangle & \mid I, I, I \rangle \\ \mid 210 \rangle & \mid I, I, II \rangle + \mid I, II, I \rangle + \mid II, I, I \rangle \\ \mid 120 \rangle & \mid I, II, II \rangle + \mid II, I, II \rangle + \mid II, II, I \rangle \\ \mid 102\rangle & \mid I, III, III \rangle + \mid III, I, III \rangle + \mid III, III, I \rangle \\ \mid 111 \rangle & \mid I, II, III \rangle + \mid II, I, III \rangle + \mid I, III, II \rangle + \mid II, III, I \rangle + \mid III, I, II + \mid III, II, I \rangle \\ \mid 201\rangle & \mid I, I, III \rangle + \mid I, III, I \rangle + \mid III, I, I \rangle \\ \mid 021 \rangle & \mid II, II, III \rangle + \mid II III II \rangle + \mid III, II, II \rangle \\ \mid 012\rangle & \mid II, III, III \rangle + \mid III, II, III \rangle + \mid III, III, II \rangle \\ \mid 003\rangle & \mid III, III, III \rangle \\ \vdots & \vdots\end{matrix}$

And now a word on the significance of "field quantization." If you think about it, you can't measure these tensored position states directly: since in what number subspace should you act? One thing you can do, however, is measure the number of particles at a given location.

Suppose you measure $1$ particle at $I$.

You've collapsed into the subspace of: $\mid 1 0 0 \rangle, \mid 11 0 \rangle, \mid 101 \rangle, \mid 120 \rangle, \mid 102 \rangle, \mid 111 \rangle, \dots$, a superposition of states of different numbers of particles consistent with you measuring $1$ particle at $I$.

Now you might ask: before we had a three way correspondence between the total occupation number basis of two oscillators, permutation symmetric spin-$\frac{1}{2}$ basis states, and the $\mid j, m \rangle$ basis vectors of an $SU(2)$ representation.

If we have three oscillators corresponding to permutation symmetric states of $3D$ complex vectors, maybe we should be able to obtain representations of $SU(3)$ with them. For example, we could second quantize the $8$ Gell-Man matrices (the equivalent of the $3$ Pauli's for $SU(2)$), shamelessly stolen from wikipedia:

$\lambda_1 = \begin{pmatrix} 0 & 1 & 0 \\ 1 & 0 & 0 \\ 0 & 0 & 0 \end{pmatrix} \lambda_2 = \begin{pmatrix} 0 & -i & 0 \\ i & 0 & 0 \\ 0 & 0 & 0 \end{pmatrix} \lambda_3 = \begin{pmatrix} 1 & 0 & 0 \\ 0 & -1 & 0 \\ 0 & 0 & 0 \end{pmatrix} \lambda_4 = \begin{pmatrix} 0 & 0 & 1 \\ 0 & 0 & 0 \\ 1 & 0 & 0 \end{pmatrix} \\ \lambda_5 = \begin{pmatrix} 0 & 0 & -i \\ 0 & 0 & 0 \\ i & 0 & 0 \end{pmatrix} \lambda_6 = \begin{pmatrix} 0 & 0 & 0 \\ 0 & 0 & 1 \\ 0 & 1 & 0 \end{pmatrix} \lambda_7 = \begin{pmatrix} 0 & 0 & 0 \\ 0 & 0 & -i \\ 0 & i & 0 \end{pmatrix} \lambda_8 = \frac{1}{\sqrt{3}} \begin{pmatrix} 1 & 0 & 0 \\ 0 & 1 & 0 \\ 0 & 0 & -2 \end{pmatrix}$

Does this work? The answer is yes, but we actually need six oscillators to represent both quarks and antiquarks, since $SU(3)$ is rank-2. Then we can play around with quarks and gluons to our heart's content. And in general for $SU(N)$, the group will be rank-$(n-1)$, and we'll need $(n-1)$ copies of $n$ oscillators. Then via second quantization, you'll obtain all the irriducible representations of these groups.

E.g., following this nice paper, for $SU(3)$ we have two sets of 3 oscillators $\{a_{\alpha}^{\dagger} \}$ and $\{b_{i}^{\dagger\alpha} \}$ for $\alpha = 1,2,3$. We can upgrade the Gellman matrices $\lambda^{a}$ for $a=1,2,3,4,5,6,7,8$ and $\lambda^{T}$ being the transpose:

$Q_{a} = a^{\dagger} \frac{\lambda^{a}}{2}a - b^{\dagger}\frac{\lambda^{a^{T}}}{2} b$

We've second quantized the basic $3, 3^{*}$ representation. The crucial point is that with $SU(2)$, we classified different representations by $j$ values, which were eigenvalues of the $\sigma^{2}$ operator. But with $SU(3)$, we require a $p$ and $q$, two conserved quantities, to pick out a representation. Whereas before the eigenvalues of the total occupation number operator of the double oscillator give us the $j$ values (basically), now with $SU(3)$ we have two "Casimir's," labeled by the eigenvalues of the two total number operators $N_{a}, N_{b}$. But just as before, we can pick apart the components of the oscillator basis states intos irriducible representations of $SU(3)$, as well as associating them to permutation symmetric states of the fundamental representation

Finally, it's worth recalling what we've been doing implicitly by working with polynomials: we can make coherent states, and so express states as functions/evaluations of the inner product of a variable coherent state and an arbitrary state: $f(z) = \langle \overline{z} \mid \psi \rangle$.

Let's remind ourselves a little of the magic of coherent states.

For the oscillator, we have: $\mid z \rangle = e^{-\frac{|z|^{2}}{2}} \sum_{n=0}^{\infty} \frac{z^{n}}{\sqrt{n!}}\mid n \rangle$.

So that we can write: $\psi(z) = \langle \overline{z} \mid \psi \rangle = e^{-\frac{|z|^{2}}{2}} \sum_{n=0}^{\infty} \frac{z^{n}}{\sqrt{n!}}\langle n \mid \psi \rangle $. Ignoring the initial exponential, which we'll absorb into the measure on the inner product, this is a polynomial in $z$ where powers of $z$ are weighted by a coefficient proportional to the amplitude for $\mid \psi \rangle$ to be in the $\mid n \rangle$ number state. The $\mid z \rangle$'s form an overcomplete basis of the Hilbert space of the oscillator, and the complex plane can be interpreted as the position/momentum plane, the phase space of the classical oscillator.

If we represent two states as polynomials, we can recover the inner product with an integral over $C$: $\int_{\mathbb{C}} f(z)^{*}g(z)e^{-|z|^2} dz$.

Finally, we note that $a\mid z \rangle = z \mid z \rangle$: the $z$'s are eigenstates of the annihilation operator. On polynomials, the annihilation operator is $\frac{d}{dz}$, the creation operator being multiplication by the variable $z$.

Now, let's think about the spin coherent states, also some $\mid z \rangle$, but where $z$ is in $C + \infty$.

We know as a polynomial we should have $f(w) = (w-z)^{n}$, in other words: $n$ stars at the point $z$. Notice that the derivatives are $f'(w) = n(w-z)^{n-1}$, $f^{\prime\prime}(w) = n(n-1)(w-z)^{n-2}$, etc. The roots stay the same, just decrease in multiplicity.

If we have a polynomial $f(z) = \langle \overline{z} \mid \psi \rangle$ we can interpret the spin lowering operator as $\frac{d}{dz}$. Clearly, acting on a spin coherent state, it removes a root, but leaves the rest the same. In this sense, a spin coherent state is an eigenstate of $\frac{d}{dz}$, now interpreted as the spin lowering operator, even though the degree of the polynomial may change.

If we multiply out $f(z) = (z-w)^{3}$ for example we get: $ z^{3} - 3wz^{2} + 3w^{2}z - w^{3}$, which interpreted as a two variable polynomial $f(w,z)$ is homogenous with degree three. The point is that the variable corresponding to the coherent state's point on the sphere is treated symmetrically to the variable that corresponds to the actual unknown. When we take $f(z) = \langle \overline{z} \mid \psi \rangle $, we end up reproducing our polynomial from before, where the unknown has become the parameter for the coherent state: they've swapped roles.

Finally, I note that we can take the inner product on the single variable polynomials, extracting a measure from the fact that we want our coherent states normalized.

$\langle f \mid g \rangle= \int_{\mathbb{C}} f(z)^{*}g(z)\frac{1}{(1+|z|^{2})^{2j + 1}} dz$.

Considering our adventures in second quantization, now we can consider spin coherent states in the following light. Pick a spinor representing a point on the sphere as some $\begin{pmatrix} \alpha \\ \beta \end{pmatrix}$ . It's corresponding creation operator is: $\alpha a_{\uparrow}^{\dagger} + \beta a_{\downarrow}^{\dagger}$. We could form: $(\alpha a_{\uparrow}^{\dagger} + \beta a_{\downarrow}^{\dagger})^{n}$ which would create $n$ stars at the given point, in other words a spin coherent state with $j=\frac{n}{2}$.

$\mid z \rangle = e^{\alpha a_{\uparrow}^{\dagger} + \beta a_{\downarrow}^{\dagger}} \mid 00 \rangle = \sum_{n=0}^{\infty} \frac{(\alpha a_{\uparrow}^{\dagger} + \beta a_{\downarrow}^{\dagger})^{n}}{n!}\mid 0,0 \rangle = \sum_{n=0}^{\infty}\mid z \rangle_{n}$, where $\mid z \rangle_{n}$ is a coherent state with $n$ stars at $z$, in other words, a $j=n-1$ state. So we get a superposition of coherent states with $0, 1, 2, 3, 4, \dots$ stars at the location picked out by $z$.

Given $\sum_{n=0}^{\infty} \frac{(\alpha a_{\uparrow}^{\dagger} + \beta a_{\downarrow}^{\dagger})^{n}}{n!}\mid 0,0 \rangle = \sum_{n=0}^{\infty}\mid z \rangle_{n}$, we can generalize to the two variable spin coherent polynomial $f(\alpha, \beta) = \langle 0,0 \mid\sum_{n=0}^{\infty} \frac{(\alpha a_{\uparrow} + \beta a_{\downarrow})^{n}}{n!} \mid \psi \rangle$. This is just our homogenous polynomial representation from before.

The point is: we can play this same trick with however many oscillators we have and form $SU(N)$ coherent states, which turn states into functions, whose zeros we can examine as constellations, ever more broadly defined.

I find this totally fascinating. We can represent states as functions, which take as input a state in the basic representation, and which can be characterized by their $0$'s, in other words, by the states whose amplitude on the given coherent state is $0$. And we interpret these basic representations as something like classical phase spaces (as we do in the case of the oscillator (with the position/momentum plane) and the spin (the angular momentum sphere)). At the same time, we can interpret the resulting second quantized theory as a superposition of a whole tower of different representations with different numbers of particles: and what is counted is precisely the number of $0$'s in these representations, in other words: the number of forbidden classical states. A set of constellations of forbidden states is equivalent to all the magic of the permutation symmetric tensor product by the laws of algebra.

Indeed, you could say: what is countable in quantum mechanics is the number of classical states forbidden together. This picture is dual to: for particles to be countable in quantum mechanics, they must be indistinguishable, unordered with respect to the tensor product. This is philosophically satisfying. If the particles weren't indistinguishable, we couldn't justifiably model them like: unordered pebbles in a pile, indeed, with: numbers. Again, classically, when we combine systems, the only way the systems can be unordered is for them to be in exactly the same state. But because of the possibility of entangled superpositions in the quantum mechanical tensor product, the countable states are much more interesting--for example $\mid \uparrow \downarrow \rangle + \mid \downarrow \uparrow \rangle$, which is permutation symmetric--and allow for a much richer structure. From this the whole theory of second quantization follows. The vastness of quantum mechanics is practically reduced down to the science of what can be counted simultaneously, which provides context for a pile of pebbles.

To close: you might wonder if we can continue the construction. Recall in category theory, a category consists in "objects" and "morphisms," and a functor maps one category to another one, objects to objects, morphisms to morphisms. When we second quantize, we map single particle states to states in the Fock space, and single particle operators to operators on the Fock space. Following John Baez, we could imagine this ladder:

Zeroth quantization is hit a set with a functor, which takes each element of the set to a basis vector in some Hilbert space, where the dimensionality of the space is the size of the set. We start with the empty set, and get the 0-dimensional Hilbert space.

We define a "second quantization functor," which takes a Hilbert space to the Fock space built atop it: in other words, the tensor product of $d$ harmonic oscillators, where $d$ is the dimensionality of the original Hilbert space.

First quantization: we hit the 0-dim Hilbert space with the "second quantization functor" and get: $C$, the complex numbers, since we have only one basis vector $\mid \rangle$, with an amplitude: we live in the 1-dim Hilbert space.

Second quantization: hit the 1-dim Hilbert space with the "second quantization functor" and get the quantum harmonic oscillator, which counts an arbitrary finite collection of indistinguishable quanta: some number of $\mid \rangle$'s: $\mid 0 \rangle, \mid 1 \rangle, \mid 2 \rangle, \dots$.

Third quantization: introduce a harmonic oscillator for each state of a harmonic oscillator. Each state consists of a finite multiset like: $\mid \mid 1,1,1\rangle, \mid 1 \rangle, \mid 1, 1 \rangle\rangle = \mid 3, 1, 2\rangle$, where the order doesn't matter. In other words, we can interpret this as an unordered "pile" of a variable number of harmonic oscillators. Now, for example, we could be in a superposition of representations of $SU(2)$ and $SU(3)$, etc.

Fascinatingly, we can think of this as the Hilbert space of the right-moving modes of a quantum string--you know, in string theory. The idea is you can interpret these states as states of a massless scalar field theory on a cylindrical spacetime, where the momentum of each particle corresponds to the the different number states of the oscillators: e.g., $\mid 3, 1, 2\rangle$ has 1 particle with momentum 3, 1 particle with momentum 1, and 1 particle with momentum 2. And if we simply upgrade the number operator from the previous level, we get the right Hamiltonian for the massless scalar field on the cylindrical spacetime. If we tensor another copy of this, to get left-moving modes, we have the complete theory, which can be interpreted this as a string evolving in 1-dim spacetime. It's quite clear that in an almost trivial sense, string theory works: we have a whole pile of oscillators to play with, and we can use them to represent tons of symmetry groups using our bag of tricks.

Fourth quantization: a multiset of multisets of oscillators, an arbitrary collection of indistinguishable strings.

But why stop there? (Indeed, count: $1, 2, 3, \dots$ and there's no reason to ever stop.)

A more interesting question to ask is: given that indistinguishability is so basic to the theory, what story can we tell about how distinguishability emerges? Indeed, what's interesting is that: even if in field theory, the particles are indistinguishable, by being able to measure the number of particles $here$, we are able to make a distinction.


Calculations

First, let's generate $n$ random points on the sphere. We generate $n$ random 3 dimensional real vectors $(x, y, z)$, and normalize the length of each vector to be $1$, so that $x^{2} + y^{2} + z^{2} = 1$.

In [ ]:
import numpy as np
import vpython as vp
import qutip as qt
import scipy

show = True
n = 3
theta = np.pi/2
pts = [np.random.randn(3) for i in range(n)]
pts = [pt/np.linalg.norm(pt) for pt in pts]

if show:
    scene = vp.canvas(background=vp.color.white)
    vsphere = vp.sphere(color=vp.color.blue, opacity=0.4)
    vstars = [vp.sphere(pos=vp.vector(*pts[i]),\
                        radius=0.2, emissive=True)\
                  for i in range(n)]

print(np.array(pts))

We could perform a ninety degree rotation around the $x$ axis using an $SO(3)$ matrix. We can construct this matrix as an exponential of the generator $L_{X}$: $e^{\theta L_{X}}$, where $\theta = \frac{\pi}{2}$.

In [ ]:
Lx = np.array([[0,0,0],\
               [0,0,-1],\
               [0,1,0]])
Ly = np.array([[0,0,1],\
               [0,0,0],\
               [-1,0,0]])
Lz = np.array([[0,-1,0],\
               [1,0,0],\
               [0,0,0]])

if show:
    scene = vp.canvas(background=vp.color.white)
    vsphere = vp.sphere(color=vp.color.blue, opacity=0.4)
    vstars = [vp.sphere(pos=vp.vector(*pts[i]),\
                        make_trail=True, radius=0.2, emissive=True)\
                  for i in range(n)]

    for dt in np.linspace(0, theta, 5000):
        R = scipy.linalg.expm(dt*Lx)
        for i, vstar in enumerate(vstars):
            vstar.pos = vp.vector(*np.dot(R, pts[i]))
        vp.rate(1000)

R = scipy.linalg.expm(theta*Lx)
rotated_pts = [np.dot(R, pts[i]) for i in range(n)]
print(np.array(rotated_pts))

Alternatively, we could generate an $SU(2)$ matrix via $e^{i\frac{\theta}{2}X}$, where $X$ is the Pauli matrix $\begin{pmatrix} 0 & 1 \\ 1 & 0 \end{pmatrix}$, and interpret its components $\begin{pmatrix} a & b \\ c & d \end{pmatrix}$ as a Mobius transformation: $f(z) = \frac{az+b}{cz+d}$, with some extra rules for handling infinities (see code). To perform our rotation, we could stereographically project our $(x, y, z)$ points onto the complex plane (or $\infty$), and apply the Mobius transformation, and then stereographically project back to the sphere.

In [ ]:
def xyz_c(xyz, pole="south"):
    x, y, z = xyz
    if (pole=="south"):
        if np.isclose(z,-1):
            return float("Inf")
        else:
            return x/(1+z) + 1j*y/(1+z)
    elif (pole=="north"):
        if np.isclose(z,1):
            return float("Inf")
        else:
            return x/(1-z) + 1j*y/(1-z)

def c_xyz(c, pole="south"):
    if(pole == "south"):
        if c == float("Inf"):
            return np.array([0,0,-1])
        else:
            x, y = c.real, c.imag
            return np.array([2*x/(1 + x**2 + y**2),\
                             2*y/(1 + x**2 + y**2),\
                   (1-x**2-y**2)/(1 + x**2 + y**2)])
    elif (pole == "north"):
        if c == float("Inf"):
            return np.array([0,0,1])
        else:
            x, y = c.real, c.imag
            return np.array([2*x/(1 + x**2 + y**2),\
                             2*y/(1 + x**2 + y**2),\
                   (-1+x**2+y**2)/(1 + x**2 + y**2)])
    
def make_mobius(U):
    a = U.full()[0][0]
    b = U.full()[0][1]
    c = U.full()[1][0]
    d = U.full()[1][1]
    def mobius(z):
        if c != 0:
            if z == -d/c:
                return float("Inf")
            if z == float("Inf"):
                return a/c
        else:
            if z == float("Inf"):
                return float("Inf")
        return (a*z + b)/(c*z + d)
    return mobius 

if show:
    scene = vp.canvas(background=vp.color.white)
    vsphere = vp.sphere(color=vp.color.blue, opacity=0.4)
    vstars = [vp.sphere(pos=vp.vector(*pts[i]),\
                        make_trail=True, radius=0.2, emissive=True)\
                  for i in range(n)]
    complex_pts = [xyz_c(pt) for pt in pts]
    for dt in np.linspace(0, theta, 5000):
        mobius = make_mobius((-1j*qt.jmat(1/2, 'x')*dt).expm())
        for i, vstar in enumerate(vstars):
            vstar.pos = vp.vector(*c_xyz(mobius(complex_pts[i])))
        vp.rate(1000)

complex_pts = [xyz_c(pt) for pt in pts]
U = (-1j*qt.jmat(1/2, 'x')*theta).expm()
mobius = make_mobius(U)
complex_rotated_pts = [c_xyz(mobius(c)) for c in complex_pts]
print(np.array(complex_rotated_pts))
print(np.array(rotated_pts))

Or we could act on spinors with the $SU(2)$ matrix directly.

In [ ]:
def spinor_c(spinor):
    a, b = spinor.full().T[0]
    if np.isclose(a,0):
        return float('Inf')
    else:
        return b/a

def c_spinor(c):
    if c == float('Inf'):
        return qt.Qobj(np.array([0,1]))
    else:
        return qt.Qobj(np.array([1, c])).unit()

def spinor_xyz(spinor):
    return np.array([qt.expect(qt.sigmax(), spinor),\
                     qt.expect(qt.sigmay(), spinor),\
                     qt.expect(qt.sigmaz(), spinor)])

if show:
    scene = vp.canvas(background=vp.color.white)
    vsphere = vp.sphere(color=vp.color.blue, opacity=0.4)
    vstars = [vp.sphere(pos=vp.vector(*pts[i]),\
                        make_trail=True, radius=0.2, emissive=True)\
                  for i in range(n)]
    
    spinors = [c_spinor(cpt) for cpt in complex_pts]
    for dt in np.linspace(0, theta, 2500):
        U = (-1j*qt.jmat(1/2, 'x')*dt).expm()
        rotated_spinors = [U*spinor for spinor in spinors]
        spinor_rotated_pts = [spinor_xyz(spinor) for spinor in rotated_spinors]
        for i, vstar in enumerate(vstars):
            vstar.pos = vp.vector(*spinor_rotated_pts[i])
        vp.rate(1000)

spinors = [c_spinor(cpt) for cpt in complex_pts]
U = (-1j*qt.jmat(1/2, 'x')*theta).expm()
rotated_spinors = [U*spinor for spinor in spinors]
spinor_rotated_pts = [spinor_xyz(spinor) for spinor in rotated_spinors]
print(np.array(spinor_rotated_pts))
print(np.array(rotated_pts))

Or we could treat our complex numbers as the roots of a polynomial, and use the Majorana equation to obtain a $\mid j, m\rangle$ state on which a spin-$j$ representation of the Pauli matrices acts. Note the convention by which we treat roots at $\infty$. Also notice how since the roots are unordered, we have some glitches in the trails!

In [ ]:
import itertools
import math

def roots_poly(roots):
    zeros = roots.count(0j)
    if zeros == len(roots):
        return [1j] + [0j]*len(roots)
    poles = roots.count(float("Inf"))
    roots = [root for root in roots if root != float('Inf')]
    if len(roots) == 0:
        return [0j]*poles + [1j]
    def roots_coeffs(roots):
        n = len(roots)
        coeffs = np.array([((-1)**(-i))*sum([np.prod(term) for term in itertools.combinations(roots, i)]) for i in range(0, len(roots)+1)])
        return coeffs/coeffs[0]
    return [0j]*poles + roots_coeffs(roots).tolist()

def poly_roots(poly):
    head_zeros = 0
    for c in poly:
        if c == 0:
            head_zeros += 1 
        else:
            break
    return [float("Inf")]*head_zeros + [complex(root) for root in np.roots(poly)]

def poly_spin(poly):
    j = (len(poly)-1)/2.
    spin = []
    for m in np.arange(-j, j+1):
        i = int(m+j)
        spin.append(poly[i]/\
            (((-1)**(i))*math.sqrt(math.factorial(2*j)/\
                        (math.factorial(j-m)*math.factorial(j+m)))))
    aspin = np.array(spin)
    return qt.Qobj(aspin/np.linalg.norm(aspin))

def spin_poly(spin):
    j = (spin.shape[0]-1)/2.
    v = spin.full().T[0]
    poly = []
    for m in np.arange(-j, j+1, 1):
        i = int(m+j)
        poly.append(v[i]*\
            (((-1)**(i))*math.sqrt(math.factorial(2*j)/\
                        (math.factorial(j-m)*math.factorial(j+m)))))
    return poly

def spin_XYZ(spin):
    return [c_xyz(root) for root in poly_roots(spin_poly(spin))]

def XYZ_spin(XYZ):
    return qt.Qobj(poly_spin(roots_poly([xyz_c(xyz) for xyz in XYZ])))

if show:
    scene = vp.canvas(background=vp.color.white)
    vsphere = vp.sphere(color=vp.color.blue, opacity=0.4)
    vstars = [vp.sphere(pos=vp.vector(*pts[i]),\
                        make_trail=True, radius=0.2, emissive=True)\
                  for i in range(n)]

    j = n/2
    spin = poly_spin(roots_poly(complex_pts))
    for dt in np.linspace(0, theta, 5000):
        U = (-1j*qt.jmat(j, 'x')*dt).expm()
        rotated_spin = U*spin
        spin_rotated_pts = np.array(spin_XYZ(rotated_spin))
        for i, vstar in enumerate(vstars):
            vstar.pos = vp.vector(*spin_rotated_pts[i])
        vp.rate(1000)

j = n/2
spin = poly_spin(roots_poly(complex_pts))

U = (-1j*qt.jmat(j, 'x')*theta).expm()
rotated_spin = U*spin
spin_rotated_pts = spin_XYZ(rotated_spin)
print(np.array(spin_rotated_pts))
print(np.array(rotated_pts))

Or we could symmeterize the spinors and act on them all equally with the spin-$\frac{1}{2}$ representation.

In [ ]:
from itertools import permutations, product

def sym_spin(j):
    n = int(2*j)
    if n == 0:
        return qt.Qobj([1])
    N = {}
    for p in product([0,1], repeat=n):
        if p.count(1) in N:
            N[p.count(1)] += qt.tensor(*[qt.basis(2, i) for i in p])
        else:
            N[p.count(1)] = qt.tensor(*[qt.basis(2, i) for i in p])
    Q = qt.Qobj(np.array([N[i].unit().full().T[0].tolist() for i in range(n+1)]))
    Q.dims[1] = [2]*n
    return Q

def symmeterize_spinors(spinors):
    return sum([qt.tensor(*[spinors[i] for i in p]) for p in permutations(range(len(spinors)))]).unit()

n = int(2*j)
S = sym_spin(j)
X = sum([qt.tensor(*[qt.jmat(0.5, 'x') if i == j else qt.identity(2)\
            for j in range(n)]) for i in range(n)])
#print(S*X*S.dag() == qt.jmat(j, 'x'))

if show:
    scene = vp.canvas(background=vp.color.white)
    vsphere = vp.sphere(color=vp.color.blue, opacity=0.4)
    vstars = [vp.sphere(pos=vp.vector(*pts[i]),\
                        make_trail=True, radius=0.2, emissive=True)\
                  for i in range(n)]
    symmeterized_spinors = symmeterize_spinors(spinors)
    for dt in np.linspace(0, theta, 5000):
        U = (-1j*dt*X).expm()
        rotated_symmeterized_spinors = U*symmeterized_spinors
        symmeterized_rotated_pts = spin_XYZ(S*rotated_symmeterized_spinors)
        for i, vstar in enumerate(vstars):
            vstar.pos = vp.vector(*symmeterized_rotated_pts[i])
        vp.rate(1000)

symmeterized_spinors = symmeterize_spinors(spinors)
U = (-1j*theta*X).expm()
rotated_symmeterized_spinors = U*symmeterized_spinors
symmeterized_rotated_pts = spin_XYZ(S*rotated_symmeterized_spinors)
print(np.array(symmeterized_rotated_pts))
print(np.array(rotated_pts))

Finally, we could second quantize Pauli $X$ in the spin-$\frac{1}{2}$ representation, and have it act on the double harmonic oscillator space.

In [ ]:
def second_quantize_operator(O, a):
    O = O.full()
    terms = []
    for i in range(2):
        for j in range(2):
            terms.append(a[i].dag()*O[i][j]*a[j])
    return sum(terms)

def second_quantize_spin_state(spin, a):
    n = spin.shape[0]-1
    j = (spin.shape[0]-1)/2.
    v = spin.full().T[0]
    terms = []
    z, w = [a_.dag() for a_ in a]
    for m in np.arange(-j, j+1, 1):
        i = int(m+j)
        terms.append(v[i]*(z**(n-i))*(w**i)*\
                (math.sqrt(math.factorial(2*j)/\
                        (math.factorial(j-m)*math.factorial(j+m)))))
    return sum(terms)

def construct_permutation(max_ex):    
    tensor_basis_labels = list(product(list(range(max_ex)), repeat=2))
    total_n_basis_labels = []
    for i in range(2*max_ex):
        total_n_basis_labels.extend([(i-j-1, j) for j in range(i)])
    total_n_basis_labels = [label for label in total_n_basis_labels if label in tensor_basis_labels]
    P = np.zeros((max_ex**2, max_ex**2))
    for i, label in enumerate(tensor_basis_labels):
        P[total_n_basis_labels.index(label)][i] = 1
    P = qt.Qobj(P)
    P.dims = [[max_ex, max_ex], [max_ex, max_ex]]
    sums = [sum(label) for label in total_n_basis_labels]
    unique_sums = set(sums)
    dims = [sums.count(us) for us in unique_sums]
    return P, dims

def extract_blocks(M, dims):
    max_ex = int(np.sqrt(M.shape[0]))
    running = 0
    blocks = []
    for d in dims:
        blocks.append(M[running:running+d, running:running+d])
        running += d
    return blocks

def extract_states(v, dims):
    running = 0
    blocks = []
    for d in dims:
        blocks.append(v[running:running+d])
        running += d
    return blocks
    
max_ex = 4
a = [qt.tensor(qt.destroy(max_ex), qt.identity(max_ex)),\
     qt.tensor(qt.identity(max_ex), qt.destroy(max_ex))]

X2 = second_quantize_operator(0.5*qt.sigmax(), a)
P, dims = construct_permutation(max_ex)
blocks = extract_blocks((P*X2*P.dag()).full(), dims)
for block in blocks:
    print(block)
    print()
if False:
    scene = vp.canvas(background=vp.color.white)
    vsphere = vp.sphere(color=vp.color.blue, opacity=0.4)
    vstars = [vp.sphere(pos=vp.vector(*pts[i]),\
                        make_trail=True, radius=0.2, emissive=True)\
                  for i in range(n)]
    osc_state = second_quantize_spin_state(spin, a)
    for dt in np.linspace(0, theta, 5000):
        U = (-1j*X2*dt).expm()
        rotated_osc_state = U*osc_state
        extracted_states = extract_states((P*rotated_osc_state).full().T[0], dims)
        extracted_state = qt.Qobj(extracted_states[int(2*j)])
        osc_rotated_pts = spin_XYZ(extracted_state)
        for i, vstar in enumerate(vstars):
            vstar.pos = vp.vector(*osc_rotated_pts[i])
        vp.rate(1000)

osc_state = second_quantize_spin_state(spin, a)
U = (-1j*X2*theta).expm()
rotated_osc_state = U*osc_state

extracted_states = extract_states((P*rotated_osc_state).full().T[0], dims)
extracted_state = qt.Qobj(extracted_states[int(2*j)])
osc_rotated_pts = spin_XYZ(extracted_state)

print(np.array(osc_rotated_pts))
print(np.array(rotated_pts))
In [ ]: