The Steenrod algebra¶
AUTHORS:
- John H. Palmieri (2008-07-30): version 0.9: Initial implementation.
- John H. Palmieri (2010-06-30): version 1.0: Implemented sub-Hopf algebras and profile functions; direct multiplication of admissible sequences (rather than conversion to the Milnor basis); implemented the Steenrod algebra using CombinatorialFreeModule; improved the test suite.
This module defines the mod \(p\) Steenrod algebra \(\mathcal{A}_p\), some of its properties, and ways to define elements of it.
From a topological point of view, \(\mathcal{A}_p\) is the algebra of stable cohomology operations on mod \(p\) cohomology; thus for any topological space \(X\), its mod \(p\) cohomology algebra \(H^*(X,\mathbf{F}_p)\) is a module over \(\mathcal{A}_p\).
From an algebraic point of view, \(\mathcal{A}_p\) is an \(\mathbf{F}_p\)-algebra; when \(p=2\), it is generated by elements \(\text{Sq}^i\) for \(i\geq 0\) (the Steenrod squares), and when \(p\) is odd, it is generated by elements \(\mathcal{P}^i\) for \(i \geq 0\) (the Steenrod reduced pth powers) along with an element \(\beta\) (the mod p Bockstein). The Steenrod algebra is graded: \(\text{Sq}^i\) is in degree \(i\) for each \(i\), \(\beta\) is in degree 1, and \(\mathcal{P}^i\) is in degree \(2(p-1)i\).
The unit element is \(\text{Sq}^0\) when \(p=2\) and \(\mathcal{P}^0\) when \(p\) is odd. The generating elements also satisfy the Adem relations. At the prime 2, these have the form
At odd primes, they are a bit more complicated; see Steenrod and
Epstein [SE1962] or sage.algebras.steenrod.steenrod_algebra_bases
for full details. These relations lead to the existence of the
Serre-Cartan basis for \(\mathcal{A}_p\).
The mod \(p\) Steenrod algebra has the structure of a Hopf algebra, and Milnor [Mil1958] has a beautiful description of the dual, leading to a construction of the Milnor basis for \(\mathcal{A}_p\). In this module, elements in the Steenrod algebra are represented, by default, using the Milnor basis.
Bases for the Steenrod algebra
There are a handful of other bases studied in the literature; the paper by Monks [Mon1998] is a good reference. Here is a quick summary:
The Milnor basis. When \(p=2\), the Milnor basis consists of symbols of the form \(\text{Sq}(m_1, m_2, ..., m_t)\), where each \(m_i\) is a non-negative integer and if \(t>1\), then the last entry \(m_t > 0\). When \(p\) is odd, the Milnor basis consists of symbols of the form \(Q_{e_1} Q_{e_2} ... \mathcal{P}(m_1, m_2, ..., m_t)\), where \(0 \leq e_1 < e_2 < ...\), each \(m_i\) is a non-negative integer, and if \(t>1\), then the last entry \(m_t > 0\).
When \(p=2\), it can be convenient to use the notation \(\mathcal{P}(-)\) to mean \(\text{Sq}(-)\), so that there is consistent notation for all primes.
The Serre-Cartan basis. This basis consists of ‘admissible monomials’ in the Steenrod operations. Thus at the prime 2, it consists of monomials \(\text{Sq}^{m_1} \text{Sq}^{m_2} ... \text{Sq}^{m_t}\) with \(m_i \geq 2m_{i+1}\) for each \(i\). At odd primes, this basis consists of monomials \(\beta^{\epsilon_0} \mathcal{P}^{s_1} \beta^{\epsilon_1} \mathcal{P}^{s_2} ... \mathcal{P}^{s_k} \beta^{\epsilon_k}\) with each \(\epsilon_i\) either 0 or 1, \(s_i \geq p s_{i+1} + \epsilon_i\), and \(s_k \geq 1\).
Most of the rest of the bases are only defined when \(p=2\). The only exceptions are the \(P^s_t\)-bases and the commutator bases, which are defined at all primes.
Wood’s Y basis. For pairs of non-negative integers \((m,k)\), let \(w(m,k) = \text{Sq}^{2^m (2^{k+1}-1)}\). Wood’s \(Y\) basis consists of monomials \(w(m_0,k_0) ... w(m_t, k_t)\) with \((m_i,k_i) > (m_{i+1},k_{i+1})\), in left lex order.
Wood’s Z basis. For pairs of non-negative integers \((m,k)\), let \(w(m,k) = \text{Sq}^{2^m (2^{k+1}-1)}\). Wood’s \(Z\) basis consists of monomials \(w(m_0,k_0) ... w(m_t, k_t)\) with \((m_i+k_i,m_i) > (m_{i+1}+k_{i+1},m_{i+1})\), in left lex order.
Wall’s basis. For any pair of integers \((m,k)\) with \(m \geq k \geq 0\), let \(Q^m_k = \text{Sq}^{2^k} \text{Sq}^{2^{k+1}} ... \text{Sq}^{2^m}\). The elements of Wall’s basis are monomials \(Q^{m_0}_{k_0} ... Q^{m_t}_{k_t}\) with \((m_i, k_i) > (m_{i+1}, k_{i+1})\), ordered left lexicographically.
(Note that \(Q^m_k\) is the reverse of the element \(X^m_k\) used in defining Arnon’s A basis.)
Arnon’s A basis. For any pair of integers \((m,k)\) with \(m \geq k \geq 0\), let \(X^m_k = \text{Sq}^{2^m} \text{Sq}^{2^{m-1}} ... \text{Sq}^{2^k}\). The elements of Arnon’s A basis are monomials \(X^{m_0}_{k_0} ... X^{m_t}_{k_t}\) with \((m_i, k_i) < (m_{i+1}, k_{i+1})\), ordered left lexicographically.
(Note that \(X^m_k\) is the reverse of the element \(Q^m_k\) used in defining Wall’s basis.)
Arnon’s C basis. The elements of Arnon’s C basis are monomials of the form \(\text{Sq}^{t_1} ... \text{Sq}^{t_m}\) where for each \(i\), we have \(t_i \leq 2t_{i+1}\) and \(2^i | t_{m-i}\).
\(P^s_t\) bases. Let \(p=2\). For integers \(s \geq 0\) and \(t > 0\), the element \(P^s_t\) is the Milnor basis element \(\mathcal{P}(0, ..., 0, p^s, 0, ...)\), with the nonzero entry in position \(t\). To obtain a \(P^s_t\)-basis, for each set \(\{P^{s_1}_{t_1}, ..., P^{s_k}_{t_k}\}\) of (distinct) \(P^s_t\)‘s, one chooses an ordering and forms the monomials
\[(P^{s_1}_{t_1})^{i_1} ... (P^{s_k}_{t_k})^{i_k}\]for all exponents \(i_j\) with \(0 < i_j < p\). When \(p=2\), the set of all such monomials then forms a basis, and when \(p\) is odd, if one multiplies each such monomial on the left by products of the form \(Q_{e_1} Q_{e_2} ...\) with \(0 \leq e_1 < e_2 < ...\), one obtains a basis.
Thus one gets a basis by choosing an ordering on each set of \(P^s_t\)‘s. There are infinitely many orderings possible, and we have implemented four of them:
- ‘rlex’: right lexicographic ordering
- ‘llex’: left lexicographic ordering
- ‘deg’: ordered by degree, which is the same as left lexicographic ordering on the pair \((s+t,t)\)
- ‘revz’: left lexicographic ordering on the pair \((s+t,s)\), which is the reverse of the ordering used (on elements in the same degrees as the \(P^s_t\)‘s) in Wood’s Z basis: ‘revz’ stands for ‘reversed Z’. This is the default: ‘pst’ is the same as ‘pst_revz’.
Commutator bases. Let \(c_{i,1} = \mathcal{P}(p^i)\), let \(c_{i,2} = [c_{i+1,1}, c_{i,1}]\), and inductively define \(c_{i,k} = [c_{i+k-1,1}, c_{i,k-1}]\). Thus \(c_{i,k}\) is a \(k\)-fold iterated commutator of the elements \(\mathcal{P}(p^i)\), …, \(\mathcal{P}(p^{i+k-1})\). Note that \(\dim c_{i,k} = \dim P^i_k\).
Commutator bases are obtained in much the same way as \(P^s_t\)-bases: for each set \(\{c_{s_1,t_1}, ..., c_{s_k,t_k}\}\) of (distinct) \(c_{s,t}\)‘s, one chooses an ordering and forms the resulting monomials
\[c_{s_1, t_1}^{i_1} ... c_{s_k,t_k}^{i_k}\]for all exponents \(i_j\) with \(0 < i_j < p\). When \(p\) is odd, one also needs to left-multiply by products of the \(Q_i\)‘s. As for \(P^s_t\)-bases, every ordering on each set of iterated commutators determines a basis, and the same four orderings have been defined for these bases as for the \(P^s_t\) bases: ‘rlex’, ‘llex’, ‘deg’, ‘revz’.
Sub-Hopf algebras of the Steenrod algebra
The sub-Hopf algebras of the Steenrod algebra have been classified. Milnor proved that at the prime 2, the dual of the Steenrod algebra \(A_*\) is isomorphic to a polynomial algebra
The Milnor basis is dual to the monomial basis. Furthermore, any sub-Hopf algebra corresponds to a quotient of this of the form
The list of exponents \((e_1, e_2, ...)\) may be considered a function \(e\) from the positive integers to the extended non-negative integers (the non-negative integers and \(\infty\)); this is called the profile function for the sub-Hopf algebra. The profile function must satisfy the condition
- \(e(r) \geq \min( e(r-i) - i, e(i))\) for all \(0 < i < r\).
At odd primes, the situation is similar: the dual is isomorphic to the tensor product of a polynomial algebra and an exterior algebra,
and any sub-Hopf algebra corresponds to a quotient of this of the form
Here the profile function has two pieces, \(e\) as at the prime 2, and \(k\), which maps the non-negative integers to the set \(\{1, 2\}\). These must satisfy the following conditions:
- \(e(r) \geq \min( e(r-i) - i, e(i))\) for all \(0 < i < r\).
- if \(k(i+j) = 1\), then either \(e(i) \leq j\) or \(k(j) = 1\) for all \(i \geq 1\), \(j \geq 0\).
(See Adams-Margolis [AM1974], for example, for these results on profile functions.)
This module allows one to construct the Steenrod algebra or any of its sub-Hopf algebras, at any prime. When defining a sub-Hopf algebra, you must work with the Milnor basis or a \(P^s_t\)-basis.
Elements of the Steenrod algebra
Basic arithmetic, \(p=2\). To construct an element of the mod 2 Steenrod
algebra, use the function Sq
:
sage: a = Sq(1,2)
sage: b = Sq(4,1)
sage: z = a + b
sage: z
Sq(1,2) + Sq(4,1)
sage: Sq(4) * Sq(1,2)
Sq(1,1,1) + Sq(2,3) + Sq(5,2)
sage: z**2 # non-negative exponents work as they should
Sq(1,2,1) + Sq(4,1,1)
sage: z**0
1
Basic arithmetic, \(p>2\). To construct an element of the mod \(p\)
Steenrod algebra when \(p\) is odd, you should first define a Steenrod
algebra, using the SteenrodAlgebra
command:
sage: A3 = SteenrodAlgebra(3)
Having done this, the newly created algebra A3
has methods Q
and P
which construct elements of A3
:
sage: c = A3.Q(1,3,6); c
Q_1 Q_3 Q_6
sage: d = A3.P(2,0,1); d
P(2,0,1)
sage: c * d
Q_1 Q_3 Q_6 P(2,0,1)
sage: e = A3.P(3)
sage: d * e
P(5,0,1)
sage: e * d
P(1,1,1) + P(5,0,1)
sage: c * c
0
sage: e ** 3
2 P(1,2)
Note that one can construct an element like c
above in one step,
without first constructing the algebra:
sage: c = SteenrodAlgebra(3).Q(1,3,6)
sage: c
Q_1 Q_3 Q_6
And of course, you can do similar constructions with the mod 2 Steenrod algebra:
sage: A = SteenrodAlgebra(2); A
mod 2 Steenrod algebra, milnor basis
sage: A.Sq(2,3,5)
Sq(2,3,5)
sage: A.P(2,3,5) # when p=2, P = Sq
Sq(2,3,5)
sage: A.Q(1,4) # when p=2, this gives a product of Milnor primitives
Sq(0,1,0,0,1)
Associated to each element is its prime (the characteristic of the underlying base field) and its basis (the basis for the Steenrod algebra in which it lies):
sage: a = SteenrodAlgebra(basis='milnor').Sq(1,2,1)
sage: a.prime()
2
sage: a.basis_name()
'milnor'
sage: a.degree()
14
It can be viewed in other bases:
sage: a.milnor() # same as a
Sq(1,2,1)
sage: a.change_basis('adem')
Sq^9 Sq^4 Sq^1 + Sq^11 Sq^2 Sq^1 + Sq^13 Sq^1
sage: a.change_basis('adem').change_basis('milnor')
Sq(1,2,1)
Regardless of the prime, each element has an excess
, and if the
element is homogeneous, a degree
. The excess of
\(\text{Sq}(i_1,i_2,i_3,...)\) is \(i_1 + i_2 + i_3 + ...\); when \(p\) is
odd, the excess of \(Q_{0}^{e_0} Q_{1}^{e_1} ... \mathcal{P}(r_1, r_2,
...)\) is \(\sum e_i + 2 \sum r_i\). The excess of a linear combination
of Milnor basis elements is the minimum of the excesses of those basis
elements.
The degree of \(\text{Sq}(i_1,i_2,i_3,...)\) is \(\sum (2^n-1) i_n\), and when \(p\) is odd, the degree of \(Q_{0}^{\epsilon_0} Q_{1}^{\epsilon_1} ... \mathcal{P}(r_1, r_2, ...)\) is \(\sum \epsilon_i (2p^i - 1) + \sum r_j (2p^j - 2)\). The degree of a linear combination of such terms is only defined if the terms all have the same degree.
Here are some simple examples:
sage: z = Sq(1,2) + Sq(4,1)
sage: z.degree()
7
sage: (Sq(0,0,1) + Sq(5,3)).degree()
Traceback (most recent call last):
...
ValueError: Element is not homogeneous.
sage: Sq(7,2,1).excess()
10
sage: z.excess()
3
sage: B = SteenrodAlgebra(3)
sage: x = B.Q(1,4)
sage: y = B.P(1,2,3)
sage: x.degree()
166
sage: x.excess()
2
sage: y.excess()
12
Elements have a weight
in the May filtration, which (when \(p=2\))
is related to the height
function defined by Wall:
sage: Sq(2,1,5).may_weight()
9
sage: Sq(2,1,5).wall_height()
[2, 3, 2, 1, 1]
sage: b = Sq(4)*Sq(8) + Sq(8)*Sq(4)
sage: b.may_weight()
2
sage: b.wall_height()
[0, 0, 1, 1]
Odd primary May weights:
sage: A5 = SteenrodAlgebra(5)
sage: a = A5.Q(1,2,4)
sage: b = A5.P(1,2,1)
sage: a.may_weight()
10
sage: b.may_weight()
8
sage: (a * b).may_weight()
18
sage: A5.P(0,0,1).may_weight()
3
Since the Steenrod algebra is a Hopf algebra, every element has a coproduct and an antipode:
sage: Sq(5).coproduct()
1 # Sq(5) + Sq(1) # Sq(4) + Sq(2) # Sq(3) + Sq(3) # Sq(2) + Sq(4) # Sq(1) + Sq(5) # 1
sage: Sq(5).antipode()
Sq(2,1) + Sq(5)
sage: d = Sq(0,0,1); d
Sq(0,0,1)
sage: d.antipode()
Sq(0,0,1)
sage: Sq(4).antipode()
Sq(1,1) + Sq(4)
sage: (Sq(4) * Sq(2)).antipode()
Sq(6)
sage: SteenrodAlgebra(7).P(3,1).antipode()
P(3,1)
Applying the antipode twice returns the original element:
sage: y = Sq(8)*Sq(4)
sage: y == (y.antipode()).antipode()
True
Internal representation: you can use any element as an iterator (for
x in a: ...
), and the method monomial_coefficients()
returns a
dictionary with keys tuples representing basis elements and with
corresponding value representing the coefficient of that term:
sage: c = Sq(5).antipode(); c
Sq(2,1) + Sq(5)
sage: for mono, coeff in c: print((coeff, mono))
(1, (5,))
(1, (2, 1))
sage: c.monomial_coefficients() == {(2, 1): 1, (5,): 1}
True
sage: sorted(c.monomials(), key=lambda x: x.support())
[Sq(2,1), Sq(5)]
sage: sorted(c.support())
[(2, 1), (5,)]
sage: Adem = SteenrodAlgebra(basis='adem')
sage: elt = Adem.Sq(10) + Adem.Sq(9) * Adem.Sq(1)
sage: sorted(elt.monomials(), key=lambda x: x.support())
[Sq^9 Sq^1, Sq^10]
sage: A7 = SteenrodAlgebra(p=7)
sage: a = A7.P(1) * A7.P(1); a
2 P(2)
sage: a.leading_coefficient()
2
sage: a.leading_monomial()
P(2)
sage: a.leading_term()
2 P(2)
sage: a.change_basis('adem').monomial_coefficients()
{(0, 2, 0): 2}
The tuple in the previous output stands for the element \(\beta^0
P^2 \beta^0\), i.e., \(P^2\). Going in the other direction, if you
want to specify a basis element by giving the corresponding tuple,
you can use the monomial()
method on the algebra:
sage: SteenrodAlgebra(p=7, basis='adem').monomial((0, 2, 0))
P^2
sage: 10 * SteenrodAlgebra(p=7, basis='adem').monomial((0, 2, 0))
3 P^2
In the following example, elements in Wood’s Z basis are certain products of the elements \(w(m,k) = \text{Sq}^{2^m (2^{k+1}-1)}\). Internally, each \(w(m,k)\) is represented by the pair \((m,k)\), and products of them are represented by tuples of such pairs.
sage: A = SteenrodAlgebra(basis='wood_z')
sage: t = ((2, 0), (0, 0))
sage: A.monomial(t)
Sq^4 Sq^1
See the documentation for SteenrodAlgebra()
for more details and
examples.
-
sage.algebras.steenrod.steenrod_algebra.
AA
(n=None, p=2)¶ This returns the Steenrod algebra \(A\) or its sub-Hopf algebra \(A(n)\).
INPUT:
- \(n\) - non-negative integer, optional (default
None
) - \(p\) - prime number, optional (default 2)
OUTPUT: If \(n\) is
None
, then return the full Steenrod algebra. Otherwise, return \(A(n)\).When \(p=2\), \(A(n)\) is the sub-Hopf algebra generated by the elements \(\text{Sq}^i\) for \(i \leq 2^n\). Its profile function is \((n+1, n, n-1, ...)\). When \(p\) is odd, \(A(n)\) is the sub-Hopf algebra generated by the elements \(Q_0\) and \(\mathcal{P}^i\) for \(i \leq p^{n-1}\). Its profile function is \(e=(n, n-1, n-2, ...)\) and \(k=(2, 2, ..., 2)\) (length \(n+1\)).
EXAMPLES:
sage: from sage.algebras.steenrod.steenrod_algebra import AA as A sage: A() mod 2 Steenrod algebra, milnor basis sage: A(2) sub-Hopf algebra of mod 2 Steenrod algebra, milnor basis, profile function [3, 2, 1] sage: A(2, p=5) sub-Hopf algebra of mod 5 Steenrod algebra, milnor basis, profile function ([2, 1], [2, 2, 2])
- \(n\) - non-negative integer, optional (default
-
sage.algebras.steenrod.steenrod_algebra.
Sq
(*nums)¶ Milnor element Sq(a,b,c,…).
INPUT:
a, b, c, ...
- non-negative integers
OUTPUT: element of the Steenrod algebra
This returns the Milnor basis element \(\text{Sq}(a, b, c, ...)\).
EXAMPLES:
sage: Sq(5) Sq(5) sage: Sq(5) + Sq(2,1) + Sq(5) # addition is mod 2: Sq(2,1) sage: (Sq(4,3) + Sq(7,2)).degree() 13
Entries must be non-negative integers; otherwise, an error results.
This function is a good way to define elements of the Steenrod algebra.
-
sage.algebras.steenrod.steenrod_algebra.
SteenrodAlgebra
(p=2, basis='milnor', generic='auto', **kwds)¶ The mod \(p\) Steenrod algebra
INPUT:
p
- positive prime integer (optional, default = 2)basis
- string (optional, default = ‘milnor’)profile
- a profile function in form specified below (optional, defaultNone
)truncation_type
- 0 or \(\infty\) or ‘auto’ (optional, default ‘auto’)precision
- integer orNone
(optional, defaultNone
)generic
- (optional, default ‘auto’)
OUTPUT: mod \(p\) Steenrod algebra or one of its sub-Hopf algebras, elements of which are printed using
basis
See below for information about
basis
,profile
, etc.EXAMPLES:
Some properties of the Steenrod algebra are available:
sage: A = SteenrodAlgebra(2) sage: A.order() +Infinity sage: A.is_finite() False sage: A.is_commutative() False sage: A.is_noetherian() False sage: A.is_integral_domain() False sage: A.is_field() False sage: A.is_division_algebra() False sage: A.category() Category of graded hopf algebras with basis over Finite Field of size 2
There are methods for constructing elements of the Steenrod algebra:
sage: A2 = SteenrodAlgebra(2); A2 mod 2 Steenrod algebra, milnor basis sage: A2.Sq(1,2,6) Sq(1,2,6) sage: A2.Q(3,4) # product of Milnor primitives Q_3 and Q_4 Sq(0,0,0,1,1) sage: A2.pst(2,3) # Margolis pst element Sq(0,0,4) sage: A5 = SteenrodAlgebra(5); A5 mod 5 Steenrod algebra, milnor basis sage: A5.P(1,2,6) P(1,2,6) sage: A5.Q(3,4) Q_3 Q_4 sage: A5.Q(3,4) * A5.P(1,2,6) Q_3 Q_4 P(1,2,6) sage: A5.pst(2,3) P(0,0,25)
You can test whether elements are contained in the Steenrod algebra:
sage: w = Sq(2) * Sq(4) sage: w in SteenrodAlgebra(2) True sage: w in SteenrodAlgebra(17) False
Different bases for the Steenrod algebra:
There are two standard vector space bases for the mod \(p\) Steenrod algebra: the Milnor basis and the Serre-Cartan basis. When \(p=2\), there are also several other, less well-known, bases. See the documentation for this module (type
sage.algebras.steenrod.steenrod_algebra?
) and the functionsteenrod_algebra_basis
for full descriptions of each of the implemented bases.This module implements the following bases at all primes:
- ‘milnor’: Milnor basis.
- ‘serre-cartan’ or ‘adem’ or ‘admissible’: Serre-Cartan basis.
- ‘pst’, ‘pst_rlex’, ‘pst_llex’, ‘pst_deg’, ‘pst_revz’: various \(P^s_t\)-bases.
- ‘comm’, ‘comm_rlex’, ‘comm_llex’, ‘comm_deg’, ‘comm_revz’, or these with ‘_long’ appended: various commutator bases.
It implements the following bases when \(p=2\):
- ‘wood_y’: Wood’s Y basis.
- ‘wood_z’: Wood’s Z basis.
- ‘wall’, ‘wall_long’: Wall’s basis.
- ‘arnon_a’, ‘arnon_a_long’: Arnon’s A basis.
- ‘arnon_c’: Arnon’s C basis.
When defining a Steenrod algebra, you can specify a basis. Then elements of that Steenrod algebra are printed in that basis:
sage: adem = SteenrodAlgebra(2, 'adem') sage: x = adem.Sq(2,1) # Sq(-) always means a Milnor basis element sage: x Sq^4 Sq^1 + Sq^5 sage: y = Sq(0,1) # unadorned Sq defines elements w.r.t. Milnor basis sage: y Sq(0,1) sage: adem(y) Sq^2 Sq^1 + Sq^3 sage: adem5 = SteenrodAlgebra(5, 'serre-cartan') sage: adem5.P(0,2) P^10 P^2 + 4 P^11 P^1 + P^12
If you add or multiply elements defined using different bases, the left-hand factor determines the form of the output:
sage: SteenrodAlgebra(basis='adem').Sq(3) + SteenrodAlgebra(basis='pst').Sq(0,1) Sq^2 Sq^1 sage: SteenrodAlgebra(basis='pst').Sq(3) + SteenrodAlgebra(basis='milnor').Sq(0,1) P^0_1 P^1_1 + P^0_2 sage: SteenrodAlgebra(basis='milnor').Sq(2) * SteenrodAlgebra(basis='arnonc').Sq(2) Sq(1,1)
You can get a list of basis elements in a given dimension:
sage: A3 = SteenrodAlgebra(3, 'milnor') sage: A3.basis(13) Family (Q_1 P(2), Q_0 P(3))
Algebras defined over different bases are not equal:
sage: SteenrodAlgebra(basis='milnor') == SteenrodAlgebra(basis='pst') False
Bases have various synonyms, and in general Sage tries to figure out what basis you meant:
sage: SteenrodAlgebra(basis='MiLNOr') mod 2 Steenrod algebra, milnor basis sage: SteenrodAlgebra(basis='MiLNOr') == SteenrodAlgebra(basis='milnor') True sage: SteenrodAlgebra(basis='adem') mod 2 Steenrod algebra, serre-cartan basis sage: SteenrodAlgebra(basis='adem').basis_name() 'serre-cartan' sage: SteenrodAlgebra(basis='wood---z---').basis_name() 'woodz'
As noted above, several of the bases (‘arnon_a’, ‘wall’, ‘comm’) have alternate, sometimes longer, representations. These provide ways of expressing elements of the Steenrod algebra in terms of the \(\text{Sq}^{2^n}\).
sage: A_long = SteenrodAlgebra(2, 'arnon_a_long') sage: A_long(Sq(6)) Sq^1 Sq^2 Sq^1 Sq^2 + Sq^2 Sq^4 sage: SteenrodAlgebra(2, 'wall_long')(Sq(6)) Sq^2 Sq^1 Sq^2 Sq^1 + Sq^2 Sq^4 sage: SteenrodAlgebra(2, 'comm_deg_long')(Sq(6)) s_1 s_2 s_12 + s_2 s_4
Sub-Hopf algebras of the Steenrod algebra:
These are specified using the argument
profile
, along with, optionally,truncation_type
andprecision
. Theprofile
argument specifies the profile function for this algebra. Any sub-Hopf algebra of the Steenrod algebra is determined by its profile function. When \(p=2\), this is a map \(e\) from the positive integers to the set of non-negative integers, plus \(\infty\), corresponding to the sub-Hopf algebra dual to this quotient of the dual Steenrod algebra:\[\GF{2} [\xi_1, \xi_2, \xi_3, ...] / (\xi_1^{2^{e(1)}}, \xi_2^{2^{e(2)}}, \xi_3^{2^{e(3)}}, ...).\]The profile function \(e\) must satisfy the condition
- \(e(r) \geq \min( e(r-i) - i, e(i))\) for all \(0 < i < r\).
This is specified via
profile
, and optionallyprecision
andtruncation_type
. First,profile
must have one of the following forms:- a list or tuple, e.g.,
[3,2,1]
, corresponding to the function sending 1 to 3, 2 to 2, 3 to 1, and all other integers to the value oftruncation_type
. - a function from positive integers to non-negative integers (and
\(\infty\)), e.g.,
lambda n: n+2
. None
orInfinity
- use this for the profile function for the whole Steenrod algebra.
In the first and third cases,
precision
is ignored. In the second case, this function is converted to a tuple of length one less thanprecision
, which has default value 100. The function is truncated at this point, and all remaining values are set to the value oftruncation_type
.truncation_type
may be 0, \(\infty\), or ‘auto’. If it’s ‘auto’, then it gets converted to 0 in the first case above (whenprofile
is a list), and otherwise (whenprofile
is a function,None
, orInfinity
) it gets converted to \(\infty\).For example, the sub-Hopf algebra \(A(2)\) has profile function
[3,2,1,0,0,0,...]
, so it can be defined by any of the following:sage: A2 = SteenrodAlgebra(profile=[3,2,1]) sage: B2 = SteenrodAlgebra(profile=[3,2,1,0,0]) # trailing 0's ignored sage: A2 == B2 True sage: C2 = SteenrodAlgebra(profile=lambda n: max(4-n, 0), truncation_type=0) sage: A2 == C2 True
In the following case, the profile function is specified by a function and
truncation_type
isn’t specified, so it defaults to \(\infty\); therefore this gives a different sub-Hopf algebra:sage: D2 = SteenrodAlgebra(profile=lambda n: max(4-n, 0)) sage: A2 == D2 False sage: D2.is_finite() False sage: E2 = SteenrodAlgebra(profile=lambda n: max(4-n, 0), truncation_type=Infinity) sage: D2 == E2 True
The argument
precision
only needs to be specified if the profile function is defined by a function and you want to control when the profile switches from the given function to the truncation type. For example:sage: D3 = SteenrodAlgebra(profile=lambda n: n, precision=3) sage: D3 sub-Hopf algebra of mod 2 Steenrod algebra, milnor basis, profile function [1, 2, +Infinity, +Infinity, +Infinity, ...] sage: D4 = SteenrodAlgebra(profile=lambda n: n, precision=4); D4 sub-Hopf algebra of mod 2 Steenrod algebra, milnor basis, profile function [1, 2, 3, +Infinity, +Infinity, +Infinity, ...] sage: D3 == D4 False
When \(p\) is odd,
profile
is a pair of functions \(e\) and \(k\), corresponding to the quotient\[\GF{p} [\xi_1, \xi_2, \xi_3, ...] \otimes \Lambda (\tau_0, \tau_1, ...) / (\xi_1^{p^{e_1}}, \xi_2^{p^{e_2}}, ...; \tau_0^{k_0}, \tau_1^{k_1}, ...).\]Together, the functions \(e\) and \(k\) must satisfy the conditions
- \(e(r) \geq \min( e(r-i) - i, e(i))\) for all \(0 < i < r\),
- if \(k(i+j) = 1\), then either \(e(i) \leq j\) or \(k(j) = 1\) for all \(i \geq 1\), \(j \geq 0\).
Therefore
profile
must have one of the following forms:- a pair of lists or tuples, the second of which takes values in
the set \(\{1,2\}\), e.g.,
([3,2,1,1], [1,1,2,2,1])
. - a pair of functions, one from the positive integers to
non-negative integers (and \(\infty\)), one from the non-negative
integers to the set \(\{1,2\}\), e.g.,
(lambda n: n+2, lambda n: 1 if n<3 else 2)
. None
orInfinity
- use this for the profile function for the whole Steenrod algebra.
You can also mix and match the first two, passing a pair with first entry a list and second entry a function, for instance. The values of
precision
andtruncation_type
are determined by the first entry.More examples:
sage: E = SteenrodAlgebra(profile=lambda n: 0 if n<3 else 3, truncation_type=0) sage: E.is_commutative() True sage: A2 = SteenrodAlgebra(profile=[3,2,1]) # the algebra A(2) sage: Sq(7,3,1) in A2 True sage: Sq(8) in A2 False sage: Sq(8) in SteenrodAlgebra().basis(8) True sage: Sq(8) in A2.basis(8) False sage: A2.basis(8) Family (Sq(1,0,1), Sq(2,2), Sq(5,1)) sage: A5 = SteenrodAlgebra(p=5) sage: A51 = SteenrodAlgebra(p=5, profile=([1], [2,2])) sage: A5.Q(0,1) * A5.P(4) in A51 True sage: A5.Q(2) in A51 False sage: A5.P(5) in A51 False
For sub-Hopf algebras of the Steenrod algebra, only the Milnor basis or the various \(P^s_t\)-bases may be used.
sage: SteenrodAlgebra(profile=[1,2,1,1], basis='adem') Traceback (most recent call last): ... NotImplementedError: For sub-Hopf algebras of the Steenrod algebra, only the Milnor basis and the pst bases are implemented.
The generic Steenrod algebra at the prime \(2\):
The structure formulas for the Steenrod algebra at odd primes \(p\) also make sense when \(p\) is set to \(2\). We refer to the resulting algebra as the “generic Steenrod algebra” for the prime \(2\). The dual Hopf algebra is given by
\[A_* = \GF{2} [\xi_1, \xi_2, \xi_3, ...] \otimes \Lambda (\tau_0, \tau_1, ...)\]The degree of \(\xi_k\) is \(2^{k+1}-2\) and the degree of \(\tau_k\) is \(2^{k+1}-1\).
The generic Steenrod algebra is an associated graded algebra of the usual Steenrod algebra that is occasionally useful. Its cohomology, for example, is the \(E_2\)-term of a spectral sequence that computes the \(E_2\)-term of the Novikov spectral sequence. It can also be obtained as a specialisation of Voevodsky’s “motivic Steenrod algebra”: in the notation of [Voe2003], Remark 12.12, it corresponds to setting \(\rho = \tau = 0\). The usual Steenrod algebra is given by \(\rho = 0\) and \(\tau = 1\).
In Sage this algebra is constructed using the ‘generic’ keyword.
Example:
sage: EA = SteenrodAlgebra(p=2,generic=True) ; EA generic mod 2 Steenrod algebra, milnor basis sage: EA[8] Vector space spanned by (Q_0 Q_2, Q_0 Q_1 P(2), P(1,1), P(4)) over Finite Field of size 2
-
sage.algebras.steenrod.steenrod_algebra.
SteenrodAlgebra_generic
¶ The mod \(p\) Steenrod algebra.
Users should not call this, but use the function
SteenrodAlgebra()
instead. See that function for extensive documentation.EXAMPLES:
sage: sage.algebras.steenrod.steenrod_algebra.SteenrodAlgebra_generic() mod 2 Steenrod algebra, milnor basis sage: sage.algebras.steenrod.steenrod_algebra.SteenrodAlgebra_generic(5) mod 5 Steenrod algebra, milnor basis sage: sage.algebras.steenrod.steenrod_algebra.SteenrodAlgebra_generic(5, 'adem') mod 5 Steenrod algebra, serre-cartan basis
-
sage.algebras.steenrod.steenrod_algebra.
SteenrodAlgebra_mod_two
¶ The mod 2 Steenrod algebra.
Users should not call this, but use the function
SteenrodAlgebra()
instead. See that function for extensive documentation. (This differs fromSteenrodAlgebra_generic
only in that it has a methodSq()
for defining elements.)