8.13.2 ACM-ICPC 数学 多项式与生成函数
一、代数基本定理
代数基本定理指出,任何复系数一元 𝑛n 次多项式在复数域上至少有一根。更具体地,任何 𝑛n 次复系数多项式方程在复数域内有且只有 𝑛n 个根(重根按重数计算)。
定理的表达方式
- 任何一个非零的 𝑛n 次复系数多项式,都正好有 𝑛n 个复数根。
- 形式上可以表示为:𝑓(𝑥)=𝑎𝑛𝑥𝑛+𝑎𝑛−1𝑥𝑛−1+…+𝑎0f(x)=anxn+an−1xn−1+…+a0
定理的推论
根据代数基本定理,一个复系数多项式 𝑓(𝑥)f(x) 一定可以唯一地分解为: 𝑓(𝑥)=𝑎𝑛(𝑥−𝑥1)𝑘1(𝑥−𝑥2)𝑘2…(𝑥−𝑥𝑡)𝑘𝑡f(x)=an(x−x1)k1(x−x2)k2…(x−xt)kt 其中,各个根 𝑥𝑖xi 均为复数,且 𝑘1+𝑘2+…+𝑘𝑡=𝑛k1+k2+…+kt=n。
二、虚根成对定理
虚根成对定理适用于实系数多项式。其主要结论是实系数多项式的根的共轭复数也是该多项式的根。
定理的证明
在代数基本定理的等式两端取共轭即可证明。如果根是实数,取共轭仍为其本身,不受影响。如果根是虚根,则虚根的共轭复数也是原多项式的根。
推论
- 实系数奇次多项式至少有一个实根,并且总共有奇数个实根。
- 实系数偶次多项式可能没有实根,但总共有偶数个实根。
- 实系数多项式一定是一次或二次实系数不可约因式的积。
三、林士谔算法
算法简介
林士谔算法用于将实系数多项式分解为二次三项式因式。这种方法避免了复数运算,逐次找出一个二次因子来求得方程的复根。
算法过程
设 𝑓(𝑥)f(x) 为待分解的多项式,将其分解为: 𝑓(𝑥)=(𝑥2+𝑝𝑥+𝑞)𝑔(𝑥)+𝑟𝑥+𝑠f(x)=(x2+px+q)g(x)+rx+s 通过迭代求解的思路,逐步调整 𝑝p 和 𝑞q 使 𝑟r 和 𝑠s 足够小。
实现代码
// a 是原始的多项式,n 是多项式次数,p 是待求的一次项,q 是待求的常数项
void Shie(double a[], int n, double *p, double *q) {
double b[n], c[n];
memset(b, 0, sizeof(b));
memset(c, 0, sizeof(c));
*p = 0;
*q = 0;
double dp = 1;
double dq = 1;
while (dp > eps || dp < -eps || dq > eps || dq < -eps) {
double p0 = *p;
double q0 = *q;
b[n - 2] = a[n];
c[n - 2] = b[n - 2];
b[n - 3] = a[n - 1] - p0 * b[n - 2];
c[n - 3] = b[n - 3] - p0 * b[n - 2];
for (int j = n - 4; j >= 0; j--) {
b[j] = a[j + 2] - p0 * b[j + 1] - q0 * b[j + 2];
c[j] = b[j] - p0 * c[j + 1] - q0 * c[j + 2];
}
double r = a[1] - p0 * b[0] - q0 * b[1];
double s = a[0] - q0 * b[0];
double rp = c[1];
double sp = b[0] - q0 * c[2];
double rq = c[0];
double sq = -q0 * c[1];
dp = (rp * s - r * sp) / (rp * sq - rq * sp);
dq = (r * sq - rq * s) / (rp * sq - rq * sp);
*p += dp;
*q += dq;
}
}
参考文献
- 林士谔. 论劈因法解高阶特征方程根值的应用问题. 数学进展, 1963(03):207-217.