多项式 · 符号计算的主力

计算机代数系统里,绝大多数硬核操作最后都落到多项式上。这一章讲清多项式的展开、合并、次数与系数,专门的 Poly 对象,以及最关键的多项式除法——它是下一章 GCD 与因式分解的地基。

作者 David更新于 第 6 篇(共 18 篇)

多项式 · 符号计算的主力

进入代数引擎。如果说表达式树是符号计算的骨架,那多项式就是它的肌肉——计算机代数里绝大多数硬核算法,最后都归结到多项式的操作:因式分解、解方程、符号积分、Gröbner 基…… 无一例外。先把这块主力吃透。

展开与合并:多项式的两个方向

多项式最基本的两个操作是一对反义词:展开(把乘积乘开)和合并 / 因式分解(把它收拢)。

from sympy import *
x, y = symbols('x y')

print(expand((x + 1)**3))            # x**3 + 3*x**2 + 3*x + 1
print(collect(x**2*y + x**2 + x*y, x))   # x**2*(y + 1) + x*y  —— 按 x 的幂合并

expand 把 (x+1)3(x+1)^3 乘成标准的升幂 / 降幂形式;collect 则把一个多元表达式按某个变量的幂次归拢。这两个是你整理多项式最顺手的工具。

次数与系数:读取多项式的信息

一个多项式,最重要的元数据是次数和系数:

print(degree(x**5 - 3*x + 1, x))          # 5    —— 最高次
print(Poly(3*x**2 + 2*x + 1, x).all_coeffs())   # [3, 2, 1]  —— 各次系数

degree 给最高次数,all_coeffs 从高次到低次列出所有系数。别小看这俩:很多算法(判断线性 / 二次、估计复杂度、选择解法)第一步就是看次数和系数。

Poly 对象:高效的专用表示

你平时写的 x**2 + 2*x + 1 是一棵通用表达式树,灵活但做多项式运算时不够快。SymPy 提供一个专用的 Poly 对象,把多项式存成更紧凑高效的形式:

p = Poly(x**2 + 2*x + 1, x)
print(p)          # Poly(x**2 + 2*x + 1, x, domain='ZZ')

注意那个 domain='ZZ'——它是多项式的「系数从哪个数集来」。 ZZ 是整数、QQ 是有理数、RR 是实数。系数域(coefficient domain)是计算机代数一个核心概念:同一个多项式,在不同的域上,能不能因式分解、GCD 是什么,答案可能完全不同(下一章 x2−2x^2-2 在有理数域不可分、在含 2\sqrt2 的域可分,就是活例子)。Poly 显式带着域,算得又快又不含糊。

底层实现上,多项式还有稠密(记下每一项,含系数为 0 的)和稀疏(只记非零项)两种表示——像 x1000+1x^{1000}+1 这种,稀疏表示能省掉中间 999 个零,天壤之别。这些 Poly 都替你管好了。

多项式除法:GCD 与因式分解的地基

整数能做带余除法(17=5×3+217 = 5\times3 + 2),多项式也能——而且这是后面一切的地基:

quotient, remainder = div(x**3 - 1, x - 1)
print(quotient, '...', remainder)     # x**2 + x + 1 ... 0

x3−1x^3-1 除以 x−1x-1,商是 x2+x+1x^2+x+1,余数是 00——余数为零,说明 x−1x-1 整除 x3−1x^3-1,即 x−1x-1 是它的一个因式。这个「带余除法」是多项式版的欧几里得算法的核心:

就像求两个整数的最大公因数靠反复取余(辗转相除),求两个多项式的最大公因式,也靠反复做多项式除法取余。

下一章的 GCD 与因式分解,全都站在这个「多项式除法」上。多项式除法之于符号代数,就像加减乘除之于算术——最不起眼,却支撑一切。

小结与下一章

多项式是符号计算的主力:展开 expand / 合并 collect 是一对基本方向;degree、all_coeffs 读取次数与系数;专用的 Poly 对象带着系数域(ZZ/QQ/…)高效运算,底层还有稠密 / 稀疏表示之分。最关键的是多项式带余除法 div——它是欧几里得算法、GCD、因式分解的共同地基。

有了多项式除法,我们就能问两个多项式的「公因子」问题了。这把钥匙能打开两扇门:因式分解(把多项式拆成不可约的积)和最大公因式(约分、化简的基础)。下一章一起看。👉 因式分解与最大公因式。

参考文献

  • [1] von zur Gathen & Gerhard.《Modern Computer Algebra》, ch. 2-4 —— 多项式表示与算术。
  • [2] Knuth.《TAOCP, Vol. 2》, §4.6 —— 多项式运算。
  • [3] SymPy 文档.「Polynomials Manipulation Module.」https://docs.sympy.org/latest/modules/polys/index.html

本页目录