节 1.3 最大公因式和辗转相除法
和整数的最大公因数类似,在一元多项式的研究中,多项式的最大公因式具有重要地位,其研究方法和结论也是类似的。
子节 1.3.1 最大公因式的一般理论
根据项 2,若 和 都是 和 的最大公因式,则 和 相互整除,即 和 相伴。另一方面,若 和 相伴,则此时 和 只相差一个非0常数的数乘, 和 一定同时满足或同时不满足最大公因式的两个条件。总之, 和 的所有最大公因式构成一个相伴多项式类。为了简单,当这个相伴类不是只有0多项式时,我们选择其中唯一的一个首1多项式做为最大公因式的代表,并将其记为
特别地,约定 。
有了最大公因式的定义后,我们需要考虑的首要问题是最大公因式是否存在。其次,如果最大公因式存在,应该如何求出给定的两个多项式的最大公因式?直觉告诉我们,当 和 的次数越小,其最大公因式应该越好求。下面的引理提供了一种不改变最大公因式的操作,我们将利用这种操作来降低多项式的次数,把问题向简单的方向转化。
引理 1.3.2.
于是我们将求 最大公因式的问题转化为求 最大公因式的问题, 此时 ,即在此过程中多项式的总次数严格降低。不断重复上述过程直到我们求出最大公因式。由于每次总次数都严格降低,所以这个过程一定在有限步后转化到 项 1 ,即可以求出我们要的最大公因式。上述求最大公因式的方法称为 辗转相除法,或 Euclidean算法。
例 1.3.3. 简单算例,暂缺.
利用辗转相除法,接下来给出最大公因式的一个常用结论。由于这个结论的重要,我们将给出3种不同的证明方法。
定理 1.3.4. Bézout定理.
证明.
不妨设 。对 的次数使用归纳法。
归纳法的初始情形为 。此时容易看到
取
接下来讨论 的情况。对 的次数使用数学归纳法,假设命题对最低次数小于 次数的多项式组结论都成立。
因为 ,根据带余除法知存在 ,使得
其中 。
根据归纳假设:对于 和 ,存在 ,使得
其中 。
证明.
只考虑非平凡的情况,即 且 。易知平凡情况下结论成立。
构造集合
因为非0多项式的次数都是自然数,所以 中必然存在次数最小的非0多项式。同时注意到 关于数乘运算封闭,所以 中至少存在一个次数最低且首项系数为一的(非0)多项式,记这个多项式为 。由于 , 于是存在 ,使得
下面我们说明这样取出的 就是 。
综上,结论成立。
证明.
本证明中也只考虑非平凡的情况,即 且 。易知平凡情况下结论成立。
上面的3种证明本质上是相同的。第1种证明使用了数学归纳法,算法实现上需要使用递归;第2种证明中反证法部分实际上可以对应一种迭代算法,每次迭代后产生的多项式次数都严格下降,直到达到最小次数多项式(或者说下次迭代产生0多项式)为止;第3种方法适合于手动计算。请同学们比较理解。
来看一个具体的例子。在例子中,我们用第3种方法算出Bézout等式的系数。
例 1.3.5.
设
,求 ,使得
解答.
手工计算最大公因式及相应的 可以使用下面的计算格式。
所以
又
因此
定理 1.3.6.
例 1.3.7.
设 , , 。证明:
- 思考:最大公因式与数域有关吗?
最大公因式的定义可以推广到多个多项式。
定义 1.3.8.
在计算多个多项式的最大公因式时,通常我们采取两个两个求最大公因式的方式,我们以三个多项式为例来说明问题。
命题 1.3.9.
证明.
设 ,则
由此推出
另一方面,若 ,由 得
注意到 ,所以
即 。因此 是 的一个最大公因式。又 是首一多项式,故
同理可得另一等式。
上述命题的结论可以推广到多个多项式。该结论表明:求多个多项式的最大公因式时,可先求任意两个多项式的最大公因式,再用同样方法继续,而不必顾及先后顺序。
子节 1.3.2 互素
两个多项式的最大公因式为0次多项式是一种极端情况,这种极端情况有很多很好的性质,具有特殊意义,有必要单独研究。
定义 1.3.10.
定理 1.3.11.
下面是互素多项式具有的一些好性质。请注意思考,当没有互素条件时命题不成立的原因是什么,并尝试给出相应的反例。
命题 1.3.12.
证明.
命题 1.3.13.
证明.
命题 1.3.14.
证明.
命题 1.3.15.
证明.
子节 1.3.3 最小公倍式
最小公倍式是与最大公因式相对应的一个概念,二者之间有着密切联系。
定义 1.3.16.
最小公倍式和最大公因式之间的关系可以由下述结论描述。
命题 1.3.17.
子节 1.3.4 孙子定理/中国剩余定理*
作为辗转相除法和最大公因式的一个应用,这里我们简要介绍一个著名定理——孙子定理的结论和证明。孙子定理也称为中国剩余定理,是求解同余方程组的一般方法。同余方程组的相关问题会在后续课程《抽象代数》中进一步展开。
在《孙子算经》一书中有一道著名的“孙子问题”:“今有物不知其数,三三数之剩二,五五数之剩三,七七数之剩二。问物几何?”用现代的数学语言翻译过来,孙子问题也可叙述为:现有一个未知整数 , 除以3的余数为2,除以5的余数为3,除以7的余数为2,问 是多少?
为证明一般结论,我们先来看一个简单的特殊情形。
引理 1.3.18.
证明.
定理 1.3.19. 孙子定理.
证明.
例 1.3.20.
求一个次数最低的多项式 ,使 除 的余式分别为 。
解答.
下面我们利用孙子定理来证明一个重要结论。
定理 1.3.21.
证明.
定理 1.3.22.
证明.
只需证明2可以推出1成立。不妨设 ,则 均是次数不超过 的多项式。
跟据定理 1.3.21中满足条件多项式的唯一性,可知 ,即命题1成立。
备注 1.3.23.
定理 1.3.22的条件中要求 ,这是为了保证 是无限域。在后续课程《抽象代数》中,除复数域 的子域外,还有很多其它的域。其中较为有代表性的就是有限域 。当系数域 为有限域时,多项式的表达式相等与函数相等就不再等价了。有兴趣的同学可以搜索一下相关的知识。
当 时, 和 对应于坐标平面中的两个点,此时Lagrange插值多项式则对应于一条直线方程,即此时 定理 1.3.21等价于初等几何里的一个常用事实:平面中的两个不同点确定一条直线。( 相当于排除了所确定的直线垂直于 轴这种特殊情况。)
例 1.3.24. 多项式系数表示与值表示的关系.
取定 时,次数不超过1的多项式值表示 和系数表示 可以通过下面的关系式进行换算:
取定 (其中 )时,次数不超过3的多项式值表示 和系数表示 可以通过下面的关系式进行换算:
请同学们观察其中的规律。
总结一下:多项式有两种常用的表示方式,系数表示和值表示。系数表示较为直观、简洁,直接对应函数表达式,可以利用函数表达式算出任意一点的函数值;对于值表示的多项式,除了给定的点外,其它点的函数值往往还需要转化为系数表示法所对应的函数表达式来求,但值表示在计算多项式乘法时有较为明显的优势。著名的离散Fourier变换(DFT)实现的就是这两种表示方法之间的转化,有兴趣的同学可以搜索相关的材料做进一步的了解。这个问题后续我们还会进一步涉及到。
子节 1.3.5 Sage相关
接下来我们用sage代码来实践一下本节中学到的内容。
Sage中直接提供的计算最大公因式的命令为gcd(),命令名gcd来自于“最大公因式”的英文名称 “greatest common divisor”。
xxxxxxxxxx
pretty_print_default(True);
P.<x> = PolynomialRing(QQ);
f = 6*x^5+4*x^4+7*x^3+8*x^2+10*x+7;
g = 3*x^4-x^3+3*x^2+4;
gcd(f,g),f.gcd(g)
3个以上多项式的最大公因式也可以用gcd()命令来求。
xxxxxxxxxx
h = x^3-1;
gcd([f,g,h])
xxxxxxxxxx
xgcd(f,g)
xxxxxxxxxx
f.xgcd(g)
和gcd()命令不同的是xgcd()不支持3个及以上的多项式。
xxxxxxxxxx
def ex_gcd_re(f,g):
"""
用递归算法计算并返回Bézout等式中d,u,v
当直接输入f为常数时本程序会报错,因为直接输入的常数不会被识别为多项式,故无法调用与多项式相关的函数。
"""
if g == 0:
if f != 0:
d = f.monic();
#取d为与f相伴的首一多项式
u = 1/f.leading_coefficient();
#leading coefficient是首项系数
v = 0;
else:
d,u,v = 0,0,0;
else: # g != 0
q,r = f.quo_rem(g);
d,u1,v1 = ex_gcd_re(g,r);
# 递归调用函数,相当于第一种证明中使用归纳法的一步
u = v1;
v = u1 - q*v1;
return d,u,v
#算例
pretty_print_default(True);
P.<x> = PolynomialRing(QQ);
f = 6*x^5+4*x^4+7*x^3+8*x^2+10*x+7;
g = 3*x^4-x^3+3*x^2+4;
ex_gcd_re(f,g)
xxxxxxxxxx
def ex_gcd_nore(f,g):
"""
利用非递归算法计算Bézout等式中d,u,v的函数
"""
u, u1, v, v1 = 1, 0, 0, 1;
while g != 0:
d = g;
q, f, g = f // g, g, f % g;
u, u1 = u1, u - q * u1;
v, v1 = v1, v - q * v1;
if d != 0:
c = d.leading_coefficient();
d,u,v = d/c,u/c,v/c;
return d, u, v
#算例
ex_gcd_nore(f,g)
Sage中求最小公倍式的命令为lcm(),命令名来源于“最小公倍式”的英文名称“least common multiple”。
xxxxxxxxxx
f.lcm(g),lcm(f,g)
练习 1.3.6 练习
基础题.
1.
2.
3.
4.
设 ,证明下面几点等价:
; ; ; 。
5.
提高题.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
Sage相关.
16.
实现本节中使用的sage自带程序。
xxxxxxxxxx
17.
xxxxxxxxxx
18.
xxxxxxxxxx