1. 程式人生 > >多項式牛頓迭代及其運用

多項式牛頓迭代及其運用

目錄

參考資料

牛頓迭代法在多項式運算的應用-by Miskcoo
如何通俗易懂地講解牛頓迭代法?

前言-牛頓迭代

在食用本文之前,建議先學習這篇部落格:多項式常用操作歸納
同樣的,本文還是建議從前往後進行學習~~~

實數意義下的

首先是看了馬老師的部落格,然後就瞭解了求不規則函式根的方法。

下面是博主自己的概括和理解:

大概就是隨便在x軸上找一個點,然後向上作x軸的垂線,交函式於一點y,然後再作(x,y)處的切線,交x軸於(x',0)。又從(x',0)這個點開始不斷地重複。

最終我們找到的交x軸的那個點,有極大的概率是方程的根(函式的零點)。

現在我們來看一下,在已知\((x_0,f(x_0))\)的情況下,如何求出x'的值:
設原函式為\(f(x)\),然後在\((x_0,f(x_0))\)的切線方程為:\(y=f'(x_0)(x-x_0)+f(x_0)\),然後就可以簡單的令y=0,就可以得到:\(0=f'(x_0)(x'-x_0)+f(x_0)\)->\(x'=x_0-\frac{f(x_0)}{f'(x_0)}\),然後就可以通過這個式子進行不斷地迭代了。

多項式意義下的

這個...其實還沒有發現和上面的那個有什麼關係...可能是我研究的還不夠深入吧...先道個歉...
重點是記住結論就好了


首先看一個式子:
\[G(F(x))\equiv 0(mod\ x^n)\]
已知的是G(x),要求的是F(x)。

咋搞呢?

首先是多項式問題的常見套路:設\(F_0(x)\)是在\(mod\ x^{\lfloor\frac{n}{2}\rfloor}\)意義下的解,而且已經求出來了。
也就是有:
\[G(F_0(x))\equiv 0(mod\ x^{\lfloor\frac{n}{ 2}\rfloor})\]
由泰勒展開可得:
\[G(F(x))=\frac{G(F_0(x))}{0!}+\frac{G'(F_0(x))}{1!}(F(x)-F_0(x))+\frac{G''(F_0(x))}{2!}(F(x)-F_0(x))^2+...\]


然後我們進一步可以發現,其實從式子中的第三項開始就可以省略了。

為什麼呢??

因為在高次的情況下滿足的式子,低次也是滿足的:
\[G(F(x))\equiv 0(mod\ x^{\lfloor\frac{n}{2}\rfloor})\]
進一步也就是說\(F(x)\)\(F_0(x)\)的後n/2位是相等的。
然後你就會發現\((F(x)-F_0(x))\)的最低次項的次數都是(n/2)*(n/2)=n的,在模\(x^(n)\)的意義下,就變成0了!!!
所以說只有前面兩項是有意義的。

這樣子之後就變得炒雞簡單啦:
\[G(F(x))=\frac{G(F_0(x))}{0!}+\frac{G'(F_0(x))}{1!}(F(x)-F_0(x))\]
然後我們進行進一步的變形,就能夠得出F(x)的表示式:
\[F(x)=F_0(x)-\frac{G(F_0(x))}{G'(F_0(x))}\]
特別需要注意的是,這裡的F(x)最好是看成是一個變元(通俗地講,就看成是'x'),在這個意義下在進行求導的運算。

如何具體的使用這個蘊藏著豐富力量的公式呢?
每次都將題目中的同餘式化成右邊等於0 的形式,然後再令左邊等於G(F(x)),再帶入上述的結論式中,就能夠得到你想要的結論了~~~

下面給出的常見操作大都是使用牛頓迭代得到的,其實也有常規的推導方式,只不過使用牛頓迭代更加簡單易懂罷了。

多項式對數函式

這個是用不到牛頓迭代的...這裡就先說了。
通常題目都是在模x^n的意義下進行求解的,後面就不再重複了。
題目就是:
\[B(x)\equiv ln(A(x))(mod\ x^n)\]
其中A(x)是已知的,B(x)是我們要求的。

對兩邊同時求導可得:
\[B'(x)\equiv \frac{A'(x)}{A(x)}(mod\ x^n)\]
然後我們發現後面的那個式子是能夠使用之前的方法解決的(求逆+求導)。求導的話,不懂的可以出門百度一下,比較簡單。

最後得到B'(x)之後,再積分回來,就能夠得到最終的答案了。(積分和求導都是有比較簡單的公式的,且是O(n)的)

多項式指數函式

從這裡開始就需要用到牛頓迭代了。
我們的問題是:
\[e^{A(x)}\equiv B(x)(mod\ x^n)\]
其中A(x)是已知的,B(x)是我們要求的。

將問題轉化一下,就變成了:
\[ln(B(x))\equiv A(x)(mod\ x^n)\]

然後將A(x)移到左邊來,就有了:
\[ln(B(x))-A(x)\equiv 0(mod\ x^n)\]

再令\(G(F(x))=ln(B(x))-A(x)\)
最後來一波牛頓迭代,就有了:
\[B(x)=B_0(x)-\frac{ln(B_0(x))-A(x)}{\frac{1}{B_0(x)}}\]
再變一下,就有了:
\[B(x)=B_0(x)(1-ln(B_0(x))+A(x))\]其中\(B_0(x)\)是我們在模\(x^{\lfloor\frac{n}{2}\rfloor}\)意義下已經求得的答案。求ln(B0(x))的話,可以用之前的多項式對數函式搞就可以了。

這裡需要特別注意的是,多項式求指數函式是有前提的:A(x)的常數項必須為0,否則在底層的時候B[0]無法賦初值
這樣子就有B[0]=1(因為ln(1)=0)。

多項式開根

直接上問題:
\[\sqrt{A(x)}\equiv B(x)(mod\ x^{\frac{n}{2}})\]
其中A(x)已知,B(x)是要求的。
把根號去掉就有:
\[A(x)\equiv B^2(x)(mod\ x^n)\]

然後又用常見的套路:
\[G(F(x))=A(x)-(B(x))^2\]
就有牛頓迭代:
\[B(x)=B_0(x)-\frac{A(x)-(B_0(x))^2}{-2*B_0(x)}\]
化簡一下就有:
\[B(x)=\frac{B_0(x)}{2}+\frac{A(x)}{2*B_0(x)}\]
然後就可以做了(求逆就可以了)。

多項式求冪

這個就比較簡單(但是也想不到這個思路)。
之前我們就有一個比較簡單的一個思路,就是多項式快速冪,是\(O(n\log^2 n)\)的演算法。這裡利用之前的方法能夠優化到\(O(n\log n)\)(但是常數巨大...)。

思路其實就是將\((F(x))^k\)轉化為\(e^{k*ln(F(x))}\)
如果覺得不顯然的話,展開之後,你就會發現他們是一樣的!!!
那就是nlogn了(是不是感覺有點震驚...)。

這裡只是草草地將部落格趕完了,具體的細節明天再更吧...