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.

  1. 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.

  2. 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.

  3. 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\).