【多項式】多項式逆元/開方/取模/多點求值/插值/牛頓迭代/對數/exp/冪

多項式求逆元

已知多項式F(x)F(x),求F(x)F(x)在保留前n項(當然n要是2的次冪)的情況下的逆元G(x)G(x),也就是:
F(x)G(x)1(modxn)F(x)G(x)\equiv 1 \pmod{x^n}
首先,如果n=1n=1,那麼直接就是常數項的逆元,

如果n>1n>1,那麼怎麼辦?
設:G(x)G'(x)使得F(x)G(x)1(modxn/2)F(x)G'(x)\equiv 1 \pmod{x^{n/2}},且我們已知G(x)G'(x)
第一個式子可以變成:F(x)G(x)1(modxn/2)F(x)G(x)\equiv 1 \pmod{x^{n/2}}
(把模數開了個方,依舊成立)
把兩個式子相減:
F(x)(G(x)G(x))0(modxn/2)F(x)(G(x)-G'(x))\equiv 0 \pmod{x^{n/2}}
G(x)G(x)0(modxn/2)G(x)-G'(x)\equiv 0 \pmod{x^{n/2}}
同時平方:(當然模數也平方依舊成立)
(G(x)G(x))20(modxn)(G(x)-G'(x))^2\equiv 0 \pmod{x^n}
G2(x)+G2(x)2G(x)G(x)0(modxn)G^2(x)+G'^2(x)-2G(x)G'(x)\equiv 0 \pmod{x^n}
兩邊同時乘上F(x)F(x),消掉部分G(x)G(x)
G(x)+G2(x)F(x)2G(x)0(modxn)G(x)+G'^2(x)F(x)-2G'(x)\equiv 0 \pmod{x^n}
G(x)2G(x)G2(x)F(x)(modxn)G(x)\equiv 2G'(x)-G'^2(x)F(x) \pmod{x^n}
那麼,G(x)G(x)就可以快速求出了,
(同時發現,只要常數項有逆元,這個多項式就有逆元)
複雜度:T(n)=T(n/2)+O(nlog(n))=O(nlog(n))T(n)=T(n/2)+O(n\log(n))=O(n\log(n))


多項式開方

多項式的開方同樣可以以這種方法做出來,

已知多項式F(x)F(x),求F(x)F(x)在保留前n項(當然n要是2的次冪)的情況下的平方根G(x)G(x),也就是:
G2(x)F(x)(modxn)G^2(x)\equiv F(x) \pmod{x^n}
首先,如果n=1n=1,那麼直接就是常數項的開方,可以暴力枚舉,也可以用二次項剩餘(CZY的二次剩餘Cipolla算法學習小記),

對於n>1n>1的情況,
設:G(x)G'(x)使得G(x)2F(x)(modxn/2)G'(x)^2\equiv F(x) \pmod{x^{n/2}},且我們已知G(x)G'(x)
(把平方寫在後面好看QuQ)

第一個式子可以變成:G2(x)F(x)(modxn/2)G^2(x)\equiv F(x) \pmod{x^{n/2}}
(把模數開了個方,依舊成立)
把兩個式子相減:
G2(x)G(x)20(modxn/2)G^2(x)-G'(x)^2\equiv 0 \pmod{x^{n/2}}
因式分解:
(G(x)+G(x))(G(x)G(x))0(modxn/2)(G(x)+G'(x))(G(x)-G'(x))\equiv 0 \pmod{x^{n/2}}
可得G(x)G(x)有兩個解(平方嘛),討論G(x)G(x)0(modxn/2)G(x)-G'(x)\equiv 0 \pmod{x^{n/2}}的情況,
G(x)G(x)0(modxn/2)G(x)-G'(x)\equiv 0 \pmod{x^{n/2}}
(歷史總是驚人的相識)
同時平方:(當然模數也平方依舊成立)
(G(x)G(x))20(modxn)(G(x)-G'(x))^2\equiv 0 \pmod{x^n}
G2(x)+G(x)22G(x)G(x)0(modxn)G^2(x)+G'(x)^2-2G(x)G'(x)\equiv 0 \pmod{x^n}
因爲:G2(x)F(x)(modxn)G^2(x)\equiv F(x) \pmod{x^n}
F(x)+G(x)22G(x)G(x)0(modxn)F(x)+G'(x)^2-2G(x)G'(x)\equiv 0 \pmod{x^n}
G(x)F(x)+G(x)22G(x)(modxn)G(x)\equiv \frac{F(x)+G'(x)^2}{2G'(x)} \pmod{x^n}
那麼,G(x)G(x)就可以快速求出了,
(同時發現,只要常數項是二次項剩餘且有逆元,這個多項式就可以開方)
複雜度:T(n)=T(n/2)+2O(nlog(n))=O(nlog(n))T(n)=T(n/2)+2*O(n\log(n))=O(n\log(n))


多項式取模

已知A(x),B(x)A(x),B(x),求D(x)=A(x)mod  B(x)D(x)=A(x)\mod B(x)
A(x)=B(x)C(x)+D(x)A(x)=B(x)C(x)+D(x)
n=A(x)m=B(x)n=A(x)的次數,m=B(x)的次數,顯然有mnm\leq n
上面的等式兩邊同時乘上xnx^n得:
xnA(1x)=xmB(1x)xnmC(1x)+xnD(1x)x^nA(\frac{1}{x})=x^mB(\frac{1}{x})x^{n-m}C(\frac{1}{x})+x^nD(\frac{1}{x})
1x\frac{1}{x}的作用相當於是把多項式頭尾翻轉一下)

A(x)=xnA(1x)B(x)=xmB(1x)C(x)=xnmC(1x)D(x)=xnD(1x)A'(x)=x^nA(\frac{1}{x}),B'(x)=x^mB(\frac{1}{x}),C'(x)=x^{n-m}C(\frac{1}{x}),D'(x)=x^nD(\frac{1}{x})

可以發現,經過翻轉後,
D(x)D'(x)中只有次數[nm+1,n]\in[n-m+1,n]的項是有效的,其他項均爲0,,
A(x)A'(x)中次數[0,n]\in[0,n]的項是有效的,
B(x)B'(x)中次數[0,m]\in[0,m]的項是有效的,
C(x)C'(x)中次數[0,nm]\in[0,n-m]的項是有效的,

現在再對原來的等式mod  xnm+1\mod{x^{n-m+1}},也就是
A(x)=B(x)C(x)+D(x)mod  xnm+1A'(x)=B'(x)C'(x)+D'(x) \mod{x^{n-m+1}}
這樣D(x)D'(x)這一項就能模掉了,也就是:
A(x)=B(x)C(x)mod  xnm+1A'(x)=B'(x)C'(x) \mod{x^{n-m+1}}
A(x)B(x)=C(x)mod  xnm+1\frac{A'(x)}{B'(x)}=C'(x) \mod{x^{n-m+1}}
因爲C(x)C'(x)的次數範圍剛好在模以內,所以就可以直接求出C(x)C'(x),變換得C(x)C(x)
求出了C(x)C(x),剩下直接減就好了
D(x)=A(x)B(x)C(x)D(x)=A(x)-B(x)C(x)

複雜度:O(nlog(n))O(n\log(n))


多項式多點求值

已知多項式F(x)F(x),給出a1,a2,...,ana_1,a_2,...,a_n,要求F(a1),F(a2),...,F(an)F(a_1),F(a_2),...,F(a_n)

先拋出一個顯然的結論:F(a1)=F(x)mod  (x+a1)F(a_1)=F(x)\mod{(x+a_1)}
(意思是:多項式F(x)F(x)模多項式(x+a1)(x+a_1)的餘數就是當x=a1x=a_1F(x)F(x)的值)

有這個結論就好辦了,
設多項式Cl,r(x)=i=lr(x+ai)Gl,r(x)=F(x)mod  Cl,r(x)C_{l,r}(x)=\prod_{i=l}^r(x+a_i),G_{l,r}(x)=F(x)\mod{C_{l,r}(x)}
考慮分治求解,
顯然的:Gl,mid(x)=Gl,r(x)mod  Cl,r(x)G_{l,mid}(x)=G_{l,r}(x)\mod{C_{l,r}(x)},右邊同理,
這樣當l=r時Gl,l(x)G_{l,l}(x)就是F(al)F(a_l)的值了,
做兩遍分治FFT,

複雜度:O(nlog2(n))O(n\log^2(n))


多項式差值

給出a1,b1,a2,b2,...,ak,bka_1,b_1,a_2,b_2,...,a_k,b_k,要求多項式F(x)F(x)滿足F(ai)=biF(a_i)=b_i

考慮使用拉格朗日插值法,
F(x)=i=1kbi(1jk,ijxajaiaj)F(x)=\sum_{i=1}^kb_i(\prod_{1\leq j \leq k,i\ne j }\frac{x-a_j}{a_i-a_j})
將式子拆成兩部分:

F(x)=i=1kbi(1jk,ij1aiaj)(1jk,ij(xaj))F(x)=\sum_{i=1}^kb_i(\prod_{1\leq j \leq k,i\ne j }\frac{1}{a_i-a_j})(\prod_{1\leq j \leq k,i\ne j }(x-a_j))
先做前面那一部分:(先取個倒數方便書寫)
Gi=1jk,ij(aiaj)M(x)=j=1k(aiaj)G_i=\prod_{1\leq j \leq k,i\ne j }(a_i-a_j),M(x)=\prod_{j=1}^k(a_i-a_j)
顯然有M(ai)=0M(a_i)=0,

有:
Gi=limxaiM(x)M(ai)xajG_i=\lim_{x\to a_i}\frac{M(x)-M(a_i)}{x-a_j}
我們發現這個東西相當於M(x)M(x)x=aix=a_i處的導數,於是有:

Gi=limxaiM(x)M(ai)xaj=M(ai)G_i=\lim_{x\to a_i}\frac{M(x)-M(a_i)}{x-a_j}=M'(a_i)
所以對M(x)M'(x)做一次多點求值即可,

這個東西還可以用洛必達法則證明,
f(x)=xaif(x)=x-a_i
已知有limxaiM(x)=0,limxaif(x)=0\lim_{x\to a_i}M(x)=0,\lim_{x\to a_i}f(x)=0
所以:
limxaiM(x)f(x)=limxaiM(x)f(x)=M(ai)\lim_{x\to a_i}\frac{M(x)}{f(x)}=\lim_{x\to a_i}\frac{M'(x)}{f'(x)}=M'(a_i)

現在的原始變成了:
F(x)=i=1kbiGi(1jk,ij(xaj))F(x)=\sum_{i=1}^kb_iG_i(\prod_{1\leq j \leq k,i\ne j }(x-a_j))
這個東西可以直接使用分治FFT實現,分治的時候記錄兩個多項式分別表示是否已經空缺了一位,

複雜度:O(nlog2(n))O(n\log^2(n))

多點求值+幾遍分治FFT常數爆炸


多項式牛頓迭代

已知多項式G(x)G(x),要求多項式FF使得G(F)=0mod  xnG(F)=0\mod{x^n}

前置技能:

泰勒展開

對於多項式f(x)f(x)它在x0x_0處的泰勒展開爲:
f(x)=f(x0)+f(x)1!(xx0)+f(x)2!(xx0)2+.....f(x)=f(x_0)+\frac{f'(x)}{1!}(x-x_0)+\frac{f''(x)}{2!}(x-x_0)^2+.....

考慮倍增求FF

現在要求的FFmod  x2n\mod x^{2n}的,假設我們已經求出了F0F_0表示mod  xn\mod x^n時的答案,

G(F)G(F)F0F_0處展開:
G(F)=G(F0)+G(F0)(FF0)+12G(F0)(FF0)2mod  x2nG(F)=G(F_0)+G'(F_0)(F-F_0)+\frac{1}{2}G''(F_0)(F-F_0)^2 \mod{x^{2n}}
我們注意到是在mod  x2n\mod{x^{2n}}意義下的,而從第3項開始最低次項的指數均大於2n,所以可以直接省去,於是:

G(F)=G(F0)+G(F0)(FF0)mod  x2nG(F)=G(F_0)+G'(F_0)(F-F_0)\mod{x^{2n}}
又因爲G(F)=0mod  x2nG(F)=0\mod{x^{2n}}

0=G(F0)+G(F0)FG(F0)F0mod  x2n0=G(F_0)+G'(F_0)F-G'(F_0)F_0\mod{x^{2n}}

F=F0G(F0)G(F0)F=F_0-\frac{G(F_0)}{G'(F_0)}


多項式求對數

給出多項式G(x)G(x),要求F(x)F(x)使得F(x)=ln(G(x))mod  xnF(x)=\ln(G(x))\mod{x^n}

對兩邊同時求導,最後再積分回來,
有:
(ln(G(x)))=G(x)G(x)(\ln(G(x)))'=\frac{G'(x)}{G(x)}
所以
F(x)=G(x)G(x)dxF(x)=\int \frac{G'(x)}{G(x)}dx

複雜度:O(nlog(n))O(n\log(n))


多項式求EXP

給出多項式G(x)G(x),求F(x)F(x)滿足F(x)=eG(x)F(x)=e^{G(x)}

考慮使用牛頓迭代,
設多項式g(x)=ln(x)G(x)g(x)=ln(x)-G(x),即g(F)=0g(F)=0

F=F0g(F0)g(F0)F=F_0-\frac{g(F_0)}{g'(F_0)}
又因爲
g(F0)=(ln(F0))(A)=1F0g'(F_0)=(\ln(F_0))'-(A)'=\frac{1}{F_0}
所以:

F=F0F0(ln(F0)A)F=F_0-F_0(\ln(F_0)-A)

複雜度:O(nlog(n))O(n\log(n))


多項式求冪

給出多項式F(x)F(x),求F(x)kF(x)^k
F(x)k=ekln(F(x))F(x)^k=e^{k\ln(F(x))}

這樣如果k不爲整數也能求了

複雜度:O(nlog(n))O(n\log(n))


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章