参考讲义:代数拓扑从曲面分类到同调算法

自动关联目录:代数拓扑:从曲面分类到同调算法

本页是集中复习用的长篇参考,不是零基础入口。第一次学习请从 模块 1:曲面拓扑短课 开始;该模块已将本页拆成 11 个单概念页面。

本章目标

拓扑研究连续形变下不变的性质。共形几何还会研究角度、度量和曲率,但在此之前必须先回答:曲面有几个连通分支?有没有边界?有多少个洞?一条闭曲线能不能缩成一点?

本章学完后,你应当能够:

  1. 用图册的语言定义二维流形与带边界流形;
  2. 用基本群区分圆盘、圆柱、球面和环面;
  3. 从三角网格组装链复形C2→∂2C1→∂1C0C_2\xrightarrow{\partial_2}C_1\xrightarrow{\partial_1}C_0;
  4. 计算 Betti 数β0,β1,β2\beta_0,\beta_1,\beta_2;
  5. 用 Euler–Poincaré 公式检查网格拓扑;
  6. 理解为什么高亏格曲面参数化前必须切出同调基或基本群生成元。

1. 拓扑空间与连续映射

1.1 为什么不能只依赖三维坐标

同一个抽象曲面可以有完全不同的三维形状。橡皮圆环可以被挤压、拉长,但只要不撕裂、不粘合,它仍然是一个环面。拓扑结构只记录“哪些点彼此邻近”,不记录边长和角度。

严格地说,一个拓扑空间是集合XX 加上一族开集T\mathcal T,满足:

  1. ∅,X∈T\varnothing,X\in\mathcal T;
  2. 任意多个开集的并仍是开集;
  3. 有限多个开集的交仍是开集。

连续映射f:X→Yf:X\to Y 的定义是:YY 中每个开集UU 的原像f−1(U)f^{-1}(U) 在XX 中也是开集。

这个定义看起来抽象,却比“画出来没有跳跃”更可靠,因为曲面可能没有全局坐标,也可能嵌入高维空间。

1.2 同胚与拓扑不变量

若连续双射f:X→Yf:X\to Y 的逆映射也连续,则ff 是同胚,记为X≅YX\cong Y。同胚保持:

  • 连通分支数;
  • 边界分支数;
  • 可定向性;
  • 亏格;
  • 基本群与同调群。

它不保持长度、面积、角度或曲率。因此:圆盘与任意单连通平面区域同胚,但一般不等距。

2. 流形、坐标图与图册

2.1 二维流形

一个 Hausdorff、第二可数的拓扑空间MM 称为二维拓扑流形,如果每个点p∈Mp\in M 都有邻域UU 与R2\mathbb R^2 的一个开集VV 同胚:

φ:U→V⊂R2.\varphi:U\to V\subset\mathbb R^2.

(U,φ)(U,\varphi) 称为坐标图,多个坐标图覆盖MM 就得到图册。

flowchart LR
    U[曲面上的邻域 U] -->|坐标图 phi| V[平面开集 V]
    W[另一邻域 W] -->|坐标图 psi| Z[平面开集 Z]
    V -->|过渡函数 psi o phi^-1| Z

若过渡函数ψ∘φ−1\psi\circ\varphi^{-1} 都是C∞C^\infty,图册定义了光滑结构,MM 就是光滑流形。之后的切向量、微分形式和曲率都依赖这个光滑结构。

2.2 带边界流形

边界点的邻域不像完整圆盘,而像半平面

H2={(x,y)∈R2:y≥0}.\mathbb H^2=\{(x,y)\in\mathbb R^2:y\ge0\}.

能映到y=0y=0 的点组成∂M\partial M。对三角网格:

  • 内部边邻接两个三角形;
  • 边界边只邻接一个三角形;
  • 闭曲面没有边界边。

2.3 可定向性

若能连续地为整张曲面选择法向方向,曲面可定向。等价地,可以让所有三角形朝向一致:共享边在两个相邻面中的方向相反。

球面、环面可定向;Möbius 带和 Klein 瓶不可定向。本专题主要讨论紧致、连通、可定向曲面,因为复结构和黎曼面理论天然携带定向。

3. 商空间:从多边形制造曲面

把正方形相对边识别,可以构造圆柱或环面。商空间写成X/∼X/{\sim},其中等价关系∼\sim 指定哪些点被视为同一点。

边识别得到的空间
左右边同向粘合圆柱
左右边反向粘合Möbius 带
左右、上下都同向粘合环面
适当反向粘合Klein 瓶

环面可写成

T2=R2/Λ,Λ={mω1+nω2:m,n∈Z}.T^2=\mathbb R^2/\Lambda, \qquad \Lambda=\{m\omega_1+n\omega_2:m,n\in\mathbb Z\}.

这不仅是拓扑构造,也是之后“周期参数域”的来源:平面上的函数满足f(z+ωi)=f(z)f(z+\omega_i)=f(z),便可下降为环面上的函数。

4. 同伦与基本群

4.1 路径和闭路

路径是连续映射γ:[0,1]→M\gamma:[0,1]\to M。若γ(0)=γ(1)=p\gamma(0)=\gamma(1)=p,它是以pp 为基点的闭路。

两条路径γ0,γ1\gamma_0,\gamma_1 同伦,是指存在连续映射

H:[0,1]×[0,1]→MH:[0,1]\times[0,1]\to M

使H(t,0)=γ0(t)H(t,0)=\gamma_0(t)、H(t,1)=γ1(t)H(t,1)=\gamma_1(t),并在端点固定的版本中保持H(0,s)=H(1,s)=pH(0,s)=H(1,s)=p。

直觉上,同伦允许曲线在曲面上连续滑动,但不能跨过洞或离开曲面。

4.2 基本群

所有以pp 为基点的闭路同伦类组成基本群

π1(M,p).\pi_1(M,p).

群运算是路径首尾拼接;单位元是常值路径;逆元是反向走原路径。

空间基本群解释
圆盘D2D^200任意闭路可缩成一点
球面S2S^200球面单连通
圆S1S^1Z\mathbb Z整数记录绕行次数
圆柱S1×[0,1]S^1\times[0,1]Z\mathbb Z绕轴方向不能缩掉
环面T2T^2Z⊕Z\mathbb Z\oplus\mathbb Z两个独立周期a,ba,b
亏格gg 闭曲面见下式有2g2g 个生成元和一个关系

亏格gg 的闭可定向曲面有表示

π1(Mg)=⟨a1,b1,…,ag,bg∣∏i=1g[ai,bi]=e⟩,\pi_1(M_g)= \left\langle a_1,b_1,\ldots,a_g,b_g \mid \prod_{i=1}^{g}[a_i,b_i]=e \right\rangle,

其中交换子[a,b]=aba−1b−1[a,b]=aba^{-1}b^{-1}。环面的情形g=1g=1 给出aba−1b−1=eaba^{-1}b^{-1}=e,即ab=baab=ba。

4.3 单连通与切缝

若MM 路径连通且π1(M)=0\pi_1(M)=0,称MM 单连通。平面参数化经常希望把曲面切成单连通域,因为:

  • 闭 1-形式在单连通域上可积分为单值函数;
  • 调和共轭不再受周期阻碍;
  • 局部参数可以拼成全局参数。

高亏格曲面上沿ai,bia_i,b_i 切开,会得到一个基本多边形。其边界词为

a1b1a1−1b1−1⋯agbgag−1bg−1.a_1b_1a_1^{-1}b_1^{-1}\cdots a_gb_ga_g^{-1}b_g^{-1}.

5. 覆盖空间与通用覆盖

5.1 定义

映射p:M~→Mp:\widetilde M\to M 是覆盖映射,如果每个x∈Mx\in M 有邻域UU,使得

p−1(U)=⨆αUα,p^{-1}(U)=\bigsqcup_{\alpha}U_\alpha,

且每个限制p∣Uα:Uα→Up|_{U_\alpha}:U_\alpha\to U 都是同胚。

例子:

p:R→S1,qquadp(t)=e2πit.p:\mathbb R\to S^1,qquad p(t)=e^{2\pi it}.

实线是圆的通用覆盖。圆上的绕行一次在实线上变成从tt 到t+1t+1 的路径;闭路的绕数转化为覆盖空间中的端点差。

5.2 路径提升

给定MM 上路径γ\gamma 和起点上方的一个点p~\tilde p,存在唯一提升路径γ~\tilde\gamma 满足

p∘γ~=γ,γ~(0)=p~.p\circ\tilde\gamma=\gamma, \qquad \tilde\gamma(0)=\tilde p.

闭路提升后是否仍闭合,编码了它的同伦类。通用覆盖M~\widetilde M单连通,其 deck transformation 群与π1(M)\pi_1(M) 同构。

这在共形几何中极其重要:

  • 球面型曲面的通用覆盖是S2S^2;
  • 平坦型曲面的通用覆盖是C\mathbb C;
  • 双曲型曲面的通用覆盖是单位圆盘D\mathbb D。

这已经预示了一致化定理的三种标准几何。

6. 单纯复形:把曲面变成有限组合对象

6.1 单纯形

kk-单纯形是k+1k+1 个仿射无关点的凸包:

  • 0-单纯形:顶点;
  • 1-单纯形:边;
  • 2-单纯形:三角形;
  • 3-单纯形:四面体。

单纯复形KK 是一组单纯形,满足:

  1. 每个单纯形的所有面仍在KK 中;
  2. 任意两个单纯形的交要么为空,要么是两者的共同面。

三角网格就是二维单纯复形的几何实现。

6.2 定向

有序顶点[v0,v1,…,vk][v_0,v_1,\ldots,v_k] 给出定向。交换两个顶点会反向:

[v1,v0]=−[v0,v1].[v_1,v_0]=-[v_0,v_1].

三角形[i,j,k][i,j,k] 的边界是

∂2[i,j,k]=[j,k]−[i,k]+[i,j].\partial_2[i,j,k]=[j,k]-[i,k]+[i,j].

边的边界是

∂1[i,j]=[j]−[i].\partial_1[i,j]=[j]-[i].

直接计算可得

∂1∂2[i,j,k]=0.\partial_1\partial_2[i,j,k]=0.

这就是“边界的边界为空”。它不是口号,而是整个同调理论成立的代数条件。

7. 链群、循环、边界和同调群

7.1 链复形

取系数域R\mathbb R 或Z2\mathbb Z_2。Ck(K)C_k(K) 是所有定向kk-单纯形的形式线性组合。边界算子组成

0⟶C2→∂2C1→∂1C0⟶0.0\longrightarrow C_2 \xrightarrow{\partial_2}C_1 \xrightarrow{\partial_1}C_0 \longrightarrow0.

由于∂k−1∂k=0\partial_{k-1}\partial_k=0,有

im⁡∂k+1⊆ker⁡∂k.\operatorname{im}\partial_{k+1} \subseteq \ker\partial_k.

定义:

Zk=ker⁡∂k(循环),Z_k=\ker\partial_k \quad\text{(循环)},

Bk=im⁡∂k+1(边界).B_k=\operatorname{im}\partial_{k+1}\quad\text{(边界)}.

同调群是

Hk(K)=Zk/Bk.H_k(K)=Z_k/B_k.

它把“闭合”但“不是更高维对象边界”的结构保留下来。

7.2 几何意义

  • H0H_0:连通分支;
  • H1H_1:独立的一维洞;
  • H2H_2:封闭的二维壳。

取域系数时,Betti 数为

βk=dim⁡Hk.\beta_k=\dim H_k.

对紧致连通可定向曲面:

曲面(β0,β1,β2)(\beta_0,\beta_1,\beta_2)
圆盘(1,0,0)(1,0,0)
圆柱(1,1,0)(1,1,0)
球面(1,0,1)(1,0,1)
环面(1,2,1)(1,2,1)
亏格gg 闭曲面(1,2g,1)(1,2g,1)

7.3 为什么同调比基本群容易计算

基本群通常非交换,而H1H_1 是其交换化:

H1(M;Z)≅π1(M)ab.H_1(M;\mathbb Z)\cong \pi_1(M)_{ab}.

同调只需线性代数:构造边界矩阵并求秩或零空间。代价是它忘掉了闭路的非交换拼接顺序。

8. 边界矩阵与 Betti 数算法

给定顶点、边、面编号,矩阵B1B_1 表示∂1:C1→C0\partial_1:C_1\to C_0,矩阵B2B_2 表示∂2:C2→C1\partial_2:C_2\to C_1。

对边e=[i,j]e=[i,j],B1B_1 的对应列在行ii 为−1-1、行jj 为+1+1。对面f=[i,j,k]f=[i,j,k],B2B_2 的对应列包含其三条有向边的系数。

维数公式给出

βk=dim⁡ker⁡Bk−rank⁡Bk+1.\beta_k=\dim\ker B_k-\operatorname{rank}B_{k+1}.

所以二维复形满足

β0=V−rank⁡B1,β1=E−rank⁡B1−rank⁡B2,β2=F−rank⁡B2.\begin{aligned} \beta_0&=V-\operatorname{rank}B_1,\\ \beta_1&=E-\operatorname{rank}B_1-\operatorname{rank}B_2,\\ \beta_2&=F-\operatorname{rank}B_2. \end{aligned}

8.1 一个单三角形

顶点(0,1,2)(0,1,2),边按e0=[0,1],e1=[1,2],e2=[0,2]e_0=[0,1],e_1=[1,2],e_2=[0,2] 定向,面f=[0,1,2]f=[0,1,2]。则

B1=[−10−11−10011],B2=[11−1].B_1= \begin{bmatrix} -1&0&-1\\ 1&-1&0\\ 0&1&1 \end{bmatrix}, \qquad B_2= \begin{bmatrix} 1\\1\\-1 \end{bmatrix}.

检查:

B1B2=0.B_1B_2=0.

rank⁡B1=2\operatorname{rank}B_1=2,rank⁡B2=1\operatorname{rank}B_2=1,所以

(β0,β1,β2)=(1,0,0),(\beta_0,\beta_1,\beta_2)=(1,0,0),

与圆盘一致。

8.2 Python 组装

import numpy as np
from scipy.sparse import coo_matrix


def oriented_edges(faces):
    edge_set = set()
    for i, j, k in faces:
        edge_set.update({tuple(sorted((i, j))),
                         tuple(sorted((j, k))),
                         tuple(sorted((k, i)))})
    edges = sorted(edge_set)
    return edges, {edge: idx for idx, edge in enumerate(edges)}


def boundary_matrices(vertex_count, faces):
    edges, edge_id = oriented_edges(faces)

    # B1: C1 -> C0,每条全局边按小编号到大编号定向。
    rows1, cols1, vals1 = [], [], []
    for col, (i, j) in enumerate(edges):
        rows1 += [i, j]
        cols1 += [col, col]
        vals1 += [-1.0, 1.0]
    B1 = coo_matrix(
        (vals1, (rows1, cols1)),
        shape=(vertex_count, len(edges)),
    ).tocsr()

    # B2: C2 -> C1。局部边 [i,j],[j,k],[k,i] 与全局方向比较符号。
    rows2, cols2, vals2 = [], [], []
    for face_id, (i, j, k) in enumerate(faces):
        for a, b in [(i, j), (j, k), (k, i)]:
            edge = tuple(sorted((a, b)))
            sign = 1.0 if (a, b) == edge else -1.0
            rows2.append(edge_id[edge])
            cols2.append(face_id)
            vals2.append(sign)
    B2 = coo_matrix(
        (vals2, (rows2, cols2)),
        shape=(len(edges), len(faces)),
    ).tocsr()
    return edges, B1, B2


def betti_numbers(vertex_count, faces, tol=1e-10):
    edges, B1, B2 = boundary_matrices(vertex_count, faces)
    rank1 = np.linalg.matrix_rank(B1.toarray(), tol=tol)
    rank2 = np.linalg.matrix_rank(B2.toarray(), tol=tol)
    return (
        vertex_count - rank1,
        len(edges) - rank1 - rank2,
        len(faces) - rank2,
    )

这段实现为了教学把稀疏矩阵转为稠密矩阵求秩,只适用于小网格。大网格通常使用:

  • Z2\mathbb Z_2 上的稀疏消元;
  • Smith normal form(整数同调与挠元);
  • persistent homology 的列约化;
  • tree-cotree decomposition 构造曲面同调基。

9. Euler–Poincaré 公式

链复形的交错维数等于同调群的交错维数:

χ(K)=V−E+F=β0−β1+β2.\chi(K)=V-E+F=\beta_0-\beta_1+\beta_2.

9.1 证明思路

由秩-零化度定理

dim⁡Ck=dim⁡ker⁡∂k+dim⁡im⁡∂k.\dim C_k=\dim\ker\partial_k+\dim\operatorname{im}\partial_k.

而

βk=dim⁡ker⁡∂k−dim⁡im⁡∂k+1.\beta_k =\dim\ker\partial_k-\dim\operatorname{im}\partial_{k+1}.

对kk 交错求和,中间的像空间维数两两抵消,剩下

∑k(−1)kdim⁡Ck=∑k(−1)kβk.\sum_k(-1)^k\dim C_k =\sum_k(-1)^k\beta_k.

9.2 曲面分类公式

紧致、连通、可定向、亏格为gg、边界分支数为bb 的曲面满足

χ=2−2g−b.\chi=2-2g-b.

所以已知网格V,E,FV,E,F 和边界分支数bb,可解出

g=2−b−(V−E+F)2.g=\frac{2-b-(V-E+F)}{2}.

若右边不是非负整数,通常说明:

  • 网格非流形;
  • 面朝向或边计数错误;
  • 有多个连通分支但仍套用了连通公式;
  • 存在未清理的退化面或重复面。

10. 上同调:为什么要研究“沿边积分的量”

同调研究链;上同调研究作用在链上的线性函数。kk-上链属于

Ck=Hom⁡(Ck,R).C^k=\operatorname{Hom}(C_k,\mathbb R).

余边界算子δ:Ck→Ck+1\delta:C^k\to C^{k+1} 是边界算子的对偶:

(δω)(c)=ω(∂c).(\delta\omega)(c)=\omega(\partial c).

在矩阵表示下,如果Bk+1B_{k+1} 表示∂k+1\partial_{k+1},则普通内积下δ\delta 由Bk+1TB_{k+1}^T 表示。

一个离散 1-形式给每条有向边赋值ωij=−ωji\omega_{ij}=-\omega_{ji}。它可以表示:

  • 标量函数的差分fj−fif_j-f_i;
  • 速度场沿边的线积分;
  • 纹理坐标增量;
  • 环面参数域的周期。

若每个三角形边界上的和为 0,形式闭合:

ωij+ωjk+ωki=0.\omega_{ij}+\omega_{jk}+\omega_{ki}=0.

若存在顶点函数ff 使ωij=fj−fi\omega_{ij}=f_j-f_i,形式恰当。恰当一定闭合,但在有洞的曲面上闭合不一定恰当。商空间

H1=ker⁡δ1/im⁡δ0H^1=\ker\delta_1/\operatorname{im}\delta_0

正是“无法写成全局势函数梯度”的周期信息。

11. 与参数化算法的直接关系

11.1 圆盘

H1(D2)=0H^1(D^2)=0。任何闭 1-形式都是恰当的,可以积分得到单值函数。这使调和共轭和全局参数相对直接。

11.2 环面

dim⁡H1(T2)=2\dim H^1(T^2)=2。存在两条独立周期。一个闭 1-形式沿基本循环的积分可能非零,因此积分会在通用覆盖R2\mathbb R^2 上成为单值函数,但回到环面时只在模周期意义下单值。

11.3 高亏格曲面

亏格gg 的闭可定向曲面有

dim⁡H1=2g.\dim H^1=2g.

这解释了为什么需要2g2g 个调和 1-形式来构造全纯微分基,也解释了为什么高亏格参数化天然带有周期矩阵。

12. 网格拓扑预检代码

from collections import Counter, defaultdict, deque


def topology_report(vertex_count, faces):
    edge_count = Counter()
    adjacency = defaultdict(set)

    for i, j, k in faces:
        for a, b in [(i, j), (j, k), (k, i)]:
            edge = tuple(sorted((a, b)))
            edge_count[edge] += 1
            adjacency[a].add(b)
            adjacency[b].add(a)

    boundary_edges = [e for e, count in edge_count.items() if count == 1]
    non_manifold_edges = [e for e, count in edge_count.items() if count > 2]

    visited = set()
    components = 0
    for start in range(vertex_count):
        if start in visited:
            continue
        components += 1
        queue = deque([start])
        visited.add(start)
        while queue:
            i = queue.popleft()
            for j in adjacency[i]:
                if j not in visited:
                    visited.add(j)
                    queue.append(j)

    V, E, F = vertex_count, len(edge_count), len(faces)
    return {
        "V": V,
        "E": E,
        "F": F,
        "euler_characteristic": V - E + F,
        "connected_components": components,
        "boundary_edge_count": len(boundary_edges),
        "non_manifold_edges": non_manifold_edges,
    }

注意:只数边界边不能得到边界分支数bb。还要在边界子图上追踪连通环,并验证每个边界顶点的边界度为 2。

13. 定理、算法与假设的对应

理论结论算法用途必须检查的假设
曲面分类定理根据χ,b\chi,b 推断亏格紧致、连通、可定向、二维流形
∂2=0\partial^2=0验证边界矩阵和面朝向全局定向一致
H1≅π1abH_1\cong\pi_1^{ab}用线性代数找独立洞会丢失非交换信息
通用覆盖单连通在覆盖空间构造全局坐标需记录 deck transformation
Euler–Poincaré快速网格完整性检查单纯复形计数正确

14. 习题

计算题

  1. 用一个正方形加对角线构成圆盘网格,手写B1,B2B_1,B_2 并验证B1B2=0B_1B_2=0。
  2. 对四面体表面计算V−E+FV-E+F 和(β0,β1,β2)(\beta_0,\beta_1,\beta_2)。
  3. 一个连通可定向网格有V=120,E=360,F=238V=120,E=360,F=238,无边界。求亏格。
  4. 同一网格若有b=2b=2,检查这些数字是否可能对应流形。

证明题

  1. 证明同伦是路径集合上的等价关系。
  2. 用秩-零化度定理证明 Euler–Poincaré 公式。
  3. 解释为什么恰当 1-形式必然闭合,即d(df)=0d(df)=0。
  4. 证明树中的任意两个顶点之间只有一条简单路径,并说明这为何可用于选取切缝。

实现题

  1. 实现边界环提取,输出每条边界的顶点顺序。
  2. 在Z2\mathbb Z_2 上实现高斯消元,计算小网格的 Betti 数。
  3. 构造一个环面三角网格,验证(β0,β1,β2)=(1,2,1)(\beta_0,\beta_1,\beta_2)=(1,2,1)。
  4. 故意删除一个三角形,观察b,χ,βkb,\chi,\beta_k 如何变化。

15. 本章结论

这一章建立了后续计算共形几何的骨架:

曲面→三角剖分链复形→∂同调/上同调→选基切缝、周期与全局参数.\text{曲面} \xrightarrow{\text{三角剖分}} \text{链复形} \xrightarrow{\partial} \text{同调/上同调} \xrightarrow{\text{选基}} \text{切缝、周期与全局参数}.

下一篇将把链与上链升级为微分形式,并证明 Hodge 分解如何从每个上同调类中选出唯一的调和代表:微分拓扑与 Hodge 分解。