多項式求逆元
已知多項式F(x),求F(x)在保留前n項(當然n要是2的次冪)的情況下的逆元G(x),也就是:
F(x)G(x)≡1(modxn)
首先,如果n=1,那麼直接就是常數項的逆元,
如果n>1,那麼怎麼辦?
設:G′(x)使得F(x)G′(x)≡1(modxn/2),且我們已知G′(x)
第一個式子可以變成:F(x)G(x)≡1(modxn/2)
(把模數開了個方,依舊成立)
把兩個式子相減:
F(x)(G(x)−G′(x))≡0(modxn/2)
G(x)−G′(x)≡0(modxn/2)
同時平方:(當然模數也平方依舊成立)
(G(x)−G′(x))2≡0(modxn)
G2(x)+G′2(x)−2G(x)G′(x)≡0(modxn)
兩邊同時乘上F(x),消掉部分G(x):
G(x)+G′2(x)F(x)−2G′(x)≡0(modxn)
G(x)≡2G′(x)−G′2(x)F(x)(modxn)
那麼,G(x)就可以快速求出了,
(同時發現,只要常數項有逆元,這個多項式就有逆元)
複雜度:T(n)=T(n/2)+O(nlog(n))=O(nlog(n))
多項式開方
多項式的開方同樣可以以這種方法做出來,
已知多項式F(x),求F(x)在保留前n項(當然n要是2的次冪)的情況下的平方根G(x),也就是:
G2(x)≡F(x)(modxn)
首先,如果n=1,那麼直接就是常數項的開方,可以暴力枚舉,也可以用二次項剩餘(CZY的二次剩餘Cipolla算法學習小記),
對於n>1的情況,
設:G′(x)使得G′(x)2≡F(x)(modxn/2),且我們已知G′(x),
(把平方寫在後面好看QuQ)
第一個式子可以變成:G2(x)≡F(x)(modxn/2)
(把模數開了個方,依舊成立)
把兩個式子相減:
G2(x)−G′(x)2≡0(modxn/2)
因式分解:
(G(x)+G′(x))(G(x)−G′(x))≡0(modxn/2)
可得G(x)有兩個解(平方嘛),討論G(x)−G′(x)≡0(modxn/2)的情況,
G(x)−G′(x)≡0(modxn/2)
(歷史總是驚人的相識)
同時平方:(當然模數也平方依舊成立)
(G(x)−G′(x))2≡0(modxn)
G2(x)+G′(x)2−2G(x)G′(x)≡0(modxn)
因爲:G2(x)≡F(x)(modxn)
F(x)+G′(x)2−2G(x)G′(x)≡0(modxn)
G(x)≡2G′(x)F(x)+G′(x)2(modxn)
那麼,G(x)就可以快速求出了,
(同時發現,只要常數項是二次項剩餘且有逆元,這個多項式就可以開方)
複雜度:T(n)=T(n/2)+2∗O(nlog(n))=O(nlog(n))
多項式取模
已知A(x),B(x),求D(x)=A(x)modB(x),
令A(x)=B(x)C(x)+D(x)
設n=A(x)的次數,m=B(x)的次數,顯然有m≤n,
上面的等式兩邊同時乘上xn得:
xnA(x1)=xmB(x1)xn−mC(x1)+xnD(x1)
(x1的作用相當於是把多項式頭尾翻轉一下)
設A′(x)=xnA(x1),B′(x)=xmB(x1),C′(x)=xn−mC(x1),D′(x)=xnD(x1)
可以發現,經過翻轉後,
D′(x)中只有次數∈[n−m+1,n]的項是有效的,其他項均爲0,,
A′(x)中次數∈[0,n]的項是有效的,
B′(x)中次數∈[0,m]的項是有效的,
C′(x)中次數∈[0,n−m]的項是有效的,
現在再對原來的等式modxn−m+1,也就是
A′(x)=B′(x)C′(x)+D′(x)modxn−m+1
這樣D′(x)這一項就能模掉了,也就是:
A′(x)=B′(x)C′(x)modxn−m+1
B′(x)A′(x)=C′(x)modxn−m+1
因爲C′(x)的次數範圍剛好在模以內,所以就可以直接求出C′(x),變換得C(x),
求出了C(x),剩下直接減就好了
D(x)=A(x)−B(x)C(x)
複雜度:O(nlog(n))
多項式多點求值
已知多項式F(x),給出a1,a2,...,an,要求F(a1),F(a2),...,F(an)
先拋出一個顯然的結論:F(a1)=F(x)mod(x+a1),
(意思是:多項式F(x)模多項式(x+a1)的餘數就是當x=a1時F(x)的值)
有這個結論就好辦了,
設多項式Cl,r(x)=∏i=lr(x+ai),Gl,r(x)=F(x)modCl,r(x),
考慮分治求解,
顯然的:Gl,mid(x)=Gl,r(x)modCl,r(x),右邊同理,
這樣當l=r時Gl,l(x)就是F(al)的值了,
做兩遍分治FFT,
複雜度:O(nlog2(n))
多項式差值
給出a1,b1,a2,b2,...,ak,bk,要求多項式F(x)滿足F(ai)=bi,
考慮使用拉格朗日插值法,
F(x)=i=1∑kbi(1≤j≤k,i̸=j∏ai−ajx−aj)
將式子拆成兩部分:
F(x)=i=1∑kbi(1≤j≤k,i̸=j∏ai−aj1)(1≤j≤k,i̸=j∏(x−aj))
先做前面那一部分:(先取個倒數方便書寫)
設Gi=∏1≤j≤k,i̸=j(ai−aj),M(x)=∏j=1k(ai−aj)
顯然有M(ai)=0,
有:
Gi=x→ailimx−ajM(x)−M(ai)
我們發現這個東西相當於M(x)在x=ai處的導數,於是有:
Gi=x→ailimx−ajM(x)−M(ai)=M′(ai)
所以對M′(x)做一次多點求值即可,
這個東西還可以用洛必達法則證明,
設f(x)=x−ai
已知有limx→aiM(x)=0,limx→aif(x)=0
所以:
x→ailimf(x)M(x)=x→ailimf′(x)M′(x)=M′(ai)
現在的原始變成了:
F(x)=i=1∑kbiGi(1≤j≤k,i̸=j∏(x−aj))
這個東西可以直接使用分治FFT實現,分治的時候記錄兩個多項式分別表示是否已經空缺了一位,
複雜度:O(nlog2(n))
多點求值+幾遍分治FFT常數爆炸
多項式牛頓迭代
已知多項式G(x),要求多項式F使得G(F)=0modxn
前置技能:
泰勒展開
對於多項式f(x)它在x0處的泰勒展開爲:
f(x)=f(x0)+1!f′(x)(x−x0)+2!f′′(x)(x−x0)2+.....
考慮倍增求F
現在要求的F是modx2n的,假設我們已經求出了F0表示modxn時的答案,
把G(F)在F0處展開:
G(F)=G(F0)+G′(F0)(F−F0)+21G′′(F0)(F−F0)2modx2n
我們注意到是在modx2n意義下的,而從第3項開始最低次項的指數均大於2n,所以可以直接省去,於是:
G(F)=G(F0)+G′(F0)(F−F0)modx2n
又因爲G(F)=0modx2n,
0=G(F0)+G′(F0)F−G′(F0)F0modx2n
F=F0−G′(F0)G(F0)
多項式求對數
給出多項式G(x),要求F(x)使得F(x)=ln(G(x))modxn
對兩邊同時求導,最後再積分回來,
有:
(ln(G(x)))′=G(x)G′(x)
所以
F(x)=∫G(x)G′(x)dx
複雜度:O(nlog(n))
多項式求EXP
給出多項式G(x),求F(x)滿足F(x)=eG(x),
考慮使用牛頓迭代,
設多項式g(x)=ln(x)−G(x),即g(F)=0
F=F0−g′(F0)g(F0)
又因爲
g′(F0)=(ln(F0))′−(A)′=F01
所以:
F=F0−F0(ln(F0)−A)
複雜度:O(nlog(n))
多項式求冪
給出多項式F(x),求F(x)k,
F(x)k=ekln(F(x))
這樣如果k不爲整數也能求了
複雜度:O(nlog(n))