ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

重拆笛卡尔积:从有序对到直积群与循环性判据

重拆笛卡尔积:从有序对到直积群与循环性判据

翻出任何一本抽象代数教材,前三页几乎一模一样:集合、映射、等价关系,然后是笛卡尔积。绝大多数人复习的时候会直接把这几个定义跳过去,觉得这是高中内容,翻到群的定义才算正式开始。我带着一位同学过教材的时候就遇到这事,他上来就问:“笛卡尔积不就是 A×B = {(a,b) | a∈A, b∈B} 吗,这有什么好复习的?”结果两天后做习题,题目里出现“设 G = Z₂×Z₃,判断 G 是否循环”,他愣在那里,把直积的阶写成 2+3=5,又把元素的阶当成两个分量阶的和来算。

这篇笔记就是把这个“看起来不用复习”的笛卡尔积重新拆一遍。它讲三件事:笛卡尔积的严格定义里那些容易含糊的边角,它在抽象代数里到底撑起了哪些结构(关系、映射、直积群、直积环、直积向量空间),以及怎么用一段二十行的脚本把直积群的结构亲手验一遍。适合两类人:正在复习抽象代数、想把基础夯实的人;以及被“直积”“直和”“泛性质”这些词绕晕过、需要一次讲透的人。全程从从业者复习的角度讲,不摆教科书架子,该给的判据、代码、踩坑记录都给全。

1. 为什么复习抽代要把笛卡尔积翻出来重看

1.1 抽代里的每个定义,脚下都踩着笛卡尔积

很多人以为笛卡尔积只是一个“造集合的玩具”,造完就扔。实际上抽象代数前半本书里,几乎所有核心概念的定义都直接建立在它之上,只是教材写得太过自然,以至于你根本注意不到。

映射 f: A→B 的定义是 A×B 的一个子集,满足“每个 a 恰好配一个 b”。二元运算 *: G×G→G 也是笛卡尔积出发的映射——注意这里不是 G→G,是 G×G→G,两个输入。等价关系是 A×A 的一个子集,满足自反、对称、传递三条。群作用 G×X→X、环的乘法 R×R→R、双线性映射 V×W→U,全都一样。你要是对 A×B 的理解只停留在“所有有序对”,那么看到“运算是一个映射 G×G→G”的时候,脑子里其实没有画面。

我自己的体会是,复习抽象代数最有效的顺序不是从群开始,而是先把“集合—笛卡尔积—关系—映射—运算”这一条链子理顺。链子理顺以后,群的定义你只需要记三个字:封、结、逆。因为“封闭”这个词的准确含义就是那个二元运算的陪域落在 G 里面,而这个运算本身就是从 G×G 出发的。定义读不动的根源,往往在下面一层。

提示:如果某天你读一个定义读了三遍还没画面,八成不是这个概念难,而是它引用的下层概念你没吃透。抽象代数的下层就是集合论语言,笛卡尔积是其中最常被跳过的一环。

1.2 笛卡尔积能干什么:从坐标系到直积群

抛开抽象代数,笛卡尔积在别的地方出现得更多,只是换了名字。

平面直角坐标系里,平面上的点集就是 R×R,写作 R²。三维空间是 R×R×R。数据库里两张表做“笛卡尔积”,结果行数是两表行数之积,这是最直白的一次乘法。编程语言里嵌套循环for a in A: for b in B:遍历的就是 A×B,只不过顺序是按字典序排的。概率论里两个独立事件的样本空间,也是笛卡尔积。

到了抽象代数,笛卡尔积有了新身份:它变成了“用已知结构造新结构”的模具。给定两个群 G 和 H,在 G×H 上逐分量定义运算,得到的还是一个群,叫直积群。两个环、两个向量空间同理。这一步的意义在于,你可以从一个群出发造出无穷多个群,而且这些新群的性质完全由因子决定——阶、元素的阶、是否交换、是否循环、子群结构,都能从因子算出来。

这就是为什么复习笛卡尔积不能只停在定义。定义是两行的事,真正值钱的是“笛卡尔积 + 运算 = 直积”这个套路,以及配套的一整套计算规则。后面几节我会把这些规则一条条列出来,包括容易记反的那几条。

1.3 这份笔记适合谁看、看完能拿到什么

说清楚预期,免得浪费你时间。

如果你正在准备考试或者面试,需要快速捡起“直积”这块内容,第 3 节和第 4 节是你的重点,那里有循环性判据、元素阶公式、直积与直和的分界,全是考点。如果你是想真正理解结构的自学者,第 2 节和最后一节的复习方法更值得细读,那里讲的是定义为什么这么写、边界情况为什么重要。如果你是那种“必须亲手算一遍才记得住”的人,第 5 节的脚本最对胃口,二十来行代码就能把 Z₂×Z₂ 和 Z₄ 的区别摆在眼前。

需要的前置知识不多:知道群、子群、元素的阶、循环群,能看懂 Z_n 表示模 n 的加法群,够了。环和域的部分我会尽量少用记号,实在绕不开会补一句解释。全程用大白话,遇到必须严谨的地方再上符号。

2. 把定义拆到底:有序对、n 元组、索引族三种写法

2.1 有序对里“有序”两个字到底在约束什么

先说清楚一件事:(a, b) 和 {a, b} 是两种完全不同的东西。后者是集合,无序,{1,2} 和 {2,1} 是同一个集合。前者是有序对,{1,2} 顺序换了还是它自己,但 (1,2) 换了顺序就是 (2,1),两者不相等,除非 a=b。

数学上怎么把“有序”这件事用集合语言精确表达出来?标准做法是 Kuratowski 编码:定义 (a,b) = {{a}, {b}}。这个编码的精妙之处在于,你可以纯用集合的公理证明“有序对相等当且仅当两个分量分别相等”,也就是 (a,b)=(c,d) ⟺ a=c 且 b=d。证明要分两种情况讨论,一种 a=b,一种 a≠b,过程不难但很能体现“把直觉翻译成公理”的思路,值得自己推一遍。

为什么要在意这个?因为抽象代数里到处是“相等”的判断。判断两个映射相等,判断两个群元素相等,判断 (g,h) 和 (h,g) 是不是同一个元素,落脚点都在有序对的相等判据上。你要是把 (g,h) 和 (h,g) 当成一回事,那么 G×H 和 H×G 就分不开了,而这两个群在 m≠n 时连阶都不一样,明显不是同一个东西。

顺带把 n 元组的递归定义也过一遍:A₁×A₂×…×Aₙ 通常定义为 (A₁×…×A_{n-1})×Aₙ,元素写成 (a₁,…,aₙ)。严格来说这种嵌套括号和“扁平”的 n 元组不是同一个集合,但存在自然的双射,教材一般直接约定扁平写法,不再纠结。你自己心里有个数就行:讲“结合律”的时候说的是同构意义下的结合,不是字面上的集合相等。

2.2 从有限积到索引族:无限笛卡尔积的正确打开方式

两个集合的积定义很直接:A×B = {(a,b) | a∈A, b∈B}。三个集合就是 (A×B)×C 或者 A×(B×C),反正同构,写成 A×B×C。有限个集合的积,元素就是有限长的元组,好理解。

麻烦出在“无限多个集合”上。假设有一个索引集 I,对每个 i∈I 给一个集合 A_i,那么 ∏_{i∈I} A_i 该怎么定义?答案不是“无限长的元组”,而是选择函数:所有满足“对每个 i∈I,f(i)∈A_i”的函数 f: I→∪A_i 构成的集合。每个这样的函数就是一个“广义元组”,第 i 个分量是 f(i)。

这个定义翻译成人话就是:你要从每个 A_i 里挑一个元素出来,把挑选结果打包成一个整体。有限个集合的时候,这种打包和有序列一一对应;无限个集合的时候,函数的说法才站得住脚。

注意:无限积的“非空性”不是白给的。当每个 A_i 都非空、I 是无限集时,证明 ∏A_i 非空需要额外的集合论公理支撑,标准教材里叫选择公理。你在做普通习题时基本碰不到这个层次,但看到“无限笛卡尔积”这几个字时心里要有数:它比有限情形要重。

实际复习的时候,我建议你把 90% 的精力放在有限积上。抽象代数里的直积,绝大多数是有限个因子,而且常常只有两个。无限积主要出现在直和与直积的区分上,那里有个很漂亮的判据,第 4 节会讲。

2.3 四个边界情况:空集、单点集、一元积和空积

边界情况是检验“你到底懂没懂”的试金石,也是考试里容易丢分的地方。四个必须想清楚的:

  • A×∅ = ∅。因为找不到 b∈∅ 去配 a,一个元素都造不出来。不管 A 有多大,哪怕是无限集,乘上空集就是空集。
  • A×{x} 与 A 双射。每个 a 对应唯一的 (a, x),这是一一对应。所以乘一个单点集不改变基数,只是在形式上多了一层括号。
  • 一元积。只有一个因子 A₁ 的时候,∏ 就是 A₁ 本身,不是 A₁ 的“一元组”。教材一般直接约定一元积等于原集合,为了公式整齐。
  • 空积。索引集 I 为空的时候,唯一的函数是空函数,所以空积是一个单点集,通常记作 {∅} 或者 1。它不是空集,这点特别反直觉。理解方式:从零个集合里各挑一个元素,只有一种挑法——什么都不挑,所以结果是一个元素(空选择),不是一个都没有。

这四个结论,我当年第一次看觉得是数学家的洁癖,后来做题才发现它们是很多公式成立的黏合剂。比如 |A×B| = |A|·|B| 这个公式,在 B 是空集时右边是 |A|·0 = 0,左边也是 0,天衣无缝。再比如后面讲直积,如果允许空族参与,很多陈述要额外加条件,不如约定空积为单点集来得省事。

2.4 三个运算律:哪些真成立,哪些只在同构意义下成立

这一小节是重点,因为概念混淆全在这儿。

交换律:不成立。A×B 和 B×A 一般不是同一个集合,元素是 (a,b) 和 (b,a),结构不同。但存在自然的双射 (a,b) ↦ (b,a),所以基数和结构性质是一样的。讲“直积群 G×H 和 H×G 同构”是对的,讲“相等”就错了。

结合律:不成立,但同构意义下成立。(A×B)×C 的元素是 ((a,b),c),A×(B×C) 的元素是 (a,(b,c)),字面上不相等。有一个自然双射把前者送到后者,所以教材放心地写成 A×B×C。

分配律:对并和交成立。A×(B∪C) = (A×B)∪(A×C),这个是真相等,不是同构。交也一样。差集要小心,A×(B\C) = (A×B)(A×C) 成立,但 (A\B)×C 的写法在某些教材里要额外约定。

对偶关系:A×B = ∅ ⟺ A=∅ 或 B=∅。这条经常在反证里用。比如证明某个群直积不可能是平凡群,就可以从因子入手。

我踩过的最典型的一个坑:以为 |A×B| = |A|+|B|。这个错误在刚学的时候犯过一次,后来做概率题又犯过一次(两个独立试验的结果总数)。区别很简单——如果你在“组合”,两个选择相乘;如果你在“二选一”,才相加。笛卡尔积是组合,永远是乘。

3. 从笛卡尔积到代数结构:直积群的完整搭建

3.1 逐分量定义运算:一个定义、四条验证

现在做正事:在 G×H 上装运算。

给定群 (G, ·) 和 (H,),在 G×H 上定义运算 ∘ 如下:(g₁,h₁)∘(g₂,h₂) = (g₁·g₂, h₁h₂)。就是“各管各的,逐分量算”。

接下来要验证四条群公理。这四条验证几乎是机械的,但每一步都能告诉你为什么这样定义才好用:

  • 封闭性:g₁·g₂∈G,h₁*h₂∈H,所以结果还在 G×H 里。这条依赖于两个因子各自的封闭性。
  • 结合律:把 ((g₁,h₁)∘(g₂,h₂))∘(g₃,h₃) 展开,两次都会变成 (g₁g₂g₃, h₁h₂h₃),靠的是 G 和 H 各自的结合律。这里能看出逐分量定义的好处——把一个大问题拆成两个小问题。
  • 单位元:(e_G, e_H)。验证: (g,h)∘(e_G,e_H) = (g·e_G, h*e_H) = (g,h),另一边同理。
  • 逆元:(g,h)⁻¹ = (g⁻¹, h⁻¹)。验证:(g,h)∘(g⁻¹,h⁻¹) = (e_G,e_H)。

四条全部通过,G×H 是群,阶为 |G|·|H|。这个结论太常用,值得背下来。

再看两条附加性质。第一,G×H 交换 ⟺ G 和 H 都交换。因为运算逐分量进行,两个分量都换得动才整体换得动。第二,G×H 中元素的阶是 lcm(ord(g), ord(h)),这里 lcm 是最小公倍数。这条下一小节单独说,因为它是所有计算题的根。

提示:直积的运算定义里,两个因子用的是不同的符号(· 和 *),这只是一种写法。实际做题时两边都用 + 或者都用 · 更省事,别被符号吓住。

3.2 元素阶怎么算:最小公倍数与阶分布枚举

公式:(g,h) 在 G×H 中的阶等于 ord(g) 和 ord(h) 的最小公倍数。

为什么?设 (g,h)ⁿ = (e_G, e_H)。逐分量看就是 gⁿ = e_G 且 hⁿ = e_H,所以 n 必须同时是 ord(g) 和 ord(h) 的倍数,最小的那个就是 lcm。证明只有三行,但用处极大。

举几个具体的。Z₂×Z₂ 里,非单位元有 (1,0)、(0,1)、(1,1),三个的阶都是 2,因为 lcm(2,2)=2,lcm(1,2)=2,lcm(2,1)=2。整个群的元素阶分布是 {1: 1个, 2: 3个}。

Z₄ 呢?元素 0 阶 1,元素 2 阶 2(因为 2+2=0),元素 1 和 3 阶 4。分布是 {1: 1个, 2: 1个, 4: 2个}。

两者都是四阶群,都是交换群,但阶分布不同。阶分布是群的同构不变量,所以 Z₂×Z₂ 和 Z₄ 不同构。这是用一个很小的例子把“同构不变量”这个概念坐实,比空讲定义有效得多。

再看一个“相同”的例子。Z₂×Z₃ 的阶分布:单位元阶 1;(1,0) 阶 2;(0,1) 和 (0,2) 阶 3;(1,1) 和 (1,2) 阶 lcm(2,3)=6。分布是 {1:1, 2:1, 3:2, 6:2}。Z₆ 的分布:0 阶 1,3 阶 2,2 和 4 阶 3,1 和 5 阶 6,也是 {1:1, 2:1, 3:2, 6:2}。两个群六阶,分布完全一致,事实上它们同构——这正是中国剩余定理的群论版本,Z₂×Z₃ ≅ Z₆,条件是 2 和 3 互素。

顺便记一下“指数”这个概念:群 G 的指数 exp(G) 是所有元素阶的最小公倍数。直积的指数等于各因子指数的最小公倍数,也就是 exp(G×H) = lcm(exp G, exp H)。全群指数就是各元素阶的最大值,因为所有元素阶都整除指数。这个量在判断循环性时很有用——下面马上用上。

3.3 直积何时循环:Z_m × Z_n 的核心判据

这是最常见的一道判断:Z_m × Z_n 是不是循环群?

答案是:当且仅当 gcd(m, n) = 1。此时 Z_m × Z_n ≅ Z_{mn}。

证明思路两条,值得都掌握。第一条走元素阶:Z_m×Z_n 有 mn 个元素,如果它循环,必须存在一个阶为 mn 的元素。元素 (a,b) 的阶是 lcm(ord(a), ord(b)),而 ord(a) ≤ m,ord(b) ≤ n。要让 lcm 达到 mn 这个上限,必须 ord(a)=m、ord(b)=n 且 m、n 互素。所以 m、n 互素时,(1,1) 的阶就是 lcm(m,n)=mn,生成整个群。反过来,如果 gcd(m,n)=d>1,任何元素的阶都不超过 lcm(m,n)=mn/d < mn,全群找不到生成元,只能非循环。

第二条走指数:exp(Z_m×Z_n) = lcm(m,n)。循环群的指数等于阶。所以要循环,必须 lcm(m,n) = mn,也就是互素。

两条路说的是同一件事,但第二条更省笔墨,我通常直接写指数。这个判据推广到多因子:Z_{n₁}×…×Z_{n_k} 循环 ⟺ n_i 两两互素。

注意:这个判据只对 Z_n 这种加法群成立。对一般的群,“因子循环”推不出“直积循环”。G×H 循环 ⟹ G 和 H 都循环(投影是满同态,同态像是循环的),但反过来不成立,Z₂×Z₂ 就是反例——两个因子都循环,直积非循环。

3.4 直积与直和的分水岭:有限与无限

概念上,直和和直积对有限个因子是同一个东西,符号可以混用。分岔出现在无限族上。

设有一族群 G_i,i∈I。直积 ∏G_i 是所有选择函数的集合,元素可以有无穷多个非单位分量。直和 ⊕G_i 是其中“只有有限个分量非单位元”的那些元素构成子集。直积是群,直和是它的子群。

当 I 有限时,任何元素本来就只有有限个分量,两者相等。当 I 无限时,两者严格不同,而且性质差别很大。最简单的例子:取 I 为自然数集,每个 G_i = Z₂。直积 ∏G_i 里有一个元素是“全 1”的,即每个分量都是 1。这个元素加上自己等于零元(因为每个分量 1+1=0),所以它的阶是 2。而直和 ⊕G_i 里的元素只有有限个 1,其余全 0。

更关键的一点:直积里有阶为 2 的元素,直和里的元素虽然也有阶 2 的,但两个群的整体结构不同——直积不可数,直和可数。这是区分它们最干脆的方式。

背下来的判据就一句:有限个因子时,直积等于直和;无限个因子时,直和严格包含在直积里,包含关系是“有限支撑”这个条件。

4. 关系、映射、泛性质:笛卡尔积的三重身份

4.1 二元关系就是 A×B 的子集

集合论里,从 A 到 B 的(二元)关系 R 定义为 A×B 的一个子集。写成 aRb 就是 (a,b)∈R。

这个定义统一了一大堆东西。等价关系是 A×A 的子集,满足三条公理。偏序是 A×A 的子集,满足自反、反对称、传递。函数是 A×B 的子集,满足“每个 a 恰好配一个 b”。所以函数是特殊的关系,关系是特殊的笛卡尔积子集。

这个层层包含的结构,在抽象代数里反复出现。比如商群 G/N 的元素是陪集,陪集本身是 G 的子集,而“同一个陪集”这个关系是 G×G 上的等价关系。再比如群同态的核,定义成 {g | φ(g)=e},判定“φ(g)=φ(h)”等价于 gh⁻¹∈ker φ,这背后还是等价关系的语言。

我复习时的做法是画一张包含图:A×B ⊃ 关系 ⊃ 函数 ⊃ 双射,旁边标出各自加的公理。图很小,但能把定义串成一条线,比零散地背强得多。

4.2 投影映射与投影同态

从 A×B 到 A 的投影 π₁ 定义为 π₁(a,b)=a,到 B 的是 π₂(a,b)=b。两个都是满射。

在群的语境下,投影不只是集合映射,还是群同态。验证很简单:π₁((g₁,h₁)∘(g₂,h₂)) = π₁(g₁g₂, h₁h₂) = g₁g₂ = π₁(g₁,h₁)·π₁(g₂,h₂)。所以 π₁: G×H→G 是满同态,核是 {e_G}×H。同理 π₂ 的核是 G×{e_H}。

这两个核都是正规子群,而且它们满足:核(π₁) ∩ 核(π₂) = {(e_G,e_H)},两个核的乘积是整个 G×H。这就是“内直积”的雏形——如果你在一个群里找到两个正规子群,交为平凡、乘积为全群,那么这个群同构于它们的直积。这个结论在分类小阶群的时候很好用。

投影映射还有个作用:它给出了“直积怎么映射到因子”的标准答案。任何从 G×H 出发的同态,往 G 或者往 H 走,都能先过一下投影。这个观察在下一小节的泛性质里被推到极致。

4.3 泛性质:笛卡尔积的“唯一正确”刻画

泛性质是这么说的:给定集合 A、B,直积 A×B 配上一对投影 π₁、π₂,具有这样的性质——对任意集合 C 和任意一对映射 f: C→A、g: C→B,存在唯一的映射 h: C→A×B,使得 π₁∘h = f 且 π₂∘h = g。这个 h 就是 h(c) = (f(c), g(c))。

用人话翻译:你给我一对“分头行动”的映射,我能把它们打包成一个统一的映射,打进直积里,而且打包方式唯一。

这条性质的价值在于,它不依赖 A×B 的具体构造方式,只描述它和外部世界的交互行为。数学上有个说法叫“用泛性质定义对象,得到的对象在同构意义下唯一”,意思是你可以用 Kuratowski 编码构造一个,用选择函数构造一个,用别的方式再构造一个,只要满足这条交互规则,它们必然同构。这就是为什么教材对“直积到底长什么样”并不特别较真,因为真正重要的是这条规则。

复习的时候,泛性质经常被当成“高级内容”略过。但对我来说,它是理解“为什么投影重要”的关键。你以后遇到积拓扑、积测度、拉回、极限这些概念,背后都是同一条泛性质。花二十分钟把它想通,比背十个定义划算。

5. 动手验证:二十行脚本枚举直积群

5.1 最小实现

光看不练容易记混,我用一段脚本来把上面的公式全部验一遍。用的是 Python 标准库,不需要装任何东西。

from itertools import product from math import gcd from collections import Counter def add_order(x, n): """Z_n 中元素 x 的加法阶""" if x % n == 0: return 1 return n // gcd(x, n) def order_dist(m, n): """Z_m × Z_n 的元素阶分布""" c = Counter() for a, b in product(range(m), range(n)): oa, ob = add_order(a, m), add_order(b, n) c[oa * ob // gcd(oa, ob)] += 1 # lcm(oa, ob) return dict(sorted(c.items())) for m, n in [(2,2), (4,1), (2,3), (6,1), (2,4)]: d = order_dist(m, n) total = m * n print(f"Z{m} x Z{n}: 阶数={total}, 分布={d}")

5.2 跑出来的结果与解读

上机跑一遍,输出是这样:

Z2 x Z2: 阶数=4, 分布={1: 1, 2: 3} Z4 x Z1: 阶数=4, 分布={1: 1, 2: 1, 4: 2} Z2 x Z3: 阶数=6, 分布={1: 1, 2: 1, 3: 2, 6: 2} Z6 x Z1: 阶数=6, 分布={1: 1, 2: 1, 3: 2, 6: 2} Z2 x Z4: 阶数=8, 分布={1: 1, 2: 3, 4: 4}

对着结果看几件事。

第一,Z₂×Z₂ 和 Z₄ 阶数都是 4,分布不同,所以不同构。脚本用三行就把这个结论摆平了,不用手推。

第二,Z₂×Z₃ 和 Z₆ 分布完全一致,符合互素判据。

第三,Z₂×Z₄ 的分布是 {1:1, 2:3, 4:4},最大阶是 4,而全群阶是 8。所以不存在 8 阶元,非循环。这印证了 gcd(2,4)=2≠1 的判据。

再补一个验证:全群指数应该等于 lcm(m,n)。可以顺手加一行print(max(order_dist(m,n))),输出最大值就是指数。Z₂×Z₄ 的指数是 4,lcm(2,4)=4,对上了。

5.3 三个容易写错的细节

这段代码短,但有三个地方我一开始写错过,值得说一下。

第一个,add_order里对 0 的处理。模 n 加法群里,元素 0 的阶是 1,不是 0,也不是 n。有人写成n // gcd(0, n),算出来是 n // n = 1,恰好对了,但这是运气,gcd(0,n)=n这个事实要心里清楚,别当成通用技巧。对于一般群,单位元的阶定义为 1,这是约定。

第二个,lcm 的计算。Python 3.9 之后math.lcm可以直接用,老版本要自己写a*b//gcd(a,b)。我用后者是为了版本兼容。注意别写成a*b/gcd,那样得到的是浮点数,做字典键会出问题。

第三个,product的遍历顺序。itertools.product(range(m), range(n))的输出顺序是先固定 a 遍历 b,等价于for a in range(m): for b in range(n)。这个顺序对一个纯计数的任务没有影响,但如果你要保证输出可复现、和手算顺序对得上,最好心里有数。我习惯把 range 的顺序和数学上的元组顺序保持一致,避免事后核对时错位。

提示:脚本只验证了有限循环群的直积。想验证一般的有限群,把 Z_n 换成群的元素列表和对应的运算表即可,逻辑完全一样,只是要自己写一个查表版的元素阶函数。

6. 踩坑记录与常见问题速查

6.1 概念类混淆:五个高频误区

复习过程中我遇到过、也见过别人遇到的一批错误,集中列一下,附排查方法。

常见错误表述正确表述排查方法
A×B 和 B×A 相等存在自然双射,同构但不等看元素形式:(a,b) ≠ (b,a) 当 a≠b
|A×B| = |A|+|B||A×B| = |A|·|B|用 A={1,2}, B={x} 举例,结果 2 个不是 3 个
因子循环则直积循环反例 Z₂×Z₂,需互素条件检查 gcd 是否为 1
直积的指数等于各因子指数之积等于最小公倍数取 Z₂×Z₂,指数是 2 不是 4
无限直积等于无限直和直和是直积的真子群(有限支撑)构造“全 1 元素”看它是否在直和里

前两条是基础错误,后三条是直积特有的。我特别想强调第四条,因为“指数乘起来”这个错误特别隐蔽——它在阶上是对的(|G×H| = |G|·|H|),所以很容易顺手把指数也相乘。但两个量的定义完全不同,阶数论元素个数,指数论元素阶的上界,一个是乘一个是 lcm。

6.2 计算类错误:阶、生成元、子群计数

第一类,算元素阶时忘了 lcm 而误用乘积。Z₂×Z₃ 里 (1,1) 的阶是 lcm(2,3)=6,如果误用乘积 2×3=6 恰好也对,这就是为什么这个错误不容易被发现。换成 Z₂×Z₄ 里的 (1,1),正确是 lcm(2,4)=4,误用乘积得到 8,而 8 已经超过群的阶了,这时候能暴露出来。

第二类,判断生成元时只看一个分量。Z_m×Z_n 循环时,生成元是 (1,1),但生成元的数量是 φ(mn)。如果是 Z₂×Z₃,生成元有 φ(6)=2 个,分别是 (1,1) 和 (1,2)。有人以为只有 (1,1),漏掉一个。

第三类,子群计数。G×H 的子群不一定都是 K×L 的形式,还可能存在“对角线”型子群。Z₂×Z₂ 有三个 2 阶子群:{e}×Z₂、Z₂×{e}、以及 {(0,0),(1,1)},第三个就是对角线。前两个是“直积型”,第三个不是。这一点在做小阶群分类的时候是分水岭。

6.3 一张排查表:症状与根源

症状可能的根源处理方式
判定两个直积群不同构,但说不清理由只比了阶数算元素阶分布或指数
算出某个元素阶大于群的阶忘记取 lcm 或算错分解到分量,分别算阶再取 lcm
认为无限直积中的元素都只有有限个非零分量把直积当成直和回到选择函数的定义
证明“乘积正规”时卡住忘了两个核可交换先证 h₁h₂ = h₂h₁(因为分量各自独立)
判断循环性判据用错范围把 Z_n 的判据套到一般群先看是不是循环因子

最后一条我想多说两句。“Z_m×Z_n 循环 ⟺ 互素”这个判据只适用循环因子,套到一般群上就翻车。比如 Z₂×Z₂ 两个因子都循环,直积非循环。再比如一般的有限交换群基本定理里,分解成循环群的直积时,要求阶数是素数幂、且要按整除关系排列,这些条件都是因为“直积的循环性”并不传递。

7. 我怎么复习这一节:手写清单与练习节奏

7.1 三遍法:定义、反例、结构

我自己的复习节奏是三遍,每一遍目标不同。

第一遍只做一件事:把定义抄在纸上,然后合上书复述。笛卡尔积、有序对、投影、直积群运算,四个定义,复述到不打结为止。这一遍不看任何例题,纯粹磨语言。很多人复习失败在第一遍就跳过去了,直接做题,结果题目里的“设 (g,h) 是 G×H 中的元素”这句话都读不利索。

第二遍找反例。每学一个结论,先问“反过来成立吗”,不成立就造一个反例。因子循环推不出直积循环,反例 Z₂×Z₂;直积交换推不出因子都交换?其实这条是成立的,因为投影是满同态。造反例的过程就是检验理解的过程,造不出来说明你其实没真懂。

第三遍看结构。把直积放在更大的框架里:它是积的泛性质的实例,和直和、极限是一家人。这一遍不追求算得快,追求“知道它在整个理论里占什么位置”。

7.2 一张自己用的检查清单

我在笔记本上留了一页清单,每次复习完打个勾。内容大概是这些:

  • 能写出 A×B 和 ∏_{i∈I}A_i 的准确定义,包括空集和空积。
  • 能证明 (a,b)=(c,d) ⟺ a=c 且 b=d。
  • 能背出直积群的四条公理验证,尤其是逆元。
  • 能说出元素阶公式并给出三行证明。
  • 能说出循环性判据的两个证明方向。
  • 能举出一个“阶相同但不同构”的例子。
  • 能说清直积和直和在无限情形下的区别。
  • 能写出投影泛性质并说明为什么“唯一”。

八条全过,这一节就算拿下。里面最容易被跳过的是第二条和最后一条,但恰恰是这两条最能反映理解的深度。

7.3 选什么题练、练到什么程度

题目选择上,我建议按这个顺序。

先做“阶与指数”的计算题,纯算,五分钟一道,练熟公式。再做“判断同构”的题,给两个小阶群,用阶分布或指数区分,训练不变量意识。然后是“证明直积的某个子群正规”这类结构题,练投影与核的用法。最后如果时间允许,看一眼无限直积与直和的区分,知道有这么回事就行,考试很少深挖。

练到什么程度算够?我的标准是:给你任意两个小阶交换群,你能在十分钟内判断它们是否同构,并写出理由。这个标准不高,但覆盖了 90% 的常见题型。

提示:做判断同构的题时,先看阶,再看指数,再看阶分布,最后才考虑构造同构映射。前三个都是廉价的不变量,能筛掉大部分情况。

最后分享一个我自己用着顺手的小技巧。碰到直积的题,第一步永远是“把元素拆成两个分量,分开算,最后合起来”。阶这样算,逆元这样算,验证同态也这样算。这个习惯养成之后,直积这块几乎没有算错过。反过来,试图“整体地”看 G×H 里的元素,除了极小的例子,基本都会绕晕。说到底,笛卡尔积的设计初衷就是把复杂对象拆成互不干扰的几块,用的时候顺着它的设计走,别跟它较劲。

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进