Homework from Zhejiang 和结式到底是什么关系

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\),答案不变。所以整个题的做法是:

  1. \(n>m\),交换 \(f,g\)
  2. 写出 \(h(x)\)(就是 \(g\) 的某些次系数取反)并把答案化成 \(\prod_{i=1}^n h(x_i)\)
  3. \(h\)\(f\) 取模(若不首一了就把 \(h\) 和答案乘上一个系数)。
  4. 递归,直到 \(\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 一题时,被某些题解中提到的“用结式计算”或者“本题用到了结式”劝退了。但其实,本题跟结式除了最终的算法形式上相同,没有别的联系:结式的定义(这个行列式的值)对于做出题目没有任何关系,而结式的计算确实跟本题的算法相同,但讲清这个算法也不需要知道结式是什么,这是一个关于多项式根相关式子的普适性算法。

以一道题目去拓展相关知识的出发点是好的,但如果忽略逻辑关系而掉书袋,例如说出本题用到结式这种话:实际上是用到了结式的计算方法,这种说话方式是否有好处就是值得商榷的了。至少笔者觉得,“拓展”永远应当在“讲清楚题目”之后进行,而在“讲清楚题目”的过程中,还是该尽量避免花里胡哨的高级词汇。

posted @ 2024-05-26 13:08  tianbu  阅读(196)  评论(1)    收藏  举报