Homework from Zhejiang 和結式到底是什麼關係

tianbu發表於2024-05-26

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 一題時,被某些題解中提到的“用結式計算”或者“本題用到了結式”勸退了。但其實,本題跟結式除了最終的演算法形式上相同,沒有別的聯絡:結式的定義(這個行列式的值)對於做出題目沒有任何關係,而結式的計算確實跟本題的演算法相同,但講清這個演算法也不需要知道結式是什麼,這是一個關於多項式根相關式子的普適性演算法。

以一道題目去擴充相關知識的出發點是好的,但如果忽略邏輯關係而掉書袋,例如說出本題用到結式這種話:實際上是用到了結式的計算方法,這種說話方式是否有好處就是值得商榷的了。至少筆者覺得,“擴充”永遠應當在“講清楚題目”之後進行,而在“講清楚題目”的過程中,還是該儘量避免花裡胡哨的高階詞彙。

相關文章