6.2 子群、同態與 Lagrange 定理#
本節目標#
- 理解 Mathlib 中
Subgroup G的設計:它「是」Set G但攜帶封閉性證明 - 認識群同態
MonoidHom、kernel 與 image 的 Lean 形式 - 掌握陪集(coset)的直覺:把群切成等大的碎片
- 讀懂 Lagrange 定理在 Mathlib 中的陳述(以
Nat.card計數) - 練習「 \(|G| = |H| \cdot [G:H]\) 」這一型態的推理
6.2.1 子群:封閉性是證明,不是願望#
教科書定義: \(H \subseteq G\) 且 \(H\) 在運算與反元素下封閉,則 \(H\) 是子群。
Lean 4 + Mathlib 的定義(簡化):
structure Subgroup (G : Type*) [Group G] where
carrier : Set G -- 子群的承載集合
one_mem' : 1 ∈ carrier -- 單位元素在 H 裡
mul_mem' {a b} : a ∈ carrier → b ∈ carrier → a * b ∈ carrier -- 封閉性
inv_mem' {a} : a ∈ carrier → a⁻¹ ∈ carrier -- 反元素封閉
第一行就點破了關鍵:Subgroup G 的第一個欄位是 Set G。一個子群 = 一個集合 + 三條封閉性證明。你可以把 Subgroup G 當 Set G 用(coercion 自動轉換),h : a ∈ H 直接可用,但 Lean 記得封閉性,所以 a * b ∈ H 不用重證——typeclass/coercion 機制把「子群自動繼承群結構」變成免費的。
具體的子群則是 def + 證明封閉性:
import Mathlib
-- 例:由一個元素生成的循環子群 ⟨a⟩
example {G : Type*} [Group G] (a : G) :
∃ H : Subgroup G, a ∈ H := by
exact ⟨Subgroup.zpowers a, Subgroup.mem_zpowers _⟩
6.2.2 同態:MonoidHom 是「保結構的函數」#
群同態 \(\varphi : G \to H\) 滿足 \(\varphi(ab) = \varphi(a)\varphi(b)\) 。Mathlib 用 MonoidHom(在同態層級中,群同態是 MonoidHom 的特例):
structure MonoidHom (M N : Type*) [MulOneClass M] [MulOneClass N] where
toFun : M → N
map_one' : toFun 1 = 1
map_mul' : ∀ x y, toFun (x * y) = toFun x * toFun y
又是一道「資料(函數)+ 性質(證明)」的配方。使用時記得:應用同態寫 f x(coercion),公理叫 f.map_one、f.map_mul。
最經典的陷阱練習(Lean 學習法的好處——你寫不出證明,往往不是技術不夠,而是命題錯了):
import Mathlib
-- 命題刻意有錯:f x = 1 並不等價於「f x 與整個像可交換」
example {G H : Type*} [Group G] [Group H] (f : G →* H) :
f ⁻¹' {1} = {x : G | ∀ y : H, y ∈ Set.range f →
f x * y = y * f x} := by
sorry -- 練習 3:找出反例,把命題改對後再證
6.2.3 kernel 與 image#
-- kernel:被送到單位元的所有元素(對群同態是正規子群)
-- image:所有函數值構成的子群
example {G H : Type*} [Group G] [Group H] (f : G →* H) (x : G) :
x ∈ f.ker ↔ f x = 1 := Iff.rfl
example {G H : Type*} [Group G] [Group H] (f : G →* H) (y : H) :
y ∈ f.range ↔ ∃ x : G, f x = y := Iff.rfl
而第一同構定理在 Mathlib 中寫成:
example {G H : Type*} [Group G] [Group H] (f : G →* H) :
(G ⧸ f.ker) ≃* f.range := f.quotientKerEquivRange
\(G/\ker f \cong \operatorname{im} f\) ——一個名字就給你了。這是 Mathlib 的報酬:你學會讀 API,定理像積木一樣可取用。
6.2.4 陪集的直覺#
設 \(H \leq G\) , \(a \in G\) 。左陪集 \(aH = \{a h : h \in H\}\) 。
幾何直覺:把 \(G\) 想成一個房間, \(H\) 是裡面一塊地磚,每個 \(a\) 決定一塊「平移過去的地磚」 \(aH\) 。關鍵事實:任何兩塊地磚要嘛全等要嘛不相交、每塊一樣大( \(|aH| = |H|\) )、且鋪滿房間(每個 \(g \in G\) 都在 \(gH\) 裡)。所以 \(|G| = (\text{地磚數}) \times (\text{每塊大小})\) ,地磚數就是 指數 \([G : H]\) 。
graph TD
G["群 G(房間)"] --> H["子群 H(地磚)"]
G --> C1["陪集 aH"]
G --> C2["陪集 bH"]
G --> C3["陪集 cH"]
C1 --> Eq1["每塊 |aH| = |H|"]
C2 --> Eq2["互不相交"]
C3 --> Eq3["聯集 = G"]
Eq1 & Eq2 & Eq3 --> L["|G| = |H| × [G : H]"]6.2.5 Lagrange 定理的 Mathlib 陳述#
Mathlib 中(簡寫):
theorem Subgroup.card_eq_card_mul_index {G : Type*} [Group G] [Fintype G]
(H : Subgroup G) [Fintype H] :
Nat.card G = Nat.card H * Nat.card (G ⧸ H)
以及指數的定義:Nat.card (G ⧸ H) = index H。解讀:Fintype G 表示 \(G\) 有限;Nat.card 是型別的元素個數;G ⧸ H 是左陪集構成的商型別。
注意一個常見誤區:G ⧸ H 在 \(H\) 不正規時 不是群,只是陪集的集合。Lagrange 定理只需要「集合」版本的商。
6.2.6 實戰: \(|G| = |H| \cdot [G:H]\) 型態的推理#
典型的 Lagrange 推論:「 \(G\) 有限群, \(a \in G\) ,則 \(a\) 的階整除 \(|G|\) 」。套路是: \(a\) 的階 \(n\) ⟹ \(\langle a \rangle\) 有 \(n\) 個元素 ⟹ \(n = |\langle a \rangle|\) 整除 \(|G|\) 。
import Mathlib
example {G : Type*} [Group G] [Fintype G] (H : Subgroup G) [Fintype H] :
H.index ∣ Nat.card G := by
have := Subgroup.card_eq_card_mul_index H
-- |G| = |H| * [G:H],故 [G:H] 整除 |G|
exact ⟨Nat.card H, by rw [Nat.card_mul] at this ⊢; linarith [this]⟩
實際寫作時的推理骨架:由 Lagrange 得 \(\|G\| = \|H\| \cdot [G:H]\) (have := Subgroup.card_eq_card_mul_index H),故 \([G:H] \mid \|G\|\) ;再配上「 \(\langle a \rangle\) 的元素個數是 \(a\) 的階」(Nat.card_zpowers),即得「 \(a\) 的階整除 \(\|G\|\) 」。
一個完整的小例子——用 Lagrange 證明 6 元群沒有 4 階子群(紙上需要半頁,Lean 只剩「 \(4 \nmid 6\) 」一個計算事實):
import Mathlib
example {G : Type*} [Group G] [Fintype G] (hG : Nat.card G = 6)
(H : Subgroup G) [Fintype H] (hH : Nat.card H = 4) : False := by
have h := Subgroup.card_eq_card_mul_index H
rw [hG, hH] at h
have h4 : 4 ∣ 6 := ⟨Nat.card (G ⧸ H), by linarith⟩ -- 6 = 4 * [G:H] 不可能
exact Nat.dvd_not_unit.mp h4 rfl rfl (by decide) (by decide)
小結與練習#
小結:Subgroup G = 集合 + 封閉性證明,coercion 使它像集合又保有結構;MonoidHom = 函數 + 保運算證明,kernel/image 有現成 API;陪集把群切成等大的碎片,Lagrange 定理 \(|G| = |H| \cdot [G:H]\) 在 Mathlib 中以 Nat.card 與 G ⧸ H 陳述。
練習
- ★☆☆☆☆ 證明:
{G : Type*} [Group G] (H : Subgroup G) : (1 : G) ∈ H(提示:Subgroup.one_mem)。 - ★★☆☆☆ 證明
f.ker的封閉性:若x y ∈ f.ker則x * y ∈ f.ker(提示:map_mul後simp)。 - ★★★☆☆ 修正 6.2.2 的陷阱命題:證明
f x = 1 ↔ f x ∈ center (f.range)中正確的部分,即「 \(f(x)\) 在 \(\operatorname{im} f\) 的中心」當且僅當 \(f(x) = 1\) 不真——找出反例並把命題改對後證明。 - ★★★★☆ 證明: \(p\) 質數且 \(G\) 為 \(p\) 階群,則 \(G\) 是循環群(提示:取 \(a \neq 1\) , \(\langle a \rangle\) 的階整除 \(p\) 且大於 1)。
- ★★★★★ 結合 6.1 與本節:對
ZMod 6的加法群,列出所有子群並驗證它們的階都整除 6。