概述
多項式開跟是一個非常重要的知識點,許多多項式題目都要用到這一算法。
用快速數論變換,多項式求逆元和倍增法可以在$O(n log n)$的時間復雜度下求出一個$n$次多項式的開根。
前置技能
快速數論變換(NTT),多項式求逆元,二次剩余。
多項式的開根
給定一個多項式$A(x)$,其次數為$deg_A$,若存在一個多項式$B(x)$,使其滿足$deg_B≤deg_A$,且$ B^2(x) \equiv A(x) (mod\ x^n)$,則$B(x)$即為$A(x)$在模$x^n$意義下的的開根。
求多項式的開根
我們不妨假設,$n=2^k,k∈N$。
若$n=1$,則$b_0^2 \equiv a_0(mod\ x)$。其中$a_0$,$b_0$表示多項式$A$和多項式$B$的常數項。
若需要求出$b_0$,直接用二次剩余求出即可。(不過由於大部分題目公式特別優美,常數項通常為0)
當$n>1$時:
我們假設在模$x^{\frac{n}{2}}$的意義下$A(x)$的開根$B'(x)$我們已經求得。
依據定義,則有
$B^2(x)\equiv A(x) (mod\ x^{n})$ $(1)$
因為多項式$B'(x)$滿足
$B'^2(x)\equiv A(x) (mod\ x^{\frac{n}{2}})$ $(2)$
將$(1)-(2)$,得
$B^2(x)-B'^2(x)\equiv 0(mod\ x^{\frac{n}{2}})$ $(3)$
我們用平方差公式將$(3)$展開
$(B(x)+B'(x))(B(x)-B'(x))\equiv 0(mod\ x^{\frac{n}{2}})$ $(4)$
然后我們會發現多項式$B(x)$有兩個解,下面考慮其中一種情況
$B(x)-B'(x)\equiv 0(mod\ x^{\frac{n}{2}})$ $(5)$
我們將$(5)$式同余符號兩邊平方,得
$B^2(x)-2B(x)B'(x)+B'^2(x)\equiv 0(mod\ x^n)$ $(6)$
考慮到式$(1)$,我們將式$(1)$代入式$(6)$,得
$A(x)-2B(x)B'(x)+B'^2(x)\equiv 0(mod\ x^n)$ $(7)$
最后對式 $(7)$進行移項,得到
$B(x)\equiv \dfrac{A(x)+B'^2(x)}{2B'(x)} (mod\ x^n)$ $(8)$
顯然,我們可以用上述式子,通過倍增,求出n次項的$B(x)$。
這一步的計算我們可以使用多項式求逆元和$NTT$,時間復雜度為$O(n log n)$。
我們可以通過遞歸的方法,求解出最終的$N$次項的$B(x)$
時間復雜度$T(n)=T(\dfrac{n}{2})+O(n log n)=O(n log n)$。
模板如下:(暫時還沒有)
