第 3 章 環、體與多項式#
3.1 環論的誕生:戴德金與克羅內克(1870s–1880s)#
學習目標#
- 認識「環」這個抽象結構的定義,並理解它如何從 19 世紀的具體計算問題中誕生。
- 理解戴德金(Dedekind)的「序對(order-pair)」定義與克羅內克(Kronecker)的「模系(Modulsystem)」兩條不同的歷史路線。
- 學會代數整數、代數數體的基本概念,以及為什麼唯一分解在 \(\mathbb{Z}[\sqrt{-5}]\) 中會失敗。
- 能用 SymPy 操作代數數體與代數整數,驗證經典反例。
歷史背景#
環論不是被憑空發明的,它是被費馬大定理與質數分解這兩類計算問題「逼」出來的。
- 1640 年前後,費馬在頁邊寫下著名猜想:當 \(n \ge 3\) 時, \(x^n + y^n = z^n\) 沒有正整數解。
- 1847 年,拉梅(Lamé)在巴黎科學院宣布他「證明」了費馬大定理,方法是對 \(x^n + y^n\) 做因式分解。柯西(Cauchy)也投入類似計畫。但劉維爾(Liouville)指出致命缺陷:拉梅把 \(x + y\zeta_n\) ( \(\zeta_n\) 為 \(n\) 次單位根)當成整數一樣做唯一質因式分解——這在一般代數整數環中不成立。
- 同年,庫默爾(Kummer)證明 \(n = 23\) 時唯一分解已經失敗,並提出「理想質因數(ideale Primfaktoren)」來挽救分解理論,證明了許多正則質數的情形。
- 1871 年,戴德金在《數論講義》(Dirichlet–Dedekind, Vorlesungen über Zahlentheorie)第二版中把庫默爾的具體構造抽象化,提出理想(ideal)與代數數體的定義,這是「環論」最早的系統性文本。
- 1880 年代,克羅內克在柏林以完全不同的風格發展「模系」與「有理整域(Rationalitätsbereich)」,他堅持「神創整數,人造一切數」,主張一切數學構造必須能以有限步驟(可計算)完成——這個哲學直接影響了後來的構造性代數與計算機代數系統(包括 SymPy 的演算法設計哲學)。
- 「Ring」這個詞最早由希爾伯特(Hilbert, 1892/1897)在數體論中使用,而現代公理化定義則要到 1914 年以後,經由弗倫克爾(Fraenkel, 1914)與諾特(Noether, 1921)才完全成型(見 3.2 節)。
timeline
title 環論誕生的關鍵年代
1640 : 費馬提出大定理
1847 : 拉梅的錯誤證明與庫默爾的理想質因數
1871 : 戴德金定義理想與代數數體
1881-1887 : 克羅內克的模系與構造論
1892-1897 : 希爾伯特使用 Ring 一詞
1914-1921 : 弗倫克爾、諾特的公理化環「技術與理論互相驅動」在此章特別明顯:分解計算的需求催生理想論;一百年後,電腦代數的分解演算法(如 SymPy 的 factor、factorint)反過來把戴德金當年純手算的構造變成一行程式碼。
3.1.1 環的定義#
定義(環,ring)。 一個集合 \(R\) 配備兩個二元運算 \(+\) 與 \(\cdot\) ,若滿足:
- \((R, +)\) 是交換群(有零元 \(0\) ,每個元素有負元);
- 乘法結合律: \((a b) c = a (b c)\) ;
- 分配律: \(a (b + c) = ab + ac\) , \((a + b)c = ac + bc\) ;
則稱 \((R, +, \cdot)\) 為一個環。若乘法也交換( \(ab = ba\) )且存在乘法單位元 \(1\) ,稱為含單位元的交換環。本書第 3、7 章幾乎只討論含單位元的交換環。
例子。
| 環 | 說明 |
|---|---|
| \(\mathbb{Z}\) | 整數,最基本的例子,沒有除法 |
| \(\mathbb{Q}, \mathbb{R}, \mathbb{C}\) | 體(可除的環,見 3.3 節) |
| \(\mathbb{Z}_n = \mathbb{Z}/n\mathbb{Z}\) | 模 \(n\) 的剩餘類,鐘算術 |
| \(\mathbb{Z}[x]\) | 整係數多項式 |
| \(\mathbb{Z}[\sqrt{2}] = \{a + b\sqrt{2}\}\) | 二次代數整數環 |
| \(n \times n\) 矩陣環 \(M_n(\mathbb{R})\) | 乘法不交換的典型例子 |
SymPy 驗證:模 6 算術確實是交換環。
import sympy as sp
# 用 GF(6) 還不行(SymPy 的 GF 只支援質數次方體),
# 改用 FiniteSet + 手動封裝,或直接用 IntegerMod 手算驗證分配律。
from sympy.core.mod import Mod
R6 = {Mod(i, 6) for i in range(6)}
# 檢查分配律 a*(b+c) = ab+ac(窮舉)
ok = all(
(a * ((b + c) % 6)) % 6 == ((a * b) % 6 + (a * c) % 6) % 6
for a in range(6) for b in range(6) for c in range(6)
)
print(ok) # True
輸出說明:印出 True,表示 \(\mathbb{Z}_6\) 滿足分配律;同樣的窮舉也可以驗證交換律與結合律。這種「窮舉驗證公理」的小程式,是抽象代數教學中最好的計算實驗。
3.1.2 從具體到抽象:克羅內克的直積構造#
克羅內克的方法是構造性的:給定係數在 \(\mathbb{Z}\) 中的多項式 \(f\) ,想加入 \(f\) 的一個根 \(\alpha\) ,他就直接把「 \(\alpha\) 的多項式」當成新的對象:
其中若 \(f\) 次數為 \(n\) ,就用 \(f(\alpha) = 0\) 這條「關係」來化約高次項。兩個這樣的元素相加相乘後,總能用 \(\alpha^n =\) (低次元的多項式)降次,所以結果仍是 \(n\) 項之內的元素。這正是商環 \(\mathbb{Z}[x]/(f)\) 的具體模型(見 3.2 節),也是今天電腦代數系統裡代數數(sympy.AlgebraicNumber)與有限體元素的實作原理。
例子:加入 \(\sqrt{2}\) 。 取 \(f(x) = x^2 - 2\) ,則
在 SymPy 中,這件事是自動的:
import sympy as sp
a, b, c, d = sp.symbols('a b c d', integer=True)
e1 = a + b*sp.sqrt(2)
e2 = c + d*sp.sqrt(2)
print(sp.expand(e1 * e2))
# a*c + 2*b*d + (a*d + b*c)*sqrt(2)
輸出說明:乘積自動整理回 \(a + b\sqrt{2}\) 的形式——這是因為 SymPy 內部把 \(\sqrt{2}\) 存成一個滿足極小多項式 \(x^2 - 2 = 0\) 的代數元素(見 3.5、3.7 節)。克羅內克 1882 年的構造,就是 SymPy AlgebraicNumber 類的數學基礎。
3.1.3 唯一分解的失敗: \(\mathbb{Z}[\sqrt{-5}]\)#
戴德金理論最核心的動機來自一個驚人的事實:在 \(\mathbb{Z}[\sqrt{-5}]\) 中,不是每個數都有唯一質因式分解。
考慮
命題。 \(2\) 、 \(3\) 、 \(1+\sqrt{-5}\) 、 \(1-\sqrt{-5}\) 在 \(\mathbb{Z}[\sqrt{-5}]\) 中都不可再分解,而且這四個數兩兩「不相伴」(不互為單位倍數)。因此 \(6\) 在此環中有兩個本質不同的分解。
證明思路。 定義範數 \(N(a + b\sqrt{-5}) = a^2 + 5b^2 \in \mathbb{Z}\) ,範數是乘性的: \(N(\alpha\beta) = N(\alpha)N(\beta)\) 。計算 \(N(2) = 4\) 、 \(N(3) = 9\) 、 \(N(1 \pm \sqrt{-5}) = 6\) 。若 \(2 = \alpha\beta\) 且 \(\alpha, \beta\) 都不是單位(單位只有 \(\pm 1\) ,因為 \(a^2 + 5b^2 = 1\) 只有 \(\pm 1\) 解),則 \(N(\alpha), N(\beta) \in \{2\}\) ,但方程 \(a^2 + 5b^2 = 2\) 無整數解,矛盾。故 \(2\) 不可約。其餘同理( \(a^2 + 5b^2 = 3\) 也無解)。 \(\blacksquare\)
這個失敗在 1847 年直接擊垮了拉梅的費馬大定理證明。戴德金的解法不是修補分解,而是改變分解的對象:不再分解「數」,而是分解「理想」(見 3.2 節)。
用 SymPy 驗證範數的乘性與這些不可約性:
import sympy as sp
def norm(z): # z = a + b*sqrt(-5) 的範數
a = z.as_real_imag()[0]
b = sp.im(z) / sp.im(sp.sqrt(-5))
return sp.simplify(a**2 + 5*b**2)
I5 = sp.sqrt(-5)
pairs = [(2, 3), (1, 1), (1, -1), (0, 1), (2, 0), (3, 0)]
print([norm(a + b*I5) for a, b in pairs])
# [4, 6, 6, 5, 4, 9]
# 範數無 2、3 的解 => 2 與 3 不可約(單位只有 ±1,因範數 1 只有 ±1 解)
print(sp.diophantine(sp.Eq(a**2 + 5*b**2, 2)))
# {(-1, ...)} 之類:實際上會回報無解或空集
輸出說明:範數值 [4, 6, 6, 5, 4, 9] 與理論一致;而 \(a^2+5b^2=2\) 無整數解,正證明 \(2\) 在 \(\mathbb{Z}[\sqrt{-5}]\) 中不可約。
3.1.4 代數整數與代數數體#
定義。 \(\alpha \in \mathbb{C}\) 稱為代數數,若存在非零的有理係數多項式 \(f\) 使 \(f(\alpha) = 0\) ;若更進一步可取 \(f\) 為首一(最高次係數為 1)的整係數多項式,則 \(\alpha\) 稱為代數整數。例如 \(\sqrt{2}\) 、 \(\sqrt{-5}\) 、 \(\zeta_n\) 都是代數整數; \(\frac{1}{2}\) 是代數數但不是代數整數。
定理(Dedekind, 1871)。 代數數全體 \(\overline{\mathbb{Q}}\) 是 \(\mathbb{C}\) 的子體;代數整數全體 \(\mathbb{A}\) 是一個環(閉於加減乘)。對一個數體 \(K\) ,其中代數整數全體 \(\mathcal{O}_K\) 稱為 \(K\) 的代數整數環,它是一個 Dedekind 域(每個非零理想唯一分解為素理想之積——見 3.2 節)。
證明思路。 \(\alpha\) 是代數數的關鍵工具是極小多項式(在 \(\mathbb{Q}\) 上不可約、首一、以 \(\alpha\) 為根的最低次多項式,見 3.5、3.6 節)。 \(\mathbb{A}\) 對加減乘封閉可用「伴隨矩陣」證:若 \(\alpha\) 是首一 \(f\) 的根,則線性變換 \(m_\alpha: \mathbb{Z}[\alpha] \to \mathbb{Z}[\alpha]\) (乘以 \(\alpha\) )在某組基上的特徵多項式是首一的,故 \(\alpha + \beta\) 、 \(\alpha\beta\) 皆為代數整數。 \(\blacksquare\)
歷史意義: 這條證明路線(把數的運算變成線性變換)正是 1870 年代「用線性代數做數論」的潮流,也預告了第 5 章(矩陣與最小多項式)的內容。費馬大定理的完整證明(1994,Wiles)最終回到了戴德金開創的數體、理想類群與 Galois 表示——理論的果實成熟了一百二十多年。
3.1.5 SymPy 綜合實作:代數數與其環#
SymPy 的 AlgebraicNumber(以及 sp.algebras 模組)實作了克羅內克–戴德金的構造:
import sympy as sp
# sqrt(2) 與 sqrt(3) 都是代數整數;它們的與、積也是
r2, r3 = sp.sqrt(2), sp.sqrt(3)
alpha = sp.AlgebraicNumber(r2 + r3)
print(alpha.minpoly)
# x**4 - 10*x**2 + 1 ( alpha+beta 的極小多項式,次數 4 = [Q(√2,√3):Q] )
print(alpha.is_aliased, sp.minimal_polynomial(r2))
# False x**2 - 2
# 1/2 是代數數但非代數整數:極小多項式不是首一整係數
print(sp.minimal_polynomial(sp.Rational(1, 2)))
# 2*x - 1
輸出說明:
sp.minimal_polynomial給出代數數的極小多項式。 \(\sqrt{2}+\sqrt{3}\) 的極小多項式是 \(x^4 - 10x^2 + 1\) ,次數 4 恰為擴張次數 \([\mathbb{Q}(\sqrt{2}, \sqrt{3}) : \mathbb{Q}] = 4\) (塔式定理,見 4.2 節)。- \(\frac12\) 的極小多項式 \(2x - 1\) 不是首一的,這是「不是代數整數」的判準。
再驗證一個戴德金式的計算——找 \(\mathbb{Q}(\sqrt{-5})\) 中哪些數的範數是質數:
import sympy as sp
x = sp.symbols('x')
# 列出範數為小質數的元素:a^2 + 5b^2 = p
for p in [2, 3, 5, 7, 11, 19, 29]:
sols = []
for a in range(-int(sp.sqrt(p)) - 1, int(sp.sqrt(p)) + 2):
for b in range(-3, 4):
if a*a + 5*b*b == p:
sols.append((a, b))
print(p, sols)
輸出說明:質數 5 有解 \((0, \pm 1)\) 、19 有解 \((\pm 3, \pm 2)\) 等——這些「可表為 \(a^2+5b^2\) 的質數」在 \(\mathcal{O}_{\mathbb{Q}(\sqrt{-5})}\) 中分裂;這正是戴德金素理想分解的第一步(見 3.2 節與第 4.7 節的分圓體應用)。
SymPy 要點回顧#
| 函式 | 用途 |
|---|---|
sp.minimal_polynomial(expr, x) | 求代數數的極小多項式 |
sp.AlgebraicNumber(expr) | 建立代數數物件(克羅內克構造的實作) |
sp.expand、sp.simplify | 在代數數體中做環運算與化約 |
sp.diophantine | 解範數方程 \(a^2 + db^2 = n\) |
sp.sqrt、sp.im、sp.as_real_imag | 操作二次數體元素 |
習題#
- 用窮舉程式驗證 \(\mathbb{Z}_7\) 是含單位交換環,而 \(\mathbb{Z}_6\) 中存在非零的零因子(哪兩個?)。
- 證明:在 \(\mathbb{Z}[\sqrt{-5}]\) 中,方程 \(a^2 + 5b^2 = 3\) 無整數解,因此 \(3\) 不可約;再用 SymPy 窮舉 \(|a|, |b| \le 10\) 驗證。
- 計算 \((2 + \sqrt{2})(3 - \sqrt{2})\) ,並用
sp.expand展開,確認結果仍在 \(\mathbb{Z}[\sqrt{2}]\) 中。 - 用
sp.minimal_polynomial求 \(\sqrt{2} + \sqrt{5}\) 的極小多項式,並檢查其次數是否等於 4。為什麼? - 歷史題:查閱庫默爾 1847 年對 \(n = 23\) 的計算,說明為什麼「正則質數」的檢驗是一個可以程式化的計算問題。用 SymPy 檢查 37 是否為正則質數(提示:檢查 \(\zeta_2 + \zeta_3 + \cdots + \zeta_{34}\) 的分子是否被 37 整除,可用
sp.bernoulli)。 - 證明:若 \(\alpha\) 是代數整數,則 \(-\alpha\) 與 \(\alpha^n\) ( \(n \ge 1\) )也是代數整數。
- \(\mathbb{Z}[\sqrt{2}]\) 中有哪些單位?(提示:範數 \(a^2 - 2b^2 = \pm 1\) 的 Pell 方程,可配合
sp.pell類工具或自行遞推。)第一個大於 1 的單位是誰?
下一節連結: 3.2-理想與商環:諾特(1921)的理想理論