第 3 章 環、體與多項式(續)#
3.4 多項式環、整除性與因式分解#
學習目標#
- 掌握多項式環 \(R[x]\) 的代數性質:次數運算、帶餘除法。
- 證明 \(F[x]\) ( \(F\) 為域)是歐幾里得整環,進而是主理想域與唯一分解域(UFD)。
- 理解 GCD、輾轉相除法與 Bezout 恆等式在多項式上的版本。
- 認識 Gauss 引理與「UFD 上本原多項式的分解」理論,說明 \(\mathbb{Z}[x]\) 也是 UFD。
- 能用 SymPy 的
Poly、div、gcd、factor完成所有對應計算。
歷史背景#
- 1801:高斯《算術研究》(Disquisitiones Arithmeticae)系統建立了整數與多項式分解的平行理論,Gauss 引理(本原多項式之積仍本原)即出於此書。
- 1840s–1850s:庫默爾與戴德金把分解理論推廣到代數整數時遭遇失敗(見 3.1 節),才發現「UFD」是一種可失去的性質——多項式環恰好保有它,這不是巧合而是結構(Gauss 引理)。
- 1930s:van der Waageden 與諾特學派把 UFD、PID、ED(歐幾里得域)的蘊含鏈整理成教科書標準內容。
- 1965–1970s:計算機代數的爆炸期。Berlekamp(1967)的有限體分解演算法、Zassenhaus(1969)的 Hensel 提升法,使「因式分解」從數學技巧變成演算法學科。SymPy 的
factor內部正是這些經典演算法的 Python 實作。 - 現代應用:RSA 的安全根基之一是「多項式分解在 \(\mathbb{F}_q[x]\) 上有多項式時間演算法、而整數分解未知」這種不對稱性;編碼理論解碼(Reed–Solomon)歸結為 \(\mathbb{F}_q[x]\) 的 GCD 計算。
timeline
title 分解理論:從手算到演算法
1801 : Gauss 引理與 Disquisitiones
1847 : 庫默爾發現 UFD 失敗(代數整數)
1871 : 戴德金以理想挽救分解
1967 : Berlekamp 演算法(有限體多項式分解)
1969 : Zassenhaus / Hensel 提升(整係數分解)
2007+ : SymPy factor 整合各經典演算法3.4.1 多項式環的基本性質#
設 \(R\) 為含單位元的交換環。 \(R[x]\) 的元素為
若 \(a_n \neq 0\) ,定義次數 \(\deg f = n\) , \(a_n\) 稱為首項係數。次數的基本規則:
證明(次數乘法公式)。 設 \(f = a_m x^m + \cdots\) 、 \(g = b_n x^n + \cdots\) , \(a_m, b_n \neq 0\) 。則 \(fg\) 的 \(m+n\) 次項係數為 \(a_m b_n\) ;因 \(R\) 無零因子, \(a_m b_n \neq 0\) ,故 \(\deg(fg) = m+n\) 。(若 \(R\) 有零因子,公式可能失敗,例如在 \((\mathbb{Z}/4)[x]\) 中 \((2x+1)(2x+1)\) 的二次項 \(4x^2 = 0\) 。) \(\blacksquare\)
推論。 若 \(R\) 是整環,則 \(R[x]\) 也是整環。反覆應用得: \(\mathbb{Z}[x]\) 、 \(F[x, y]\) 、 \(F[x_1,\dots,x_n]\) 都是整環。
帶餘除法。 當除式首項係數 \(b_n\) 是單位(例如 \(F[x]\) 中任何非零多項式)時:
定理。 \(F\) 為域, \(f, g \in F[x]\) , \(g \neq 0\) ,則存在唯一 \(q, r \in F[x]\) 使
證明(存在性,歸納法)。 對 \(\deg f\) 歸納。若 \(\deg f < \deg g\) ,取 \(q = 0, r = f\) 。否則設 \(f\) 首項 \(a_m x^m\) 、 \(g\) 首項 \(b_n x^n\) ( \(m \ge n\) ),令 \(f_1 = f - (a_m/b_n)x^{m-n}g\) ,則 \(\deg f_1 < \deg f\) ,由歸納假設 \(f_1 = q_1 g + r\) ,故 \(f = [(a_m/b_n)x^{m-n} + q_1]g + r\) 。唯一性:若 \(f = qg + r = q'g + r'\) ,則 \((q - q')g = r' - r\) ;左邊若非零次數 \(\ge \deg g\) ,右邊次數 \(< \deg g\) ,故兩邊皆零。 \(\blacksquare\)
SymPy:帶餘除法與餘式定理。
import sympy as sp
x = sp.Symbol('x')
f = sp.Poly(2*x**4 + 3*x**3 - x + 5, x, domain=sp.QQ)
g = sp.Poly(x**2 - 1, x, domain=sp.QQ)
q, r = sp.div(f, g)
print(q) # Poly(2*x**2 + 3*x + 2, x, domain=QQ)
print(r) # Poly(3*x + 7, x, domain=QQ)
# 驗證 f = q*g + r
print(sp.expand(q.as_expr()*g.as_expr() + r.as_expr() - f.as_expr()) == 0) # True
輸出說明:div 傳回商與餘式;最後一行驗證 \(f = qg + r\) 恆等成立。這就是長除法的機械化——它同時是 3.2 節商環代表元的計算核心。
3.4.2 \(F[x]\) 是歐幾里得整環 → PID → UFD#
定義(歐幾里得整環,ED)。 整環 \(R\) 稱為 ED,若存在函式 \(d: R\setminus\{0\} \to \mathbb{Z}_{\ge 0}\) (範函)使得帶餘除法成立:對 \(f, g \neq 0\) ,存在 \(q, r\) 使 \(f = qg + r\) 且 \(r = 0\) 或 \(d(r) < d(g)\) 。
\(F[x]\) 以 \(d(f) = \deg f\) 為範函即是 ED( \(\mathbb{Z}\) 以絕對值為範函也是,3.2 節 \(\mathbb{Z}[i]\) 以範數為範函也是)。性質鏈:
定理( \(F[x]\) 是 PID)。 \(F[x]\) 的每個理想 \(I\) 都是主理想,且 \(I = (d)\) ,其中 \(d = \gcd\) (次數最小者的代表)。
證明。 取 \(I\) 中次數最小的非零元 \(d\) 。對任意 \(f \in I\) ,帶餘除法 \(f = qd + r\) 給 \(r = f - qd \in I\) ,由 \(d\) 的最小性 \(r = 0\) 。故 \(I = (d)\) 。 \(\blacksquare\)
定理(Bezout 恆等式,多項式版)。 \(f, g \in F[x]\) 不全為零,則 \(\gcd(f, g)\) 存在,且存在 \(s, t \in F[x]\) 使
證明。 由上, \((f, g) = (d)\) , \(d\) 為次數最小的組合。則 \(d \mid f\) 且 \(d \mid g\) (否則 \(f\) 除以 \(d\) 有非零餘式落在理想中,矛盾),故 \(d \mid \gcd\) ;反之 \(\gcd\) 整除 \(f, g\) 即整除 \(d\) 。所以 \(d = \gcd\) ,且 \(d = sf + tg\) 。 \(\blacksquare\)
擴充歐幾里得演算法計算 \(s, t\) ,SymPy 內建:
import sympy as sp
x = sp.Symbol('x')
f = x**4 - 1
g = x**3 + x**2 + x + 1
d = sp.gcd(f, g)
print(d) # x**2 + 1
s, t, h = sp.gcdex(g, f) # h = s*g + t*f
print(sp.expand(h)) # x**2 + 1
print(sp.expand(s*g + t*f - d) == 0) # True:Bezout 恆等式成立
輸出說明: \(\gcd(x^4 - 1,\; x^3+x^2+x+1) = x^2+1\) ;gcdex 給出 Bezout 係數 \(s, t\) 使 \(s g + t f = \gcd\) ,最後一行驗證為 True。這個演算法在編碼理論中就是 Reed–Solomon 解碼的關鍵步驟(關鍵方程求解)。
3.4.3 不可約多項式與唯一分解#
定義(不可約)。 \(F[x]\) 中,次數 \(\ge 1\) 的 \(p(x)\) 稱為不可約,若它不能寫成兩個次數皆較低的多項式之積。次數 0 或 \(0\) 多項式既不約也不可約。
定理(唯一分解,UFD)。 \(F[x]\) 的每個次數 \(\ge 1\) 的多項式可寫成
其中 \(c \in F^{\times}\) 為常數、 \(p_i\) 是互不相同的首一不可約多項式。此分解在不計次序與單位倍數下唯一。
證明思路。 存在性由歸納:若 \(f\) 可約, \(f = gh\) 且 \(\deg g, \deg h < \deg f\) ,對 \(g, h\) 歸納分解。唯一性:關鍵是 Euclid 引理——
引理(Euclid)。 \(p\) 不可約且 \(p \mid ab\) ,則 \(p \mid a\) 或 \(p \mid b\) 。
證明:若 \(p \nmid a\) ,則 \(\gcd(p, a) = 1\) (因 \(p\) 的因式只有 1 與 \(p\) ),由 Bezout 存在 \(s, t\) 使 \(sp + ta = 1\) ,兩邊乘 \(b\) : \(spb + tab = b\) ; \(p\) 整除左邊兩項,故 \(p \mid b\) 。 \(\blacksquare\)
由 Euclid 引理對分解式的質因數逐一匹配即得唯一性。 \(\blacksquare\)
SymPy:分解示範(有理數體上)。
import sympy as sp
x = sp.Symbol('x')
print(sp.factor(x**4 - 5*x**2 + 4))
# (x - 2)(x - 1)(x + 1)(x + 2)
print(sp.factor(x**5 + x + 1))
# x**5 + x + 1 (在有理數上不可約,見 3.6 節 Eisenstein 的推廣判準)
print(sp.factor_list(x**4 - 5*x**2 + 4))
# ((1, [(Poly(x - 2), 1), (Poly(x - 1), 1), (Poly(x + 1), 1), (Poly(x + 2), 1)]), ...)
輸出說明:factor 傳回人類易讀的分解式;factor_list 傳回機器友善的「常數 × (不可約因式, 重數)」清單,對應 UFD 定理中的 \(c\, p_1^{e_1}\cdots p_k^{e_k}\) 。 \(x^5+x+1\) 無法在有理數上分解——我們將在 3.6 節用正式判準證明它。
3.4.4 Gauss 引理與 \(\mathbb{Z}[x]\) 的分解#
\(\mathbb{Z}\) 是 UFD 但不是域, \(\mathbb{Z}[x]\) 還是 UFD 嗎?是,靠 Gauss 引理。
定義(本原多項式)。 \(\mathbb{Z}[x]\) 中的多項式稱為本原,若其係數的最大公因數為 1。
引理(Gauss, 1801)。 兩個本原多項式之積仍為本原。
證明思路。 反設 \(fg\) 的係數都被質數 \(p\) 整除。則 \(\mathbb{F}_p[x]\) 中 \(\bar{f}\bar{g} = 0\) ;但 \(\mathbb{F}_p[x]\) 是整環,故 \(\bar{f} = 0\) 或 \(\bar{g} = 0\) ,即 \(p\) 整除 \(f\) 或 \(g\) 的所有係數,與本原性矛盾。(這個證明是「模 \(p\) 約化」技巧的第一次亮相——3.6 節 Eisenstein 判別法將再次使用它。) \(\blacksquare\)
定理(Gauss)。 \(\mathbb{Z}\) 是 UFD \(\Rightarrow\) \(\mathbb{Z}[x]\) 是 UFD。更一般地, \(R\) 是 UFD \(\Rightarrow\) \(R[x]\) 是 UFD(歸納可得 \(R[x_1,\dots,x_n]\) 都是 UFD)。
證明思路。 把 \(f \in \mathbb{Z}[x]\) 拆成「係數 GCD \(c\) 」乘「本原部分 \(\tilde f\) 」; \(c\) 在 \(\mathbb{Z}\) 中分解, \(\tilde f\) 在 \(\mathbb{Q}[x]\) 中分解(Gauss 引理保證本原多項式在 \(\mathbb{Q}[x]\) 與 \(\mathbb{Z}[x]\) 中同時不可約),兩段分解合併。 \(\blacksquare\)
注意 UFD 不一定是 PID: \(\mathbb{Q}[x, y]\) 是 UFD 但 \((x, y)\) 不是主理想(3.2 節習題 5)。這條鏈的「反例地圖」:
| 性質 | 例子 | 非例 |
|---|---|---|
| ED | \(\mathbb{Z}\) 、 \(F[x]\) 、 \(\mathbb{Z}[i]\) | — |
| PID 而非 ED | \(\mathbb{Z}[\frac{1+\sqrt{-19}}{2}]\) | — |
| UFD 而非 PID | \(\mathbb{Q}[x,y]\) | — |
| 非 UFD | \(\mathbb{Z}[\sqrt{-5}]\) (3.1 節反例) | — |
3.4.5 有限體上的分解與 Berlekamp 思想一瞥#
在 \(\mathbb{F}_q[x]\) 上分解多項式有完全不同的技巧。關鍵觀察: \(f \in \mathbb{F}_q[x]\) 無重根時,
更實用的是 \(x^{q^m} \equiv x \pmod f\) 的冪映射: \(\gcd(f, x^{q^m} - x)\) 給出次數整除 \(m\) 的不可約因式之積。Berlekamp 演算法把這變成線性代數(在 \(\mathbb{F}_q^{\deg f}\) 上求算子的不動點空間)。
SymPy 直接呼叫:
import sympy as sp
x = sp.Symbol('x')
# 在 F_2 上分解
print(sp.factor(x**8 + x**4 + x**3 + x + 1, modulus=2))
# x**8 + x**4 + x**3 + x + 1 (不可約 = AES 的體多項式)
print(sp.factor(x**15 - 1, modulus=2))
# (x + 1)(x**2 + x + 1)(x**4 + x + 1)(x**4 + x**3 + 1)(x**4 + x**3 + x**2 + x + 1)
# x^15 - 1 在 F_2 上的因式全部不可約且次數整除 4(F_16 中全體非零元的階 | 15)
輸出說明: \(x^{15}-1\) 在 \(\mathbb{F}_2\) 上分裂成五個不可約多項式,次數為 \(1, 2, 4, 4, 4\) ,總和 \(15\) ——每個不可約因式的次數 \(d\) 對應 \(\mathbb{F}_{2^d}\) 中的 15 階元素(見 3.3 節定理 3)。這正是「分解理論 ↔ 有限體結構」的雙向對話。
3.4.6 歷史註腳:分解與 RSA#
整數分解(RSA 的安全性假設)與多項式分解的命運截然不同:後者有多項式時間演算法(Berlekamp–Cantor–Zassenhaus, 1981),前者至今沒有。這個不對稱性本身就是「代數結構決定計算難度」的範例: \(\mathbb{F}_q[x]\) 有豐富的加法結構(向量空間)可被 Berlekamp 線性代數利用,而 \(\mathbb{Z}\) 的加法結構太弱。第 9.4 節將看到 Shor 演算法如何用量子計算繞過這個障礙。
SymPy 要點回顧#
| 函式 | 用途 |
|---|---|
sp.Poly(f, x, domain=...) | 建立多項式物件(可指定係數域) |
sp.div(f, g) | 帶餘除法,傳回 (商, 餘式) |
sp.gcd(f, g)、sp.gcdex(g, f) | GCD 與擴充歐幾里得(Bezout 係數) |
sp.factor(f)、sp.factor_list(f) | 有理數域上的唯一分解 |
sp.factor(f, modulus=p) | 有限體 \(\mathbb{F}_p\) 上的分解 |
sp.degree、sp.LC、sp.Monomial | 次數、首項係數等查詢 |
習題#
- 在 \((\mathbb{Z}/6)[x]\) 中找兩個次數 1 的多項式,其乘積次數小於 2,說明為什麼這裡的次數乘法公式失效。
- 用
sp.div計算 \(x^5 - 3x^3 + 2x - 1\) 除以 \(x^2 + x + 1\) 的商與餘式,並驗證 \(f = qg + r\) 。 - 用
sp.gcdex求出 \(\gcd(x^3 - 1, x^2 - 1)\) 與 Bezout 係數 \(s, t\) 。 - 證明: \(f \in F[x]\) 滿足 \(f(2) = 0 \iff (x - 2) \mid f\) (餘式定理),並用
sp.rem驗證 \(x^{10} - 1\) 除以 \(x - 2\) 的餘式等於 \(2^{10} - 1\) 。 - 證明 \(x^3 + x + 1\) 在 \(\mathbb{F}_2\) 上不可約(檢查無根即可,因為三次多項式可約必有一次因式),並用它構造 \(\mathbb{F}_8\) 。
- 用
sp.factor_list分解 \(x^{12} - 1\) (在 \(\mathbb{Q}\) 上),指出哪些因式對應 12 次單位根的分圓多項式(預告 4.7 節)。 - Gauss 引理練習:驗證 \(f = 2x + 3\) 、 \(g = 3x + 4\) 都本原,其積 \(6x^2 + 17x + 12\) 也本原;再舉一對非本原多項式使乘積非本原。
- 演算法題:實作簡化版 Berlekamp 的第一步——給定無重根的 \(f \in \mathbb{F}_2[x]\) ,計算 \(x^{2^k} \bmod f\) (用
sp.rem與反覆平方),並計算 \(\gcd(f, x^{2^k} - x)\) ,觀察何時出現非平凡因式。
前後節連結: 上一節 3.3-整環、體與體的特徵;下一節 3.5-體擴張與克羅內克定理