Steenrod squares
In 1947, Steenrod introduced by means of formulae the cup-\(i\) coproducts on the cochains of spaces. These bilinear maps give rise to the natural cohomology operations \begin{equation*} Sq^k \colon H^\bullet(X; \mathbb F_2) \to H^\bullet(X; \mathbb F_2) \end{equation*}
going beyond betti numbers and laying at the heart of homotopy theory.
As motivation for the practical use of Steenrod squares \(Sq^k\) here are a few situations where they are a convenient distinguishing tool.
The real projective plane (sphere with antipodal points identified) and the wedge of a circle and a sphere (their union with a point from each identified together) have, with \(\mathbb F_2\)-coefficients, the same betti numbers, yet the rank of \(Sq^1\) tells them apart.
Similarly, the complex projective plane and the wedge of a 2-sphere and a 4-sphere have the same betti numbers with any coefficients, yet the rank of \(Sq^2\) tells them apart.
The suspensions (join with two points) of the two spaces above have the same betti numbers and also isomorphic cohomology rings (cup product), yet \(Sq^2\) tells them apart.
The cup-\(i\) coproducts \(\Delta_i \colon C_\bullet(X; \mathbb F_2) \to C_\bullet(X; \mathbb F_2) \otimes C_\bullet(X; \mathbb F_2)\) extend the Alexander-Whitney diagonal \(\Delta_0\), and the higher cup-\(i\) coproducts can be interpreted as coherent homotopies witnessing at the chain level the symmetry of \(\Delta_0\) at the homology level. The Steenrod squares are defined by
\begin{equation} Sq^k \big( [\alpha] \big) = \big[ (\alpha \otimes \alpha) \Delta_{|\alpha|-k}\big]. \end{equation}
Let us review their description as presented in [MM22a] proven to be equivalent to Steenrod’s original in [MM22b].
Let \(X\) be a simplicial complex and \(x \in X_n\). For a set \begin{equation*} U = \{u_1 < \dots < u_r\} \subseteq \{0, \dots, n\} \end{equation*}
we write \(d_U(x) = d_{u_1}\! \dotsm \, d_{u_r}(x)\), with \(d_{\emptyset}(x) = x\) and \(d_u [v_0, \dots, v_n] = [v_0, \dots, \widehat v_u, \dots, v_n]\).
For any simplicial complex \(X\) and integer \(i\) \begin{equation*} \Delta_i \colon C_\bullet(X; \mathbb F_2) \to C_\bullet(X; \mathbb F_2) \otimes C_\bullet(X; \mathbb F_2) \end{equation*}
is the linear map defined on a simplex \(x \in X_n\) to be \(0\) if \(i \not\in \{0, \dots, n\}\) and is otherwise given by
\begin{equation} \Delta_i(x) = \sum d_{U^0}(x) \otimes d_{U^1}(x) \end{equation}
where the sum is taken over all subsets \(U = \{u_1 < \cdots < u_{n-i}\} \subseteq \{0, \dots, n\}\) and
\begin{equation} \label{e:partition subsets} U^0 = \{u_j \in U\mid u_j \equiv j \text{ mod } 2\}, \qquad U^1 = \{u_j \in U\mid u_j \not\equiv j \text{ mod } 2\}. \end{equation}
[1]:
from itertools import combinations
def steenrod_diagonal(i, spx):
'''Returns the image of applying the ith Steenrod coproduct to spx.'''
answer = []
n = len(spx)-1
for U in combinations(range(n+1), n-i):
left, right = list(spx), list(spx)
for u in U:
if (U.index(u) + u) % 2 == 1:
left.remove(spx[u])
else:
right.remove(spx[u])
answer.append((tuple(left), tuple(right)))
return answer
Let us consider a simplicial complex modeling the real projective plane \(\mathbb RP^2\) whose cohomology is (additively) given by
\begin{equation} H^n(\mathbb RP^2; \mathbb F_2) \cong \begin{cases} \mathbb F_2, & n=0,1,2 \\ 0, & \text{otherwise}. \end{cases} \end{equation}
[2]:
rp2 = (
(0,),
(1,), (0,1),
(2,), (0,2), (1,2), (0,1,2),
(3,), (0,3), (1,3), (0,1,3), (2,3),
(4,), (0,4), (1,4), (2,4), (1,2,4), (3,4), (0,3,4), (2,3,4),
(5,), (0,5), (1,5), (2,5), (0,2,5), (3,5), (1,3,5), (2,3,5), (4,5), (0,4,5), (1,4,5)
)
As computed in the notebook barcode, a cocycle representative \(\alpha\) for the generator of \(H^n(\mathbb RP^2; \mathbb F_2)\) is the following:
[3]:
coho_rep = [(2, 4), (1, 5), (1, 4), (2, 3), (3, 5)]
We now use the linearity of the tensor product to compute by brute force a representative of \(Sq^1\big( [\alpha] \big)\).
[4]:
from itertools import permutations
sq_rep = []
for pair in permutations(coho_rep, 2):
for spx in (s for s in rp2 if len(s) == 3):
if pair in steenrod_diagonal(0, spx):
sq_rep.append(spx)
sq_rep
[4]:
[(2, 3, 5)]
Since this cocycle represents the generator of \(H^2(\mathbb RP^2; \mathbb F_2)\), we have that \(\mathrm{rank}(Sq^1) = 1\).