Steenrod代数模

让我们 p 做一个质数。该模式 p Steenrod代数 A 是连通代数吗? GF{p} 、的有限域 p 元素。此处提供的所有模块都将在 A 或者它的一个子Hopf代数。例如::

sage: A = SteenrodAlgebra(p=2)

模块类的构造函数将有序的度数组和定义模块的代数作为参数,以及一组可选的关系:

sage: from sage.modules.fp_graded.steenrod.module import SteenrodFPModule
sage: F = SteenrodFPModule(A, [0, 1, 7]); F
Free graded left module on 3 generators over mod 2 Steenrod algebra, milnor basis

的模生成子。 A -模块 M 通过 g_{d_1}, ldots, g_{d_N} ,其中下标表示它们的学位。齐次度关系 n 有这样一种形式

\[\sum_{i=1}^N a_i\cdot g_{d_i}=0,\]

where the homogeneous coefficients a_1, ldots, a_N lie in A, such that deg(a_i) + deg(g_{d_i}) = n for i = 1, ldots, N. To create a module with relations, the coefficients for each relation is given:

sage: r1 = [Sq(8), Sq(7), 0]   # First relation
sage: r2 = [Sq(7), 0, 1]       # Second relation
sage: M = SteenrodFPModule(A, [0, 1, 7], relations=[r1, r2]); M
Finitely presented left module on 3 generators and 2 relations
 over mod 2 Steenrod algebra, milnor basis

生成的模块将有三个生成器,这些生成器的度数为:

sage: M.generator_degrees()
(0, 1, 7)

连通分次代数上的模的连通度是它的所有模生成元的最小次数。因此,如果模块不是平凡的,则连通性是一个整数::

sage: M.connectivity()
0

每个模定义在Steenrod代数或它的某个子Hopf代数上,由它的基环给出:

sage: M.base_ring()
mod 2 Steenrod algebra, milnor basis
sage: SteenrodFPModule(SteenrodAlgebra(p=2,profile=(3,2,1)), [0]).base_ring()
sub-Hopf algebra of mod 2 Steenrod algebra, milnor basis, profile function
[3, 2, 1]

备注

叫唤 algebra() 不会返回所需的代数。用户应使用 base_ring() 方法。

模块元素

模块元素以生成器的形式显示,缺省情况下称为生成器 g[degree] **

sage: M.an_element(n=5)
Sq(2,1)*g[0] + Sq(4)*g[1]

sage: e = M.an_element(n=15); e
Sq(0,0,0,1)*g[0] + Sq(1,2,1)*g[1] + Sq(8)*g[7]
sage: e.dense_coefficient_list()
[Sq(0,0,0,1), Sq(1,2,1), Sq(8)]

生成器本身是模块的元素::

sage: gens = M.generators(); gens
(g[0], g[1], g[7])
sage: gens[0] in M
True

可以从给定的一组代数系数中产生一个元素:

sage: coeffs = [Sq(15), Sq(10)*Sq(1,1), Sq(8)]
sage: x = M(coeffs); x
Sq(15)*g[0] + (Sq(4,1,1)+Sq(7,0,1)+Sq(11,1))*g[1] + Sq(8)*g[7]

模块操作生成新元素::

sage: Sq(2) * x
Sq(14,1)*g[0] + (Sq(7,1)+Sq(10))*g[7]

每个非零的齐次元素都有一个明确定义的度:

sage: x.degree()
15

但零元素不是::

sage: zero = M.zero(); zero
0
sage: zero.degree()
Traceback (most recent call last):
...
ValueError: the zero element does not have a well-defined degree

在这一点上,需要指出的是,在创建元素时,元素不会减少到最小表示形式。但是,可以强制执行标准化:

sage: g7 = M([0, 0, 1]); g7
g[7]
sage: g7.normalize()
Sq(7)*g[0]
sage: g7 == g7.normalize()
True

sage: m = M([Sq(7), 0, 0])
sage: s = m + g7; s         # m and g7 are related by m = Sq(7)*g[0] = g[7],
Sq(7)*g[0] + g[7]
sage: s == 0                # so their sum should zero.
True
sage: s.normalize()         # Its normalized form is more revealing.
0

对于每个整数 n ,次数为模元素的集合 n 在地面上形成一个向量空间 GF{p} 。该向量空间的基可计算如下:

sage: M.basis_elements(7)
(Sq(0,0,1)*g[0],
 Sq(1,2)*g[0],
 Sq(4,1)*g[0],
 Sq(7)*g[0],
 Sq(0,2)*g[1],
 Sq(3,1)*g[1],
 Sq(6)*g[1])

请注意,第三台发电机 g_7 在上面的基础上,7度显然是缺失的。这是因为这一关系 operatorname{Sq}^7(g_0) = g_7

可以产生向量空间演示:

sage: M.vector_presentation(5)
Vector space quotient V/W of dimension 4 over Finite Field of size 2 where
V: Vector space of dimension 4 over Finite Field of size 2
W: Vector space of degree 4 and dimension 0 over Finite Field of size 2
   Basis matrix:
   []

给定任何元素,可以计算其相对于该基数的坐标:

sage: x = M.an_element(7); x
Sq(0,0,1)*g[0] + Sq(3,1)*g[1] + g[7]
sage: v = x.vector_presentation(); v
(1, 0, 0, 1, 0, 1, 0)

反过来,任何元素都可以通过指定其坐标来构造:

sage: x_ = M.element_from_coordinates((1, 0, 0, 1, 0, 1, 0), 7)
sage: x_
(Sq(0,0,1)+Sq(7))*g[0] + Sq(3,1)*g[1]
sage: x_ == x
True

模同态

的同态 A -模块 Mto N 是其底层的线性地图 GF{p} -向量空间,它与 A --模块结构。同态要求是齐次的,但不必是零度。

要创建同态,首先使用函数创建对所有此类同态的集合进行建模的对象 Hom **

sage: Hko = SteenrodFPModule(A, [0], [[Sq(2)], [Sq(1)]])
sage: homspace = Hom(Hko, Hko); homspace
Set of Morphisms
 from Finitely presented left module on 1 generator and 2 relations
      over mod 2 Steenrod algebra, milnor basis
   to Finitely presented left module on 1 generator and 2 relations
      over mod 2 Steenrod algebra, milnor basis
   in Category of finitely presented graded modules
      over mod 2 Steenrod algebra, milnor basis

就像模元素一样,同态是使用同空间创建的。唯一的参数是上域中的元素列表,它给出域的模生成器的图像::

sage: gen = Hko.generator(0)  # the generator of the codomain module
sage: values = [Sq(0, 0, 1) * gen]; values
[Sq(0,0,1)*g[0]]
sage: f = homspace(values)

所产生的同态是将 i -域的第TH生成器到 i -给定的第4个协域值::

sage: f
Module endomorphism of Finitely presented left module on 1 generator
 and 2 relations over mod 2 Steenrod algebra, milnor basis
  Defn: g[0] |--> Sq(0,0,1)*g[0]

同态可以在域模块的元素上求值::

sage: v1 = f(Sq(4)*gen); v1
Sq(4,0,1)*g[0]

sage: v2 = f(Sq(2)*Sq(4)*gen); v2
(Sq(3,1,1)+Sq(6,0,1))*g[0]

并且他们尊重模块操作::

sage: f(Sq(4)*gen) == Sq(4)*f(gen)
True

sage: f(Sq(2)*Sq(4)*gen) == Sq(2)*Sq(4)*f(gen)
True

创建平凡的态射有一些方便的方法:

sage: x = Sq(4)*Sq(7)*gen
sage: x == 0
False
sage: zero_map = homspace.zero(); zero_map
Module endomorphism of Finitely presented left module on 1 generator
 and 2 relations over mod 2 Steenrod algebra, milnor basis
  Defn: g[0] |--> 0
sage: zero_map(x)
0
sage: zero_map(x).is_zero()
True

以及单位自同态::

sage: one = Hom(Hko, Hko).identity(); one
Module endomorphism of Finitely presented left module on 1 generator
 and 2 relations over mod 2 Steenrod algebra, milnor basis
  Defn: g[0] |--> g[0]
sage: one.is_endomorphism()
True
sage: one(x) == x
True
sage: one.is_identity()
True

任何非平凡同态都有一个明确定义的度:

sage: f.degree()
7

但就像模元素一样,平凡同态不::

sage: zero_map = homspace.zero()
sage: zero_map.degree()
Traceback (most recent call last):
...
ValueError: the zero morphism does not have a well-defined degree

任何两个同态可以相加,只要它们具有相同的次数::

sage: f1 = homspace([Hko([Sq(0,0,3) + Sq(0,2,0,1)])])
sage: f2 = homspace([Hko([Sq(8,2,1)])])
sage: (f1 + f2).is_zero()
False
sage: f1 + f2
Module endomorphism of Finitely presented left module on 1 generator
 and 2 relations over mod 2 Steenrod algebra, milnor basis
  Defn: g[0] |--> (Sq(0,0,3)+Sq(0,2,0,1)+Sq(8,2,1))*g[0]

或当其中至少一个为零时::

sage: f + zero_map == f
True

但如果他们有不同的学位:

sage: F = SteenrodFPModule(A, [0])
sage: b4 = Hom(F, F)([Sq(4) * F.generator(0)])
sage: b8 = Hom(F, F)([Sq(8) * F.generator(0)])
sage: b4 + b8
Traceback (most recent call last):
...
ValueError: morphisms do not have the same degree

最后,存在加性逆数::

sage: (f - f) == 0
True

向量空间中同态的限制 n -维度模块元素是线性变换::

sage: f_21 = f.vector_presentation(21); f_21
Vector space morphism represented by the matrix:
[1 0 0 0 0 0]
[0 0 0 0 0 0]
[1 0 0 0 0 0]
Domain:   Vector space quotient V/W of dimension 3 over Finite Field of size 2 where
          V: Vector space of dimension 20 over Finite Field of size 2
          W: Vector space of degree 20 and dimension 17 over Finite Field of size 2
             Basis matrix:
             [1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0]
             [0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
             [0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0]
             [0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 1]
             [0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1]
             [0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 1 0 0 0 1]
             [0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 1]
             [0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 1 0 0 0 1]
             [0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0]
             [0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1]
             [0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0]
             [0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1]
             [0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 1]
             [0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 1]
             [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1]
             [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0]
             [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1]
Codomain: Vector space quotient V/W of dimension 6 over Finite Field of size 2 where
          V: Vector space of dimension 35 over Finite Field of size 2
          W: Vector space of degree 35 and dimension 29 over Finite Field of size 2
             Basis matrix:
             29 x 35 dense matrix over Finite Field of size 2

这与其域和共域模块的矢量表示形式兼容:

sage: f.domain() is Hko
True
sage: f.codomain() is Hko
True
sage: f_21.domain() is Hko.vector_presentation(21)
True
sage: f_21.codomain() is Hko.vector_presentation(21 + f.degree())
True

同态的前象中的元素可以找到::

sage: f.solve(Sq(2)*Sq(4)*Sq(7)*gen)
Sq(0,2)*g[0]

sage: f.solve(Sq(8)*gen) is None
True

同态可以按预期合成::

sage: g = homspace([Sq(0, 0, 0, 1)*gen]); g
Module endomorphism of Finitely presented left module on 1 generator
 and 2 relations over mod 2 Steenrod algebra, milnor basis
  Defn: g[0] |--> Sq(0,0,0,1)*g[0]

sage: g*f
Module endomorphism of Finitely presented left module on 1 generator
 and 2 relations over mod 2 Steenrod algebra, milnor basis
  Defn: g[0] |--> Sq(0,0,1,1)*g[0]

sage: one = homspace.identity()
sage: f*one == f
True

同调代数

上的模块类别 A 是阿贝尔的,所以核、像和核都是存在的,可以用 the morphisms

备注

像这样的态射的方法

  • kernel_inclusion()

  • cokernel_projection()

  • image()

  • homology()

计算与同态相关的子模和商模,但它们不返回模类的实例。相反,它们返回将这些模连接到产生它们的模的自然同态。

例如,函数 kernel_inclusion() 返回一个内射同态,它位于我们要求它计算的内核子模块上,而函数 cokernel_projection() 提供上核模上的满射同态。

在每种情况下,获取对模块实例的引用都需要调用 domain()codomain() 关于返回的同态,视情况而定。

有关具体细节,请参阅每个函数的文档。

焦核

在下面的示例中,我们定义了一个循环模块 HZZ 有两种关系:首先是显式的,然后是自由模的同态的余核。然后,我们构造一个同构的候选者,并检查它既是内射的又是满射的::

sage: HZ = SteenrodFPModule(A, [0], [[Sq(1)]]); HZ
Finitely presented left module on 1 generator and 1 relation
 over mod 2 Steenrod algebra, milnor basis

sage: F = SteenrodFPModule(A, [0])
sage: j = Hom(F, F)([Sq(1)*F.generator(0)])
sage: coker = j.cokernel_projection()  # the natural quotient homomorphism onto the cokernel.
sage: hz = coker.codomain(); hz
Finitely presented left module on 1 generator and 1 relation
 over mod 2 Steenrod algebra, milnor basis

sage: a = Hom(HZ, hz)([hz.generator(0)])
sage: a.is_injective()
True
sage: a.is_surjective()
True

内核

在计算同态的核时 f ,其结果是到整环的内射同态 f **

sage: k = f.kernel_inclusion(); k
Module morphism:
  From: Finitely presented left module on 1 generator and 3 relations
        over mod 2 Steenrod algebra, milnor basis
  To:   Finitely presented left module on 1 generator and 2 relations
        over mod 2 Steenrod algebra, milnor basis
  Defn: g[7] |--> Sq(0,0,1)*g[0]
sage: k.codomain() == f.domain()
True
sage: k.is_injective()
True

sage: ker = k.domain()
sage: ker
Finitely presented left module on 1 generator and 3 relations
 over mod 2 Steenrod algebra, milnor basis

我们可以检查的内射图像 k 的核心是 f 通过展示出 f 因素包括 hcirc c ,在哪里 c 是到的余核的商映射 k ,以及 h 是内射的::

sage: K = k.codomain()        # We want to check that this really is the kernel of f.
sage: coker = k.cokernel_projection()    # coker is the natural map: Hko -> coker(f) with kernel K.
sage: h = Hom(coker.codomain(), Hko)(f.values())
sage: h*coker == f            # Is K contained in ker(f) ?
True
sage: h.is_injective()        # Is ker(f) contained in K ?
True

图片

方法 image() 行为类似,返回具有等于子模的图像的内射同态 operatorname{im}(f) **

sage: i = f.image(); i
Module morphism:
  From: Finitely presented left module on 1 generator and 3 relations
        over mod 2 Steenrod algebra, milnor basis
  To:   Finitely presented left module on 1 generator and 2 relations
        over mod 2 Steenrod algebra, milnor basis
  Defn: g[7] |--> Sq(0,0,1)*g[0]
sage: i.codomain() == f.codomain()
True
sage: i.is_injective()
True

我们可以检查的内射图像 i 是的形象 f 通过提升 f 完毕 i ,并表明升力是满足性的::

sage: f_ = f.lift(i); f_
Module morphism:
  From: Finitely presented left module on 1 generator and 2 relations
        over mod 2 Steenrod algebra, milnor basis
  To:   Finitely presented left module on 1 generator and 3 relations
        over mod 2 Steenrod algebra, milnor basis
  Defn: g[0] |--> g[7]
sage: i*f_ == f             # Is im(i) contained in im(f) ?
True
sage: f_.is_surjective()    # Is im(f) contained in im(i) ?
True

When a pair of composable homomorphisms gcirc f: Mto Nto L satisfy the condition gcirc f = 0, the sub-quotient ker(g) / operatorname{im}(f) can be computed and is given by the natural quotient homomorphism with domain ker(g):

sage: f * f == 0        # Does the kernel of f contain the image of f ?
True
sage: K = f.kernel_inclusion()    # k: ker(f) -> Hko
sage: h = f.homology(f) # h: ker(f) -> ker(f) / im(f)
sage: h.codomain()      # This is the homology module.
Finitely presented left module on 1 generator and 4 relations
 over mod 2 Steenrod algebra, milnor basis

自由解决方案

最后,可以计算自由分辨率。这些计算通常需要一些时间才能完成,因此提高详细标志以输出进度信息通常是个好主意。

以下示例摘自 Michael Catanzaro's thesis 此软件的第一个版本出现的位置::

sage: res = Hko.resolution(6, verbose=True)
Computing f_1 (1/6)
Computing f_2 (2/6)
Computing using the profile:
(2, 1)
Resolving the kernel in the range of dimensions [1, 8]: 1 2 3 4 5 6 7 8.
Computing f_3 (3/6)
Computing using the profile:
(2, 1)
Resolving the kernel in the range of dimensions [2, 10]: 2 3 4 5 6 7 8 9 10.
Computing f_4 (4/6)
Computing using the profile:
(2, 1)
Resolving the kernel in the range of dimensions [3, 13]: 3 4 5 6 7 8 9 10 11 12 13.
Computing f_5 (5/6)
Computing using the profile:
(2, 1)
Resolving the kernel in the range of dimensions [4, 18]: 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18.
Computing f_6 (6/6)
Computing using the profile:
(2, 1)
Resolving the kernel in the range of dimensions [5, 20]: 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20.

计算结果是分辨率中所有贴图的列表::

sage: [f.domain() for f in res]
[Free graded left module on 1 generator over mod 2 Steenrod algebra, milnor basis,
 Free graded left module on 2 generators over mod 2 Steenrod algebra, milnor basis,
 Free graded left module on 2 generators over mod 2 Steenrod algebra, milnor basis,
 Free graded left module on 2 generators over mod 2 Steenrod algebra, milnor basis,
 Free graded left module on 3 generators over mod 2 Steenrod algebra, milnor basis,
 Free graded left module on 4 generators over mod 2 Steenrod algebra, milnor basis,
 Free graded left module on 4 generators over mod 2 Steenrod algebra, milnor basis]

sage: def is_complex(res):
....:     for i in range(len(res)-1):
....:         f = (res[i]*res[i+1])
....:         if not f.is_zero():
....:             return False
....:     return True
....:
sage: is_complex(res)
True

sage: def is_exact(res):
....:     for i in range(len(res)-1):
....:         h = res[i].homology(res[i+1])
....:         if not h.codomain().is_trivial():
....:             return False
....:     return True

sage: is_exact(res)
True

sage: [r.codomain().generator_degrees() for r in res]
[(0,), (0,), (2, 1), (2, 4), (3, 7), (4, 8, 12), (5, 9, 13, 14)]

sage: [r.values() for r in res]
[(g[0],),
 (Sq(2)*g[0], Sq(1)*g[0]),
 (Sq(1)*g[1], Sq(3)*g[1] + Sq(2)*g[2]),
 (Sq(1)*g[2], Sq(2,1)*g[2] + Sq(3)*g[4]),
 (Sq(1)*g[3], Sq(2,1)*g[3] + Sq(1)*g[7], Sq(2,1)*g[7]),
 (Sq(1)*g[4],
  Sq(2,1)*g[4] + Sq(1)*g[8],
  Sq(2,1)*g[8] + Sq(1)*g[12],
  Sq(2)*g[12]),
 (Sq(1)*g[5],
  Sq(2,1)*g[5] + Sq(1)*g[9],
  Sq(2,1)*g[9] + Sq(1)*g[13],
  Sq(0,1)*g[13] + Sq(2)*g[14])]

示例:计算电梯数量

在这个更详细的例子中,我们展示了如何找到特定同态的所有可能的提升。我们将通过两种方式来实现这一点,作为有效性的检查,我们将在最后比较结果。

我们将使用mod 2 Steenrod代数上的下列模 A

\begin{align} H\ZZ &= A/A\cdot \operatorname{Sq}(1)\\ Hko &= A/A\cdot \{\operatorname{Sq}(2), \operatorname{Sq}(1)\} \,. \end{align}

There is a natural projection q: HZZto Hko, and a non-trivial endomorphism of degree 28, represented as a degree zero map f: Sigma^{28}Hkoto Hko that we define below.

我们要解决的问题是找到所有可能的同态 f': Sigma^{28}Hkoto HZZ ,将下图制作成通勤三角形:

\[H\ZZ\xrightarrow{q} Hko \xleftarrow{f} \Sigma^{28} Hko.\]

我们从定义模和同态开始 fq 。在以下内容中,我们让 L = Sigma^{28}Hko **

sage: from sage.modules.fp_graded.steenrod.module import SteenrodFPModule
sage: A = SteenrodAlgebra(2)
sage: Hko = SteenrodFPModule(A, [0], [[Sq(2)],[Sq(1)]])
sage: HZ = SteenrodFPModule(A, [0], [[Sq(1)]])
sage: L = Hko.suspension(28)

预测::

sage: q = Hom(HZ, Hko)([Hko.generator(0)])
sage: q
Module morphism:
  From: Finitely presented left module on 1 generator and 1 relation
        over mod 2 Steenrod algebra, milnor basis
  To:   Finitely presented left module on 1 generator and 2 relations
        over mod 2 Steenrod algebra, milnor basis
  Defn: g[0] |--> g[0]

要翻转的地图 q **

sage: f = Hom(L, Hko)([Sq(0,2,1,1)*Hko.generator(0)])
sage: f
Module morphism:
  From: Finitely presented left module on 1 generator and 2 relations
        over mod 2 Steenrod algebra, milnor basis
  To:   Finitely presented left module on 1 generator and 2 relations
        over mod 2 Steenrod algebra, milnor basis
  Defn: g[28] |--> Sq(0,2,1,1)*g[0]

sage: f.is_zero()   # f is non-trivial.
False

我们将用两种方法计算不同电梯的数量。首先,我们将简单地计算所有可能地图的向量空间 L to HZZ ,然后检查其中哪些成为 f 当与 q **

sage: basis = Hom(L, HZ).basis_elements(0)   # The basis for the vector space of degree 0 maps L -> HZ

sage: from itertools import product
sage: def from_coords(c):
....:     '''
....:     Create a linear combination of the three basis homomorphisms.
....:     '''
....:     return c[0]*basis[0] + c[1]*basis[1] + c[2]*basis[2]

sage: for coords in product([0,1], repeat=3):
....:     print('%s: %s' % (coords, q*from_coords(coords) == f))
(0, 0, 0): False
(0, 0, 1): False
(0, 1, 0): True
(0, 1, 1): True
(1, 0, 0): True
(1, 0, 1): True
(1, 1, 0): False
(1, 1, 1): False

由此我们得出结论,八分之四的不同同态 L to HZZ 是升降机 f **

sage: lifts = [from_coords((0,1,0)),
....:          from_coords((0,1,1)),
....:          from_coords((1,0,0)),
....:          from_coords((1,0,1))]
sage: lifts
[Module morphism:
   From: Finitely presented left module on 1 generator and 2 relations over mod 2 Steenrod algebra, milnor basis
   To:   Finitely presented left module on 1 generator and 1 relation over mod 2 Steenrod algebra, milnor basis
   Defn: g[28] |--> Sq(6,5,1)*g[0],
 Module morphism:
   From: Finitely presented left module on 1 generator and 2 relations over mod 2 Steenrod algebra, milnor basis
   To:   Finitely presented left module on 1 generator and 1 relation over mod 2 Steenrod algebra, milnor basis
   Defn: g[28] |--> (Sq(6,5,1)+Sq(18,1,1))*g[0],
 Module morphism:
   From: Finitely presented left module on 1 generator and 2 relations over mod 2 Steenrod algebra, milnor basis
   To:   Finitely presented left module on 1 generator and 1 relation over mod 2 Steenrod algebra, milnor basis
   Defn: g[28] |--> Sq(10,1,0,1)*g[0],
 Module morphism:
   From: Finitely presented left module on 1 generator and 2 relations over mod 2 Steenrod algebra, milnor basis
   To:   Finitely presented left module on 1 generator and 1 relation over mod 2 Steenrod algebra, milnor basis
   Defn: g[28] |--> (Sq(10,1,0,1)+Sq(18,1,1))*g[0]]

或者,我们可以使用函子的左正确度 operatorname{Hom}_A(L, -) 列举所有可能的托举 f 。从找到一个单独的电梯开始 f 在投影之上 q **

sage: fl = f.lift(q); fl
Module morphism:
  From: Finitely presented left module on 1 generator and 2 relations
        over mod 2 Steenrod algebra, milnor basis
  To:   Finitely presented left module on 1 generator and 1 relation
        over mod 2 Steenrod algebra, milnor basis
  Defn: g[28] |--> (Sq(4,3,0,1)+Sq(6,0,1,1)+Sq(7,2,0,1)+Sq(10,1,0,1))*g[0]

我们证实了 fl 确实是一架电梯::

sage: q * fl == f
True

有一个完全相同的序列

\[0 \to \operatorname{Hom}_A(L, \ker(q)) \xrightarrow{iK_*} \operatorname{Hom}_A(L, H\ZZ) \xrightarrow{q_*} \operatorname{Hom}_A(L, Hko),\]

which means that the indeterminacy of choosing a lift for f in operatorname{Hom}_A(L, Hko) is represented by an element in operatorname{Hom}_A(L,ker(q)). Therefore, we can proceed to count the number of lifts by computing this vector space of homomorphisms:

sage: iK = q.kernel_inclusion()
sage: K = iK.domain()
sage: K.generator_degrees()
(2,)
sage: K.relations()
(Sq(2)*g[2],)
sage: ind = Hom(L, K).basis_elements(0); len(ind)
2

So now we know that the vector space of indeterminacies is 2-dimensional over the field of two elements. This means that there are four distinct lifts of f over q, and we can construct these by taking the one lift we already found, and add to it all the different elements in the image of iK_*:

sage: flift = [fl,
....:          fl + iK * ind[0],
....:          fl + iK * ind[1],
....:          fl + iK * (ind[0] + ind[1])]
sage: flift
[Module morphism:
   From: Finitely presented left module on 1 generator and 2 relations over mod 2 Steenrod algebra, milnor basis
   To:   Finitely presented left module on 1 generator and 1 relation over mod 2 Steenrod algebra, milnor basis
   Defn: g[28] |--> (Sq(4,3,0,1)+Sq(6,0,1,1)+Sq(7,2,0,1)+Sq(10,1,0,1))*g[0],
 Module morphism:
   From: Finitely presented left module on 1 generator and 2 relations over mod 2 Steenrod algebra, milnor basis
   To:   Finitely presented left module on 1 generator and 1 relation over mod 2 Steenrod algebra, milnor basis
   Defn: g[28] |--> (Sq(0,7,1)+Sq(3,6,1)+Sq(4,1,3)+Sq(6,0,1,1)+Sq(6,5,1)+Sq(7,0,3))*g[0],
 Module morphism:
   From: Finitely presented left module on 1 generator and 2 relations over mod 2 Steenrod algebra, milnor basis
   To:   Finitely presented left module on 1 generator and 1 relation over mod 2 Steenrod algebra, milnor basis
   Defn: g[28] |--> (Sq(4,3,0,1)+Sq(6,0,1,1)+Sq(7,2,0,1)+Sq(10,1,0,1)+Sq(12,3,1)+Sq(15,2,1)+Sq(18,1,1))*g[0],
 Module morphism:
   From: Finitely presented left module on 1 generator and 2 relations over mod 2 Steenrod algebra, milnor basis
   To:   Finitely presented left module on 1 generator and 1 relation over mod 2 Steenrod algebra, milnor basis
   Defn: g[28] |--> (Sq(0,7,1)+Sq(3,6,1)+Sq(4,1,3)+Sq(6,0,1,1)+Sq(6,5,1)+Sq(7,0,3)+Sq(12,3,1)+Sq(15,2,1)+Sq(18,1,1))*g[0]]

作为正确性的测试,我们现在比较这两组托举。从目前的情况来看,这些名单并不明显 fliftlifts 是相同的(直到列表元素的重新排序),因此下面的比较令人放心:

sage: flift[0] == lifts[2]
True
sage: flift[1] == lifts[0]
True
sage: flift[2] == lifts[3]
True
sage: flift[3] == lifts[1]
True