ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

半群、子群与商群:抽象代数核心概念链及代码验证

半群、子群与商群:抽象代数核心概念链及代码验证

半群、子群、商群这三个词摆在一起,很多人第一反应就是抽象、记不住、证不出来。我刚开始啃抽象代数那阵子也是这样:半群看完觉得"这不就是少了个单位元吗",子群能照着判定定理验,一到商群就彻底卡壳——为什么非要正规子群?陪集相乘到底哪里会出问题?后来写了不少有限群的验证代码,又把教材翻来覆去看了几遍,才慢慢把这条线打通:半群回答"最少需要什么条件才能谈结构",子群回答"结构内部能切出多大的自洽小块",商群回答"怎么把差别不大的东西粘成一类还不破坏运算"。这篇内容适合三类人看:正在学抽象代数、被证明题折磨的学生;需要用到群论工具做编码、密码、图形学、量子计算的工程人员;以及只想搞明白"这套抽象玩意儿到底在描述什么"的普通读者。我会按概念链、判定方法、构造过程、代码验证、踩坑记录的顺序展开,里面的代码都能直接跑,例子都能手算复核。

1. 先把概念地图铺开:从半群到群的这条链

1.1 为什么抽象代数要从"一个集合加一个运算"讲起

抽象代数最反直觉的地方,是它把数学对象里所有具体的东西都剥掉了,只留下两样:一个集合,一个二元运算。没有加法,没有乘法,没有大小,只有"两个元素进去,一个元素出来"这个动作。听起来贫瘠得可怜,但正是这种贫瘠让它变得万能——同一个定理,套在整数加法上成立,套在正方形旋转上成立,套在置换上、矩阵上、字符串拼接上也成立。

一旦只剩下集合和运算,马上就得回答三个问题:运算结果还在集合里吗(封闭性);运算的顺序会不会影响结果(结合律);有没有"什么都不做"的元素和"能抵消"的元素(单位元与逆元)。这三个问题层层递进,正好对应半群、幺半群、群三级结构。我建议大家在学习时把这条链当成一张"能力解锁表"来看:每加一条公理,就解锁一批新定理;反过来,一旦你想用的定理依赖某条公理,就必须先确认它成立。很多人证明卡住,不是不会推,而是用了没验证过的性质——比如在只有半群结构的地方擅自做"除以一个元素"的操作,那当然推不动。

这里有个很实用的思维习惯:看到一个代数结构,先问"它到底有几条公理",再问"我要用的结论需要几条公理"。两者对不上,证明就有漏洞。这个习惯比背定理本身重要得多。

1.2 半群、幺半群、群的三级跳

把三级结构的定义摊开对比,一眼就能看出各自缺什么:

结构封闭性结合律单位元逆元典型例子
半群要求要求不要求不要求正整数加法、字符串拼接、方阵乘法
幺半群要求要求要求不要求自然数加法、含空串的字符串集合、n阶方阵
群要求要求要求要求整数加法、非零有理数乘法、可逆矩阵、置换群

关键是理解每条公理"去掉之后会失去什么"。去掉单位元,你就没法谈"幂的零次方",也没法定义"元素的阶";去掉逆元,你就没法做消去,方程 ax=b 未必有解。反过来,加上逆元之后,一大堆结论才开始成立:消去律、逆元唯一、元素的阶整除群阶、拉格朗日定理、同态基本定理,全都建立在"每个元素都能被抵消"这个基础之上。

我特别想强调一点:结合律是最容易被忽略、却最不该被忽略的一条。它看起来最"无害",实际上承担了几乎所有"括号可以随便加"的推论。你写 a·b·c 时不加括号,靠的就是结合律。一旦运算不结合,连"三个元素相乘"这个概念都变得含糊。

1.3 几组必须手算一遍的经典例子

光看定义没用,抽象概念必须靠具体例子锚定。下面这几组我建议每个人都亲手验证一遍,五分钟的事,但对后面理解帮助极大:

  • (Z, +):整数加法,群。单位元 0,a 的逆是 -a。它的子群全是 nZ 形式,这一点后面讲子群时会用到。
  • (N, +):自然数加法,只到幺半群。有 0 做单位元,但 3 没有逆(-3 不在 N 里)。
  • (Z, ×):整数乘法,也是幺半群。单位元是 1,但 2 的逆 1/2 不在 Z 里。
  • (Q{0}, ×):非零有理数乘法,群。这里能看出"把不可逆的元素踢出去"是造群的标准手法。
  • n 阶实方阵 + 矩阵乘法:幺半群,不可逆矩阵让逆元公理失效;把范围缩到行列式非零的矩阵,就成了一般线性群,这是最有用的群之一。
  • 字符串集合 + 拼接:自由幺半群。空串是单位元,但"abc"没有逆,你没法把拼上去的字符删掉。
  • 集合 X 上全体映射 + 复合:幺半群;只取双射,就得到对称群,这是有限群理论的"万能母体"。

这张清单的价值在于:它告诉你"半群不是残缺的群,而是大量真实结构的自然状态"。矩阵半群、变换半群、自动机的状态转移半群,都是工程里真会碰到的东西,它们本来就不可逆,硬要凑成群反而不自然。

2. 半群:最朴素的代数结构,也是最容易被轻视的

2.1 结合律到底在管什么

结合律说的是 (a·b)·c = a·(b·c)。它管的事情非常具体:让你可以省略括号。三个元素相乘时不必纠结先算哪一对,四个、五个也一样。这个性质一旦成立,你才能定义"元素的 n 次幂"——a³ 到底是 (a·a)·a 还是 a·(a·a) 不用管,反正一样。

反过来,不结合的运算多得是。减法就不结合:(5-3)-1 = 1,而 5-(3-1) = 3。三维向量的叉积也不结合,这也是为什么叉积写出来必须带括号。实数上定义 a*b = (a+b)/2 也不结合,虽然它看起来很"正常"。这些反例提醒我们:结合律不是天上掉下来的,是必须验证的。

判断一个具体运算是否结合,标准手法是"两边展开对比",但更聪明的做法是把运算翻译成已知结合的操作。矩阵乘法结合,是因为它本质上对应线性映射的复合,而函数复合天然结合;置换乘法结合,同样是因为它就是双射的复合。能识别出"这个运算其实是某种复合",结合律就自动免费获得了。这个技巧在考试和实际建模里都极好用。

注意:验证封闭性时,别只看几个元素就下结论。有限集合可以逐个穷举,无限集合必须给出一般性论证。我见过有人用"1+1=2 还在集合里"来证明封闭,这是典型的以例代证。

2.2 半群的真实来源:不只是教材里的玩具

半群在纯数学里常被当成"群的预备知识",但它在计算机领域的存在感其实很强,只是换了个名字出现。

第一类是变换半群。一个集合 X 上所有映射在复合运算下构成半群,通常记为 T(X)。它不可逆,因为映射不一定是一一对应。程序里的状态机、数据结构里的映射表,本质上都在这个半群里活动。当你写 map、filter 这类操作时,如果函数不是双射,那这次变换就"丢失了信息",永远回不去——这正是"不可逆"的工程含义。

第二类是自由幺半群。给定一个字母表,所有有限长字符串在拼接运算下构成自由幺半群,空串是单位元。它是编译原理里词法分析的基础模型,也是所有序列处理的理论原型。所谓"自由",意思是这个结构里除了拼接规则之外没有任何额外约束,两个字符串相等当且仅当逐字符相同。

第三类是自动机的转移半群。一个有穷状态自动机,每个输入字符诱导一个状态到状态的映射,这些映射在复合下构成一个有限半群。研究这个半群的结构(有没有幂等元、有没有零元、理想链怎么排),可以直接推出自动机的一些性质。这是形式语言理论里很实用的一条路,只是入门教材往往一笔带过。

2.3 幺半群里那几个"看起来显然"却必须证的结论

从半群升到幺半群,多了单位元,立刻能证出几条常用结论,它们的证明短但思路值得体会:

  • 单位元唯一。假设 e 和 e' 都是单位元,则 e = e·e' = e'。两步搞定,用的全是单位元定义。
  • 可逆元素的逆唯一。若 a·b = e 且 a·c = e,则 b = b·e = b·(a·c) = (b·a)·c = e·c = c。注意中间用了结合律,这就是"为什么半群阶段证不了"。
  • 逆的乘积反序。(a·b)⁻¹ = b⁻¹·a⁻¹。这个反序规则和矩阵求逆、函数求逆完全一致,因为它们本来就是同一件事。

这几条结论的重要性在于:它们保证了"逆"是一个良好定义的一元运算,你才可以放心地写 a⁻¹ 而不担心指代不明。很多人做题时直接拿逆的唯一性来用,其实背后是有证明支撑的。

提示:在幺半群里,"a 可逆"和"a 有逆元"是一回事,但"a 有左逆"和"a 有右逆"不是一回事。有限幺半群里左逆右逆会互相推出,无限情形下会翻车,这个坑在函数复合半群里能构造出反例。

3. 子群:怎么从一个大群里切出一个小群

3.1 判定子群的三种打法,各有各的适用场景

设 H 是群 G 的非空子集,要证 H 是子群,常见三条路:

三步法:验证单位元在 H 里、对乘法封闭、对取逆封闭。最笨但最稳,适合初学者和教学场景。缺点是每次都要单独验单位元,写起来啰嗦。

两步法:验证非空、对乘法封闭、对取逆封闭。省掉单位元那一步,因为非空加上取逆封闭,任取 a∈H 就有 a⁻¹∈H,再由乘法封闭得 a·a⁻¹ = e ∈ H。这一步推导很值得记,它体现了"公理之间可以互相导出"的思想。

一步法:验证 H 非空,且对任意 a, b ∈ H 有 a·b⁻¹ ∈ H。这是最精简的判据,一步到位。它同时打包了乘法和逆:取 b = a 得 e ∈ H;取 a = e 得 b⁻¹ ∈ H;再取 b 换成 b⁻¹ 就得到 a·b。

我自己做题的习惯是:如果 H 是显式给出的元素集合,用一步法最快;如果 H 是某种"满足某条件的元素全体",用两步法更自然,因为封闭性往往能从条件直接推出。比如"所有行列式为 1 的实矩阵",验证 AB⁻¹ 的行列式仍为 1 就是一行的事。

3.2 生成子群与元素的阶:最小的那个自洽块

给定群 G 和一个子集 S,包含 S 的最小子群叫由 S 生成的子群,记作 ⟨S⟩。它的元素就是 S 中元素及其逆的所有有限乘积。这个概念之所以重要,是因为它把"从几个种子长出一整个结构"这件事形式化了。

如果 S 只有一个元素 a,得到的就是循环子群⟨a⟩ = {aⁿ : n ∈ Z}。元素 a 的阶定义为使 aⁿ = e 成立的最小正整数 n;如果不存在这样的 n,就说是无限阶。有限群里每个元素都有有限阶,这一点由拉格朗日定理直接推出:⟨a⟩ 是子群,其阶等于 a 的阶,必须整除 |G|。

由此得到一条极其常用的推论:元素的阶整除群的阶。在 6 阶群里不可能出现 4 阶元,在 8 阶群里不可能出现 3 阶元。这条结论在做选择题、排除法判断子群阶数时特别好用。

3.3 陪集:把群切成大小相等的块

设 H ≤ G,取 a ∈ G,集合 aH = {a·h : h ∈ H} 称为 H 的一个左陪集,a 叫代表元。右陪集 Ha 同理。陪集有三个基本性质,理解它们商群就成功一半:

第一,任意两个左陪集要么相等,要么不交。因为若 aH ∩ bH 非空,存在公共元素 a·h₁ = b·h₂,于是 b = a·h₁·h₂⁻¹ ∈ aH,进而 bH ⊆ aH,对称地得到反向包含。

第二,所有左陪集大小相同,都等于 |H|。因为映射 h ↦ a·h 是双射。

第三,全体左陪集构成 G 的一个划分。每个元素 a 都属于 aH(因为 e ∈ H)。

三条合起来直接推出拉格朗日定理:|G| = |H| 乘以不同左陪集的个数。这个"个数"叫 H 在 G 中的指数,记作 [G:H]。推论很多,最常用的两条:子群的阶整除群的阶;指数为 2 的子群必然是正规子群(因为左陪集只有两个,补集只能是另一个,左右陪集必重合)。

注意:拉格朗日定理的逆命题不成立。|G| 有某个因数,不代表一定有对应阶的子群。最小的反例是 12 阶的交错群 A₄,它有 6 个元素,但没有 6 阶子群。这个反例在教材里通常放在习题,但考试很爱考。

3.4 正规子群:商群的门票

子群不一定"对称"。对 a ∈ G 和 h ∈ H,元素 a·h·a⁻¹ 未必落在 H 里。如果对任意 a ∈ G 都有 aHa⁻¹ ⊆ H,就称 H 是 G 的正规子群,记作 H ⊴ G。

几个等价的刻画必须记牢,因为做题时挑最好用的那条:

判定方式表达式什么时候最好用
共轭封闭任意 g, h,有 g·h·g⁻¹ ∈ H元素形式清楚,直接算
左右陪集相等任意 g,有 gH = Hg已经算出陪集,顺手判断
内自同构稳定gHg⁻¹ = H理论证明,构造同态时用

注意第三条写的是"包含"就够,不需要等式。因为 aHa⁻¹ ⊆ H 对全部 a 成立,把 a 换成 a⁻¹ 就得到反向包含。这个小技巧能省不少笔墨。

三个必须形成条件反射的结论:交换群的所有子群都正规(因为 g·h·g⁻¹ = h);指数为 2 的子群必正规;同态的核一定正规。前两个是快速判断工具,第三个是通往同构定理的桥梁。

反过来,非正规的例子也得记一个。3 次对称群 S₃(6 阶)里,取 H = {e, (1 2)}。这个 H 是 2 阶子群,指数 3。它不是正规的:取 a = (1 3),则 (1 3)(1 2)(1 3)⁻¹ = (2 3),而 (2 3) 不在 H 里。同样地,另外两个 2 阶子群 {e, (1 3)}、{e, (2 3)} 也都不正规。S₃ 里真正正规的子群只有三个:平凡子群、整个群、以及 3 阶的 A₃。

4. 商群:把差一点点一样的东西粘成一类

4.1 从等价关系到商集,再到商群的三层结构

商群的构造拆开看是三步,每一步都有明确目的:

第一步,用子群 H 在 G 上定义等价关系:a ~ b 当且仅当 a⁻¹b ∈ H,等价类恰好是左陪集。这一步把"相差一个 H 中元素"视为"同一种东西"。

第二步,把等价类收集起来得到商集 G/H,元素是陪集而不是原群元素。这是最容易出错的地方——商群的元素是集合,不是元素。很多人第一次写 Z/6Z 的加法表时,会把 [1]+[5] 写成 6,正确写法是 [0]。

第三步,在商集上定义运算 [a]·[b] = [a·b],然后证明这个定义不依赖于代表元的选取。第三步就是所谓的"良定义性",也是正规性登场的地方。

4.2 为什么偏偏是正规子群:一个必须手算的反例

如果 H 不是正规子群,第三步会直接崩掉。我拿 S₃ 里那个 2 阶子群 H = {e, (1 2)} 走一遍,看得最清楚。

取 a = b = (1 3)。按定义 [a]·[b] 应该是 [a·b] = [(1 3)(1 3)] = [e] = H。但陪集乘法真正的定义是"从两个陪集里各取一个元素相乘,所有可能的积组成的集合"。aH = {(1 3), (1 3)(1 2)},这里 (1 3)(1 2) = (1 2 3),所以 aH = {(1 3), (1 2 3)}。

把四个组合的积都算出来:e·e 得 (1 3)……换一种更清楚的写法,直接列出 {a·h₁·b·h₂} 的取值,会得到 e、(1 2 3)、(1 3) 这三个不同的元素,既不等于某一个左陪集,大小也不是 2。

结论很干脆:不正规的子群,其陪集乘法根本不是一个良定义的二元运算,你换个代表元,乘出来的集合都变了。所以商群的存在性完全依赖正规性,这不是教材故意加难度,而是逻辑上的硬约束。

提示:判断良定义性时,标准套路是"设 a' = a·h₁,b' = b·h₂,证明 a'b' 与 ab 只差一个 H 中的元素"。正规性正好提供 h₁·b = b·h₃ 这样的交换补偿,把 h 从中间挪到边上。这个"挪动"就是整个证明的技术核心。

4.3 同态、核与第一同构定理

群同态 φ: G → G' 是保持运算的映射,即 φ(a·b) = φ(a)·φ(b)。由此可以推出一串性质:φ(e) = e',φ(a⁻¹) = φ(a)⁻¹,核 ker φ = {a : φ(a) = e'} 是 G 的正规子群,像 im φ 是 G' 的子群。

第一同构定理说:G/ker φ ≅ im φ。它的价值在于"任何同态的像,都能被理解成一个商群"。这条定理是群论里使用频率最高的工具之一,遇到"证明某两个群同构"的题目,百分之八十的思路是构造一个满同态然后算出核。

举个最短的例子:(Z, +) → (Z_n, +),把 k 映到 k mod n。这是满同态,核是 nZ,于是 Z/nZ ≅ Z_n。短短两行,把"整数模 n"这件事的本质说清楚了:它不是人为规定的同余规则,而是一个商群。

再举一个:行列式 det: GL_n(R) → (R{0}, ×) 是满同态,核是行列式为 1 的矩阵全体,也就是特殊线性群。于是 GL_n(R)/SL_n(R) ≅ R{0}。这个结论在几何上很直观:可逆矩阵按"体积缩放倍数"分类,同一类里差一个保体积的变换。商群就是在数"缩放倍数"。

4.4 三个能背下来的商群算例

第一个,Z/6Z。6 阶循环群,子群与 6 的因数一一对应:阶为 1、2、3、6。取 H = {0, 3},商群有 3 个元素:{0,3}、{1,4}、{2,5},加法表就是模 3 加法表,同构于 Z₃。取 H = {0,2,4},商群 2 个元素,同构于 Z₂。

第二个,S₃/A₃。A₃ = {e, (1 2 3), (1 3 2)} 是 3 阶子群,指数 2,正规。商群只有两个元素,任何 2 阶群都同构于 Z₂,所以 S₃/A₃ ≅ Z₂。这个商群的直观含义是"置换的奇偶性":两个偶置换乘起来是偶的,偶乘奇得奇,正好是 Z₂ 的加法。

第三个,正方形对称群除以旋转子群。8 阶的正方形对称群里有 4 个旋转(转 0°、90°、180°、270°)构成的正规子群,商群 2 阶,同构于 Z₂,两个元素分别代表"保持朝向"和"翻转朝向"。而 4 个反射构成的集合不是子群(两个反射复合是旋转),单个反射生成的 2 阶子群又不正规,这两个都是很好的反面教材。

5. 用代码把抽象结构算出来

5.1 为什么值得动手写一遍

纸笔证明能锻炼逻辑,但有限群的很多结论靠手算容易出错,尤其是置换复合的方向、陪集的划分、商群乘法表的封闭性。用几十行 Python(标准库就够,不需要任何第三方包)把这些结构造出来,让机器替你检查封闭性、逆元、拉格朗日条件,能省下大量"怀疑自己算错"的时间。 BigInteger 之类的东西都不用,纯元组操作。

我用置换表示群元素:一个置换是长度为 n 的元组 p,约定 p 表示"位置 i 上的东西被送到位置 p[i]"。复合定义为 (p∘q)[i] = p[q[i]],也就是先做 q 再做 p。

5.2 构造对称群并验证群公理

from itertools import permutations, combinations def mul(p, q): return tuple(p[q[i]] for i in range(len(q))) def inv(p): r = [0] * len(p) for i, v in enumerate(p): r[v] = i return tuple(r) n = 3 G = sorted(permutations(range(n))) e = tuple(range(n)) def check_group(G): for a in G: for b in G: if mul(a, b) not in G: return False, "封闭性失败" if e not in G: return False, "缺少单位元" for a in G: if not any(mul(a, b) == e for b in G): return False, "存在元素无逆" return True, "群公理通过" print(len(G), check_group(G))

跑出来是 6 个元素、公理通过。注意这里我只验了封闭、单位元、逆元,结合律没验——因为置换复合的结合律是已知的。如果换成自定义的运算,就必须补一步三重循环验证结合律,代价是 O(n³),元素多的时候会明显变慢。

5.3 枚举所有子群并核对拉格朗日条件

def is_subgroup(H, G): H = set(H) if not H or not H <= set(G): return False if e not in H: return False for a in H: for b in H: if mul(a, b) not in H: return False for a in H: if inv(a) not in H: return False return True subs = [] for k in range(1, len(G) + 1): for comb in combinations(G, k): if is_subgroup(comb, G): subs.append(frozenset(comb)) for s in sorted(subs, key=len): print(len(s), sorted(s), "整除检查:", len(G) % len(s) == 0)

S₃ 会输出 6 个子群:1 个 1 阶、3 个 2 阶、1 个 3 阶、1 个 6 阶。每一个的阶都整除 6,拉格朗日条件全部满足。这段代码还有个副产品:你能亲眼看到"2 阶子群有三个",正好对应三个不同的对换,为后面判断正规性提供了素材。

5.4 陪集分解与商群乘法表

def left_coset(a, H): return frozenset(mul(a, h) for h in H) def right_coset(a, H): return frozenset(mul(h, a) for h in H) def is_normal(H, G): return all(left_coset(a, H) == right_coset(a, H) for a in G) def quotient_table(G, N): cosets = [] for a in G: c = left_coset(a, N) if c not in cosets: cosets.append(c) reps = [sorted(c)[0] for c in cosets] table, ok = [], True for a in reps: row = [] for b in reps: prod = left_coset(mul(a, b), N) if prod not in cosets: ok = False row.append("未定义") else: row.append(cosets.index(prod)) table.append(row) return cosets, table, ok N = frozenset({(0, 1, 2), (1, 2, 0), (2, 0, 1)}) # 3 阶循环子群 print("正规吗:", is_normal(N, G)) cosets, table, ok = quotient_table(G, N) print("陪集个数:", len(cosets), "良定义:", ok) for row in table: print(row)

这段跑出来,3 阶子群是正规的,商群两个元素,乘法表就是 Z₂ 的加法表。把 N 换成frozenset({(0,1,2), (1,0,2)})(也就是 {e, (1 2)}),再跑一次,会看到is_normal返回 False,而quotient_table里出现未定义。这一正一反两组输出,比看十页证明更能理解"正规性是商群的门票"。

心得:自己写验证代码时,最容易错的是复合方向。p∘q 到底先做哪个,一旦和教材约定不一致,逆元会算错、子群会判错、正规性会判反。定好约定后在注释里写清楚,别中途改。我当初就是因为这个,debug 了一晚上。

6. 常见问题与排查技巧实录

6.1 概念混淆速查表

学到后面,最容易混的不是新概念,而是几个旧概念之间那条细线。我把常被问到的整理成表:

混淆点常见错误理解正确认识
半群与群半群是"还没证完的群"半群是独立结构,矩阵半群、字符串半群本来就没有逆元
子群与子集任意子集都能当子群必须自身成群,封闭、含单位元、含逆元缺一不可
陪集与子群aH 也是子群只有 a ∈ H 时 aH 才等于 H,否则 aH 不含单位元
正规与交换正规子群就是交换子群H 正规指共轭稳定,H 本身完全可以非交换
商群元素Z/6Z 的元素是 0 到 5元素是 6 个陪集,写成 [0] 到 [5] 才准确
拉格朗日逆命题阶数能整除就有子群不成立,12 阶群可以没有 6 阶子群

这张表的价值在于,考试和面试里被追问的往往就是这几条边界。特别是"陪集不等于子群"这一条,很多人第一次写 aH 时下意识以为它是子群,结果连单位元都找不到。

6.2 证明卡壳时的三条排查路径

第一条,检查公理够不够。卡住时回头数一数:我现在用的是群的哪几条性质?如果用了消去律,那必须确认每个元素有逆;如果用了 a² = e 推出 a = a⁻¹,那没问题,只用到定义;但如果用了"群阶是偶数则存在 2 阶元",那得先确认群是有限的。公理不匹配是最高频的错误来源。

第二条,检查是不是把"存在"当成了"任意"。子群定义里"对任意 a, b ∈ H"和"存在单位元"经常被写混。特别是一步法 a·b⁻¹ ∈ H,量词必须是全称,取特殊值只能用来找反例,不能用来证命题。

第三条,检查陪集的方向。左陪集和右陪集在非交换群里是不同的集合,正规性要求它们相等。写证明时一会儿用 aH 一会儿用 Ha,中途换了方向,结论就飘了。我的习惯是全程只用左陪集,需要右陪集时明确注明。

6.3 几个踩过才知道的细节

逆元不是倒数。抽象群里没有除法,a⁻¹ 只是"那个能和 a 乘出单位元的元素"。在矩阵里它是逆矩阵,在置换里它是反置换,在模 n 加法里它是 n-a。写 a/b 在任何群里都是没有定义的操作,看到题目里出现分式,先想清楚它背后的乘法是什么。

空集对乘法是封闭的。因为"对所有 x, y ∈ ∅"是空真命题。所以子群判定里的"非空"绝对不能漏,漏了就会把空集判成子群,而空集连单位元都没有。

同态不要求单射。很多人第一次见同态就默认它是双射,其实同态只管"保持运算"。真正双射的同态才叫同构,而商群的整个理论恰恰建立在"允许丢失信息"的基础上——核越大,丢的信息越多,商群越小。

指数为 2 必正规这条捷径要敢用。判断一个子群是否正规,先看指数。只要 |G|/|H| = 2,直接下结论,不用算共轭。这个技巧在选择题里能省一大截时间。

商群的阶等于指数。|G/N| = [G:N] = |G|/|N|。算出子群阶数就能立刻知道商群多大,反过来也能用商群大小反推子群大小。

别把 Z/nZ 和 Z_n 当成两个东西。它们同构,只是前者强调"陪集"的构造视角,后者强调"模 n 剩余类"的计算视角。做题时按哪个方便用哪个,但心里要清楚是一回事。

7. 我自己的学习顺序建议

如果让我重新走一遍这条路,我会把顺序调成这样:先用字符串拼接和矩阵乘法把半群、幺半群的手感建立起来,重点体会"没有逆元时哪些操作不能做";然后拿 Z 和 Z_n 这两个交换群把子群、陪集、拉格朗日定理算熟,因为交换群不会在左右陪集上纠缠,能专心理解划分;之后再上 S₃,用这个最小的非交换群把正规子群和非正规子群各找一个,亲手算一遍那个"陪集乘法不良定义"的反例;最后才去碰同态和同构定理。

这个顺序的好处是每一步只增加一个新难点。反过来,一上来就在非交换群里讲商群,学生会同时面对"陪集是什么""为什么左右不一样""良定义怎么证"三座山,很容易直接放弃。

代码在这里起的作用不是替代证明,而是提供可信的计算结果当锚点。证明告诉你"一定成立",代码告诉你"具体长什么样"。两者结合,抽象的东西才落得下来。我到现在遇到不熟悉的有限群,第一反应还是先在纸上列出元素表,再用代码把子群和商群跑一遍,看着输出对一遍,比空想快得多。

最后分享一个小练习,成本很低但收益不小:拿 4 阶循环群和 4 阶的另一个群(两个 2 阶元的直积)各跑一遍上面的代码,比较它们的子群格。你会发现两个群阶数相同,但一个只有一个 2 阶子群,另一个有三个。这说明阶数不能决定群的结构,而子群格能。这个观察是通向群分类问题的第一小步,也是我觉得抽象代数最迷人的地方——看似只有几条公理,能长出的结构却丰富得惊人。

返回列表