牛頓迭代求解定義域為多項式的函數零點
(筆者習慣:\(f(x)\)表示函數,\(F(x),G(x)\)表示多項式)
前言
原來的牛頓迭代是通過在函數上不斷作切線來快速求出一個多項式函數近似的零點
在編程競賽中,計數類問題我們經常遇到一個(可能是無窮的)數列\(a_n\),\(a_n\)可以由他自己通過一定的轉移得到
對於這類問題,把\(a_n\)視為一個多項式,相當於是用多項式之間的運算表示出它自己,如\(F(x)=G(x)F(x)^2+A(x)\)
這樣的轉移式子可以通過移項變成一個類似求函數零點的形式
本文所談的問題是對於一個定義在多項式域上的函數(函數本身不需要是多項式),求出它的零點
當然零點也是一個多項式
即\(x\)可以是一個多項式\(F(x)\),並且函數的系數也可以是多項式\(A(x)\)
下面講如何求出這個\(f(F(x))\)的零點
用途
對於一個定義域是多項式的函數\(f(F(x))\),求出它的零點
零點很有可能是一個無窮次數的多項式,所以我們只需要求它前\(n\)項的值
\(f(F(x))\)是一個關於\(F(x)\)的函數
如\(f(F(x))=F(x)^2-G(x)=0\)
這里我們必須分清楚的點是
1.方程的元是\(F(x)\)
2.\(G(x)\)是方程的常數項
所以為了便於區分,可以更好看得表示為\(f(z)=z^2-G\),其中\(z=F(x)\)
前置知識1
前置知識2(只需要會求逆就可以了)
牛頓迭代
由於求解的是前\(n\)項的值,所以考慮倍增
邊界條件視具體情況而定
設已經求出了\(G(x)\)滿足\(f(G(x))=0 \pmod {x^\frac{n}{2}}\)
(下文中由於\(F(x),G(x)\)太長,全部用\(F,G\)替換)
(會多項式求逆的人都知道)有\((F-G)^2=0 \pmod {x^n}\)
帶入\(f(F)\)在\(G\)上的泰勒展開
\(\displaystyle f(F)=\sum_{i=0}^{\infty}\frac{f^{(i)}(G)}{i!}(F-G)^i\)
其中\(f^{(i)}\)表示\(f(x)\)的\(i\)階導數
\(\because (F-G)^2=0 \pmod {x^n}\)
\(\therefore (F-G)^i=0 \pmod {x^n},i>1\)
\(\therefore f(F)=f(G)+f'(G)(F-G)=0\)
\(\therefore F=G-\cfrac{f(G)}{f'(G)}\) (可以直接背這個式子)
這個算法的復雜度取決於是否能快速求出\(f(G),f'(G)\)
一般出現的式子都可以\(O(n\log n)\)完成一次迭代,所以總復雜度也為\(O(n\log n)\)
應用:多項式exp,烷基計數 Loj6538 etc.