Homework from Zhejiang
本题希望解决的问题是:给定两个(首一)多项式 \(f,g\),设 \(n=\deg f,m=\deg g\)。求出 \(\prod_{i=1}^n \prod_{j=1}^m (x_i+y_j)\),这里 \(x_i,y_j\) 是 \(f,g\) 的所有根。
首先需要理解一下为什么这个式子能求出来:若 \(f,g\) 的系数都属于数域 \(K\) 内,为何答案也属于数域 \(K\) 内?这是因为,设 \(h(x)=\prod_{j=1}^m (x+y_j)\),则 \([x^k]h=(-1)^{m-k}[x^k]g\),所以 \(h\) 系数也属于 \(K\) 内。而 \(\prod_{i=1}^n h(x_i)\) 关于 \(x_i\) 对称,故可以表为对称多项式的乘积之和,所以答案也会属于 \(K\) 内。
有了这个理解再看原问题,其实就容易了,因为当 \(f(x_i)=0\) 时可以把 \(h\) 减去若干倍的 \(f\),答案不变。所以整个题的做法是:
- 若 \(n>m\),交换 \(f,g\)。
- 写出 \(h(x)\)(就是 \(g\) 的某些次系数取反)并把答案化成 \(\prod_{i=1}^n h(x_i)\)。
- 将 \(h\) 对 \(f\) 取模(若不首一了就把 \(h\) 和答案乘上一个系数)。
- 递归,直到 \(\min(n,m)=0\)。
时间复杂度 \(O(nm)\)。
什么是结式?
在上面一题的很多网上的题解里都提到了“结式”的概念,那什么是结式呢?其实跟本题一点关系都没有。两个多项式 \(f(x)=\sum_{i=0}^n a_ix^{n-i},g(x)=\sum_{i=0}^m b_ix^{m-i}\) 结式定义为(不妨设 \(a_0=b_0=1\))
\[R(f,g)=\begin{vmatrix} a_0 & a_1 & \dots & a_n & & & & \\ & a_0 & a_1 & \dots & a_n & & & \\ & & \ddots & \ddots & \ddots & \ddots & & \\ & & & a_0 & a_1 & a_2 & \dots & a_n\\ b_0 & b_1 & \dots & b_m & & & & \\ & b_0 & b_1 & \dots & b_m & & & \\ & & \ddots & \ddots & \ddots & \ddots & & \\ & & & b_0 & b_1 & b_2 & \dots & b_m\\ \end{vmatrix}\triangleq |B| \]其中 \(f\) 的系数出现 \(m\) 行,\(g\) 的系数出现 \(n\) 行。
结式有什么组合意义呢?容易发现,\(R(f,g)=0\iff (f(x),g(x))\ne 1\)。如果多项式的系数 \(a_i,b_j\) 不属于欧几里得整环(例如多元多项式环),则这个行列式可以计算,但辗转相除就做不了了。
这个行列式的求值方法可以类比循环矩阵行列式,毕竟前 \(n\) 行和后 \(m\) 行的确是循环的。同时,系数没有从 \(x^n\) 循环到 \(x^1\),所以给它乘上的范德蒙德矩阵也不需要是 DFT。为了结果尽量简单,好想法是选择 \(f,g\) 的 \(n+m\) 个根列范德蒙德矩阵,这样得到的结果会是分块对角的。
取 \((n+m)\times (n+m)\) 矩阵 \(A\),\(A_{ij}=y_j^{n+m-i}\),其中 \(y_1\sim y_m\) 为 \(g\) 的根,\(y_{m+1}\sim y_{n+m}\) 为 \(f\) 的根(又记为 \(x_1\sim x_n\)),则
\[BA=\begin{bmatrix}Y & 0\\0 & X\end{bmatrix} \]这里 \(Y\) 为 \(m\times m\) 矩阵,\(Y_{ij}=y_j^{m-i}f(y_j)\);\(X\) 为 \(n\times n\) 矩阵,\(X_{ij}=x_j^{n-i}g(x_j)\)。
则
\[|BA|=|Y||X|=\prod_{1\le i\le m}f(y_i)\prod_{1\le j<i\le m}(y_j-y_i)\prod_{1\le i\le n}g(x_i)\prod_{1\le j<i\le n}(x_j-x_i) \]\[|A|=\prod_{1\le j<i\le m}(y_j-y_i)\prod_{1\le j<i\le n}(x_j-x_i)\prod_{1\le j\le m,1\le i\le n}(y_j-x_i) \]再注意到 \(\prod_{1\le i\le n}(y_j-x_i)=f(y_j)\),就有
\[R(f,g)=|B|=\prod_{1\le i\le n}g(x_i) \]有重根是不是会出问题?事实上,可以把上面的 \(x_i,y_j\) 看成不定元,则上面都是对多元多项式在操作,一定有消去律,所以有重根上面的推导也成立。
所以对于两个首一多项式 \(f,g\),我们得到了结论:
\[R(f,g)=\prod_{1\le i\le n}g(x_i) \]不难看出以下性质:
- \(R(f,g)=(-1)^{nm}R(g,f)\)
- \(R(fg,h)=R(f,h)R(g,h)\)
- \(R(f,gh)=R(f,g)R(f,h)\)
- 对于首一多项式 \(f\),\(R(f,g)=R(f,g+hf)\)
所以结式的计算也可以用多项式欧几里得的做法 \(O(nm)\) 算出。这个算法是“结式”这个东西和上题唯一的联系了。
总结
笔者当年看到 Homework from Zhejiang 一题时,被某些题解中提到的“用结式计算”或者“本题用到了结式”劝退了。但其实,本题跟结式除了最终的算法形式上相同,没有别的联系:结式的定义(这个行列式的值)对于做出题目没有任何关系,而结式的计算确实跟本题的算法相同,但讲清这个算法也不需要知道结式是什么,这是一个关于多项式根相关式子的普适性算法。
以一道题目去拓展相关知识的出发点是好的,但如果忽略逻辑关系而掉书袋,例如说出本题用到结式这种话:实际上是用到了结式的计算方法,这种说话方式是否有好处就是值得商榷的了。至少笔者觉得,“拓展”永远应当在“讲清楚题目”之后进行,而在“讲清楚题目”的过程中,还是该尽量避免花里胡哨的高级词汇。
标签:dots,le,ddots,多项式,Zhejiang,结式,prod,Homework From: https://www.cnblogs.com/tianbusblog/p/18213553