一年之后好不容易又有机会学多项式,接着[学习笔记]多项式相关运算1继续说。
常数巨大警告…
没学过导数积分的可以看看这篇文章。
嗯?里面没有不定积分…所以你可以直接看下面的两个式子:
F ′ ( x ) = ∑ i = 1 n i a i x i − 1 F'(x)=\sum^{n}_{i=1}ia_ix^{i-1} F′(x)=i=1∑niaixi−1
∫ F ( x ) = ∑ i = 1 n a i x i + 1 i + 1 \int F(x)=\sum^{n}_{i=1}\frac{a_ix^{i+1}}{i+1} ∫F(x)=i=1∑ni+1aixi+1
容易发现它们是互逆运算。
直接算就行了。
复杂度: O ( n ) O(n) O(n)
void ploy_der(int len,int *a,int *b){
for(int i=1;i<len;i++)b[i-1]=mul(i,a[i]);
b[len-1]=0;
}
void ploy_cal(int len,int *a,int *b){
for(int i=1;i<len;i++)b[i]=mul(a[i-1],fst_pow(i,MOD-2));
b[0]=0;
}
牛顿迭代并不算一种多项式运算,而是一种解多项式的方法。
使用这种方法可以很容易计算多项式开根及exp等。
在学习牛顿迭代之前,你可能还要学习:
[学习笔记]泰勒多项式快速入门
已知函数 G ( x ) G(x) G(x),求一个多项式 F ( x ) m o d x n F(x)\bmod \: x^n F(x)modxn,满足:
G ( F ( x ) ) ≡ 0 ( m o d x n ) G(F(x))\equiv 0(\bmod \: x^n) G(F(x))≡0(modxn)
其实求 m o d x n \bmod x^n modxn大多都是分治法。
当 n = 1 n=1 n=1是, G ( F ( x ) ) ≡ 0 ( m o d x ) G(F(x))\equiv 0(\bmod \: x) G(F(x))≡0(modx)这需要单独求。
n > 1 n>1 n>1按照套路,假设 G ( F 0 ( x ) ) ≡ 0 ( m o d x ⌈ n 2 ⌉ ) G(F_0(x))\equiv 0(\bmod \: x^{\lceil \frac{n}{2}\rceil}) G(F0(x))≡0(modx⌈2n⌉)的 F 0 ( x ) F_0(x) F0(x)已经解出。
注意到泰勒展开可以将 G ( F ( x ) ) G(F(x)) G(F(x))中的 F ( x ) F(x) F(x)换掉,我们考虑在 F 0 ( x ) F_0(x) F0(x)处泰勒展开 G ( F ( x ) ) G(F(x)) G(F(x)):
G ( F ( x ) ) = G ( F 0 ( x ) ) + G ′ ( F 0 ( x ) ) 1 ! ( F ( x ) − F 0 ( x ) ) + G ′ ′ ( F 0 ( x ) ) 2 ! ( F ( x ) − F 0 ( x ) ) 2 + . . . G(F(x))=G(F_0(x))+\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))=G(F0(x))+1!G′(F0(x))(F(x)−F0(x))+2!G′′(F0(x))(F(x)−F0(x))2+...
根据约定我们知道 F ( x ) − F 0 ( x ) F(x)-F_0(x) F(x)−F0(x)的后 ⌈ n 2 ⌉ \lceil \frac{n}{2}\rceil ⌈2n⌉项等于 0 0 0,而在 ( F ( x ) − F 0 ( x ) ) 2 (F(x)-F_0(x))^2 (F(x)−F0(x))2时显然 0 − ( n − 1 ) 0-(n-1) 0−(n−1)项都为 0 0 0,在模意义下可以直接去掉。
因此有 G ( F ( x ) ) ≡ G ( F 0 ( x ) ) + G ′ ( F 0 ( x ) ) 1 ! ( F ( x ) − F 0 ( x ) ) ( m o d x n ) G(F(x))\equiv G(F_0(x))+\frac{G'(F_0(x))}{1!}(F(x)-F_0(x))(\bmod \: x^n) G(F(x))≡G(F0(x))+1!G′(F0(x))(F(x)−F0(x))(modxn)
由于定义又有 G ( F ( x ) ) ≡ 0 ( m o d x n ) G(F(x))\equiv 0(\bmod \: x^n) G(F(x))≡0(modxn)。
于是得到 F ( x ) = F 0 ( x ) − G ( F 0 ( x ) ) G ′ ( F 0 ( x ) ) ( m o d x n ) F(x)=F_0(x)-\frac{G(F_0(x))}{G'(F_0(x))}(\bmod \: x^n) F(x)=F0(x)−G′(F0(x))G(F0(x))(modxn)
有了这东西我们其实就可以直接用公式了。
给定一个多项式 A ( x ) A(x) A(x)
找到另一个多项式 B ( x ) B(x) B(x)
使得 B 2 ( x ) ≡ A ( x ) ( m o d B^2(x)≡A(x)(mod B2(x)≡A(x)(mod x n ) x^n) xn)
则称 B ( x ) B(x) B(x)为 A ( x ) A(x) A(x)在 m o d mod mod x n x^n xn意义下的平方根。
保证 a 0 = 1 a_0=1 a0=1。
[如果没有这个条件,我们可能还需要一个二次剩余才能够解决]
我们再次考虑使用分治来解决这个问题。
n = 1 n=1 n=1时,根据题目的常数项就为 1 1 1。
n > 1 n>1 n>1时
首先知道 B 2 ( x ) ≡ A ( x ) ( m o d B^2(x)≡A(x)(mod B2(x)≡A(x)(mod x n ) x^n) xn)
设 B ′ ( x ) B'(x) B′(x)为 A ( x ) A(x) A(x)在 m o d mod mod x ⌈ n 2 ⌉ x^{\lceil \frac{n}{2} \rceil} x⌈2n⌉的平方根,假设我们现在已经知道 B ′ ( x ) B'(x) B′(x),则:
B ′ 2 ( x ) ≡ A ( x ) ( m o d B'^2(x)≡A(x)(mod B′2(x)≡A(x)(mod x ⌈ n 2 ⌉ ) x^{\lceil \frac{n}{2} \rceil}) x⌈2n⌉)
移项 B ′ 2 ( x ) − A ( x ) ≡ 0 ( m o d B'^2(x)-A(x)≡0(mod B′2(x)−A(x)≡0(mod x ⌈ n 2 ⌉ ) x^{\lceil \frac{n}{2} \rceil}) x⌈2n⌉)
两边同时平方 B ′ 4 ( x ) − 2 B ′ 2 ( x ) A ( x ) + A 2 ( x ) ≡ 0 ( m o d B'^4(x)-2B'^2(x)A(x)+A^2(x)≡0(mod B′4(x)−2B′2(x)A(x)+A2(x)≡0(mod x n ) x^n) xn)
前文已经说明为什么平方可以将膜长平方,这里不做赘述。
两边同时加上 4 B ′ 2 ( x ) A ( x ) 4B'^2(x)A(x) 4B′2(x)A(x)得
B ′ 4 ( x ) + 2 B ′ 2 ( x ) A ( x ) + A 2 ( x ) ≡ 4 B ′ 2 ( x ) A ( x ) ( m o d B'^4(x)+2B'^2(x)A(x)+A^2(x)≡4B'^2(x)A(x)(mod B′4(x)+2B′2(x)A(x)+A2(x)≡4B′2(x)A(x)(mod x n ) x^n) xn)
配方 ( B ′ 2 ( x ) + A ( x ) ) 2 ≡ 4 B ′ 2 ( x ) A ( x ) ( m o d (B'^2(x)+A(x))^2≡4B'^2(x)A(x)(mod (B′2(x)+A(x))2≡4B′2(x)A(x)(mod x n ) x^n) xn)
移项 ( B ′ 2 ( x ) + A ( x ) 2 B ′ ( x ) ) 2 ≡ A ( x ) ( m o d (\frac{B'^2(x)+A(x)}{2B'(x)})^2≡A(x)(mod (2B′(x)B′2(x)+A(x))2≡A(x)(mod x n ) x^n) xn)
对比式子 B 2 ( x ) ≡ A ( x ) ( m o d B^2(x)≡A(x)(mod B2(x)≡A(x)(mod x n ) x^n) xn)
可以发现 B ( x ) ≡ B ′ 2 ( x ) + A ( x ) 2 B ′ ( x ) ( m o d B(x)≡\frac{B'^2(x)+A(x)}{2B'(x)}(mod B(x)≡2B′(x)B′2(x)+A(x)(mod x n ) x^n) xn)。
那么我们直接求 ( 2 B ′ ( x ) ) − 1 ( B ′ 2 ( x ) + A ( x ) ) (2B'(x))^{-1}(B'^2(x)+A(x)) (2B′(x))−1(B′2(x)+A(x))即可。
需要用到一个逆元和几个乘法。
分析一下复杂度:
T ( n ) = T ( n 2 ) + O ( n l o g n ) = O ( n l o g n ) T(n)=T(\frac{n}{2})+O(nlogn)=O(nlogn) T(n)=T(2n)+O(nlogn)=O(nlogn)
我们直接套公式就好了
首先我们构造函数 G ( B ( x ) ) = B 2 ( x ) − A ( x ) G(B(x))=B^2(x)-A(x) G(B(x))=B2(x)−A(x)。
再求 G ′ ( B ( x ) ) = 2 B ( x ) G'(B(x))=2B(x) G′(B(x))=2B(x)[把 A ( x ) A(x) A(x)看成常数项]。
代入公式:
B ( x ) = B 0 ( x ) − G ( B 0 ( x ) ) G ′ ( B 0 ( x ) ) B ( x ) = B 0 2 ( x ) + A ( x ) 2 B 0 ( x ) ( m o d x n ) B(x)=B_0(x)-\frac{G(B_0(x))}{G'(B_0(x))}\\ B(x)=\frac{B_0^2(x)+A(x)}{2B_0(x)}(\bmod \: x^n) B(x)=B0(x)−G′(B0(x))G(B0(x))B(x)=2B0(x)B02(x)+A(x)(modxn)
你会发现我们得到的结果是一样的…
void ploy_sqr(int n,int *a,int *b){
static int c[MAXN+5],F[MAXN+5];
if(n==1){
b[0]=1;return ;}
ploy_sqr((n+1)>>1,a,b);
fill(F,F+(n<<1),0),ploy_inv(n,b,F);
int len=1;while(len<(n<<1))len<<=1;
copy(a,a+n,c);
fill(c+n,c+len,0),NTT(c,len,1);
fill(F+n,F+len,0),NTT(F,len,1);
for(int i=0;i<len;i++)c[i]=mul(mul(c[i],inv2),F[i]);
NTT(c,len,-1);
for(int i=0;i<n;i++)
b[i]=add(mul(b[i],inv2),c[i]);
}
给出 n − 1 n-1 n−1 次多项式 A ( x ) A(x) A(x),求一个 m o d x n \bmod{\:x^n} modxn下的多项式 B ( x ) B(x) B(x),满足 B ( x ) ≡ ln A ( x ) B(x) \equiv \ln A(x) B(x)≡lnA(x).
在 mod 998244353 \text{mod } 998244353 mod 998244353 下进行,且 a i ∈ [ 0 , 998244353 ] ∩ Z a_i \in [0, 998244353] \cap \mathbb{Z} ai∈[0,998244353]∩Z
n ≤ 1 0 5 n\leq 10^5 n≤105
保证 a 0 = 1 a_0=1 a0=1
思路很简单…
为了书写方便我们令 f ( x ) = ln x f(x)=\ln x f(x)=lnx。
那么原式就为 B ( x ) ≡ f ( A ( x ) ) ( m o d x n ) B(x)\equiv f(A(x))(\bmod{\:x^n}) B(x)≡f(A(x))(modxn)。
ln x \ln x lnx有一个很重要的性质就是它的导数为 1 x \frac{1}{x} x1,这样我们就把 ln \ln ln去掉了。
因此对原式求导[用到了复合函数求导,上一部分有]:
B ′ ( x ) ≡ f ′ ( A ( x ) ) A ′ ( x ) ( m o d x n ) B ′ ( x ) ≡ A ′ ( x ) A ( x ) ( m o d x n ) B ( x ) ≡ ∫ A ′ ( x ) A ( x ) ( m o d x n ) B'(x)\equiv f'(A(x))A'(x)(\bmod{\:x^n})\\ B'(x)\equiv \frac{A'(x)}{A(x)}(\bmod{\:x^n})\\ B(x)\equiv \int \frac{A'(x)}{A(x)}(\bmod{\:x^n})\\ B′(x)≡f′(A(x))A′(x)(modxn)B′(x)≡A(x)A′(x)(modxn)B(x)≡∫A(x)A′(x)(modxn)
于是多项式导数&积分+多项式求逆就好了。
细节:
其实我们求导+积分是会把常数项给去掉的,所以这题钦定了常数项为 a 0 = 1 a_0=1 a0=1,这时候 ln ( 1 ) = 0 \ln(1)=0 ln(1)=0,所以我们直接在积分结束后将常数项设为 0 0 0即可。
复杂度: O ( n log n ) O(n\log n) O(nlogn)
void ploy_ln(int n,int *a,int *b){
static int A[MAXN+5],B[MAXN+5];
fill(A,A+(n<<1),0),fill(B,B+(n<<1),0);
ploy_der(n,a,A),ploy_inv(n,a,B);
int len=1;while(len<(n<<1))len<<=1;
NTT(A,len,1),NTT(B,len,1);
for(int i=0;i<len;i++)A[i]=mul(A[i],B[i]);
NTT(A,len,-1),ploy_cal(n,A,b);
}
给出 n − 1 n−1 n−1 次多项式 A ( x ) A(x) A(x),求一个 m o d x n \bmod{\:x^n} modxn下的多项式 B ( x ) B(x) B(x),满足 B ( x ) ≡ e A ( x ) B(x) \equiv \text e^{A(x)} B(x)≡eA(x)。系数对 998244353 998244353 998244353 取模。
保证 a 0 = 0 a_0=0 a0=0[跟上面一样的道理]
转化一下式子:
ln B ( x ) − A ( x ) ≡ 0 ( m o d x n ) \ln B(x) -A(x)\equiv 0(\bmod{\:x^n}) lnB(x)−A(x)≡0(modxn)
同样地,构造函数 G ( B ( x ) ) = ln B ( x ) − A ( x ) G(B(x))=\ln B(x) -A(x) G(B(x))=lnB(x)−A(x)。
求 G ′ ( B ( x ) ) = 1 B ( x ) G'(B(x))=\frac{1}{B(x)} G′(B(x))=B(x)1。
B ( x ) = B 0 ( x ) − G ( B 0 ( x ) ) G ′ ( B 0 ( x ) ) B ( x ) = B 0 ( x ) ( 1 − ln B 0 ( x ) + A ( x ) ) ( m o d x n ) B(x)=B_0(x)-\frac{G(B_0(x))}{G'(B_0(x))}\\ B(x)=B_0(x)(1-\ln B_0(x)+A(x))(\bmod \: x^n) B(x)=B0(x)−G′(B0(x))G(B0(x))B(x)=B0(x)(1−lnB0(x)+A(x))(modxn)
然后就没了,需要用到多项式ln和。
复杂度同样是 T ( n ) = T ( n 2 ) + O ( n l o g n ) = O ( n l o g n ) T(n)=T(\frac{n}{2})+O(nlogn)=O(nlogn) T(n)=T(2n)+O(nlogn)=O(nlogn)。
void ploy_exp(int n,int *a,int *b){
static int F[MAXN+5];
if(n==1){
b[0]=1;return ;}
ploy_exp((n+1)>>1,a,b);
fill(F,F+(n<<1),0),ploy_ln(n,b,F);
for(int i=0;i<n;i++)F[i]=dec(a[i],F[i]);
F[0]=add(F[0],1);
int len=1;while(len<(n<<1))len<<=1;
fill(b+n,b+len,0),NTT(b,len,1);
fill(F+n,F+len,0),NTT(F,len,1);
for(int i=0;i<len;i++)b[i]=mul(b[i],F[i]);
NTT(b,len,-1),fill(b+n,b+len,0);
}
给定一个 n − 1 n-1 n−1 次多项式 A ( x ) A(x) A(x),求一个在 m o d x n \bmod\ x^n mod xn意义下的多项式 B ( x ) B(x) B(x),使得 B ( x ) ≡ A k ( x ) ( m o d x n ) B(x)\equiv A^k(x) \ (\bmod\ x^n) B(x)≡Ak(x) (mod xn)。
多项式的系数在 m o d 998244353 \bmod\ 998244353 mod 998244353的意义下进行运算。
很简单,我们之前学了求ln,exp,所以直接换底就行了。
G ( x ) = F k ( x ) ln G ( x ) = k ln F ( x ) G ( x ) = e k ln F ( x ) G(x)=F^k(x)\\ \ln G(x)=k\ln F(x)\\ G(x)=e^{k\ln F(x)} G(x)=Fk(x)lnG(x)=klnF(x)G(x)=eklnF(x)
复杂度: O ( n log n ) O(n\log n) O(nlogn)。
void ploy_ksm(int n,int k,int *a,int *b){
static int C[MAXN+5];
ploy_ln(n,a,C);
for(int i=0;i<n;i++)C[i]=mul(C[i],k);
ploy_exp(n,C,b);
}
若两个多项式 f ( x ) , g ( x ) f(x),g(x) f(x),g(x),满足都没有常数项且一次项系数互为逆元,且 f ( g ( x ) ) = x f(g(x))=x f(g(x))=x,那么称 f ( x ) f(x) f(x)为 g ( x ) g(x) g(x)的复合逆。
根据反演
这个名字我们也知道 f ( g ( x ) ) f(g(x)) f(g(x))会等于 g ( f ( x ) ) g(f(x)) g(f(x))。
然后就有结论:
[ x n ] f ( x ) = 1 n [ x n − 1 ] ( x g ( x ) ) n [x^n]f(x)=\frac{1}{n}[x^{n-1}](\frac{x}{g(x)})^n [xn]f(x)=n1[xn−1](g(x)x)n
还有一个叫扩展拉格朗日反演的东西:
[ x n ] H ( F ( x ) ) = 1 n [ x n − 1 ] H ′ ( x ) ( x G ( x ) ) n [x^n]H(F(x))=\frac{1}{n}[x^{n-1}]H'(x)(\frac{x}{G(x)})^n [xn]H(F(x))=n1[xn−1]H′(x)(G(x)x)n
PS: [ x n ] f ( x ) [x^n]f(x) [xn]f(x)表示 f ( x ) f(x) f(x)第 n n n项的系数。
证明???很多知识都没学过…就算了吧…
细节:
注意到根据定义 g ( x ) g(x) g(x)是没有常数项的,因此没有 g ( x ) g(x) g(x)的逆元,所以我们一般在做拉格朗日反演之前对多项式向右平移一位再求逆。
复杂度: O ( n log n ) O(n\log n) O(nlogn)
int ploy_Lagrange(int n,int k,int *a){
static int C[MAXN+5],D[MAXN+5];
ploy_inv(n,a,C);
ploy_ksm(n,k,C,D);
return mul(D[k-1],pinv[k]);
}
名称 | 公式 | 解决方法 | 复杂度 |
---|---|---|---|
多项式乘法 | F ( x ) = A ( x ) B ( x ) F(x)=A(x)B(x) F(x)=A(x)B(x) | NTT/FFT | O ( n log n ) O(n\log n) O(nlogn) |
多项式求逆 | B ( x ) ≡ 2 B 1 ( x ) − B 1 2 ( x ) A ( x ) ( m o d x n ) B(x)\equiv2B_1(x)-B_1^2(x)A(x)(\mod x^n) B(x)≡2B1(x)−B12(x)A(x)(modxn) | 分治+多项式乘法 | O ( n log n ) O(n\log n) O(nlogn) |
多项式除法 | A R ( x ) B R − 1 ( x ) ≡ D R ( x ) ( m o d x n − m + 1 ) A^R(x)B^{R^{-1}}(x)≡D^R(x)(\mod x^{n-m+1}) AR(x)BR−1(x)≡DR(x)(modxn−m+1) | 多项式求逆 | O ( n log n ) O(n\log n) O(nlogn) |
多项式取模 | P ( x ) = A ( x ) − D ( x ) B ( x ) P(x)=A(x)-D(x)B(x) P(x)=A(x)−D(x)B(x) | 多项式乘法 | O ( n log n ) O(n\log n) O(nlogn) |
多项式求导 | F ′ ( x ) = ∑ i = 1 n i a i x i − 1 F'(x)=\sum^{n}_{i=1}ia_ix^{i-1} F′(x)=∑i=1niaixi−1直接算 | —— | O ( n ) O(n) O(n) |
多项式积分 | ∫ F ( x ) = ∑ i = 1 n a i x i + 1 i + 1 \int F(x)=\sum^{n}_{i=1}\frac{a_ix^{i+1}}{i+1} ∫F(x)=∑i=1ni+1aixi+1直接算 | —— | O ( n ) O(n) O(n) |
多项式开根 | B ( x ) ≡ B 1 2 ( x ) + A ( x ) 2 B 1 ( x ) ( m o d x n ) B(x)≡\frac{B_1^2(x)+A(x)}{2B_1(x)}(\mod x^n) B(x)≡2B1(x)B12(x)+A(x)(modxn) | 分治+多项式求逆 | O ( n log n ) O(n\log n) O(nlogn) |
多项式ln | l n ( F ( x ) ) = ∫ F ′ ( x ) F − 1 ( x ) ln(F(x))=\int F'(x)F^{-1}(x) ln(F(x))=∫F′(x)F−1(x) | 多项式求逆 | O ( n log n ) O(n\log n) O(nlogn) |
多项式exp | F ( x ) ≡ F 0 ( x ) ( 1 − ln F 0 ( x ) + A ( x ) ) ( m o d x n ) F(x)\equiv F_0(x)(1-\ln F_0(x)+A(x))(\mod x^n) F(x)≡F0(x)(1−lnF0(x)+A(x))(modxn) | 多项式ln | O ( n log n ) O(n\log n) O(nlogn) |
多项式多点求值
分成点集 X [ 0 ] = { x 0 , x 1 , x 2 , . . . , x ⌊ n 2 ⌋ } X^{[0]}=\{x_0,x_1,x_2,...,x_{\lfloor \frac{n}{2} \rfloor}\} X[0]={ x0,x1,x2,...,x⌊2n⌋}
X [ 1 ] = { x ⌊ n 2 ⌋ + 1 , x ⌊ n 2 ⌋ + 2 , x ⌊ n 2 ⌋ + 3 , . . . , x n − 1 } X^{[1]}=\{x_{\lfloor \frac{n}{2} \rfloor+1},x_{\lfloor \frac{n}{2} \rfloor+2},x_{\lfloor \frac{n}{2} \rfloor+3},...,x_{n-1}\} X[1]={ x⌊2n⌋+1,x⌊2n⌋+2,x⌊2n⌋+3,...,xn−1}
构造多项式: P [ 0 ] ( x ) = ∏ i = 0 ⌊ n 2 ⌋ ( x − x i ) P^{[0]}(x)=\prod^{\lfloor \frac{n}{2} \rfloor}_{i=0}{(x-x_i)} P[0](x)=∏i=0⌊2n⌋(x−xi)和 P [ 1 ] ( x ) = ∏ i = ⌊ n 2 ⌋ + 1 n ( x − x i ) P^{[1]}(x)=\prod^{n}_{i=\lfloor \frac{n}{2} \rfloor+1}{(x-x_i)} P[1](x)=∏i=⌊2n⌋+1n(x−xi)
有 A [ 0 ] ( x ) ≡ A ( x ) ( m o d P [ 0 ] ( x ) ) A^{[0]}(x)≡A(x)(\bmod P^{[0]}(x)) A[0](x)≡A(x)(modP[0](x))和 A [ 1 ] ( x ) ≡ A ( x ) ( m o d P [ 1 ] ( x ) ) A^{[1]}(x)≡A(x)(\bmod P^{[1]}(x)) A[1](x)≡A(x)(modP[1](x))
分治即可(打不打得出来我也不知道了qwq…)
复杂度: O ( n log 2 n ) O(n\log^2 n) O(nlog2n)
多项式快速插值
分成点集 X [ 0 ] = { ( x 0 , y 0 ) , ( x 1 , y 1 ) , . . . , ( x ⌊ n 2 ⌋ , y ⌊ n 2 ⌋ ) } X^{[0]}=\{(x_0,y_0),(x_1,y_1),...,(x_{\lfloor \frac{n}{2} \rfloor},y_{\lfloor \frac{n}{2} \rfloor})\} X[0]={ (x0,y0),(x1,y1),...,(x⌊2n⌋,y⌊2n⌋)}
X [ 1 ] = { ( x ⌊ n 2 ⌋ + 1 , y ⌊ n 2 ⌋ + 1 ) , ( x ⌊ n 2 ⌋ + 2 , y ⌊ n 2 ⌋ + 2 ) , . . . , ( x n − 1 , y n − 1 ) } X^{[1]}=\{(x_{\lfloor \frac{n}{2} \rfloor+1},y_{\lfloor \frac{n}{2} \rfloor+1}),(x_{\lfloor \frac{n}{2} \rfloor+2},y_{\lfloor \frac{n}{2} \rfloor+2}),...,(x_{n-1},y_{n-1})\} X[1]={ (x⌊2n⌋+1,y⌊2n⌋+1),(x⌊2n⌋+2,y⌊2n⌋+2),...,(xn−1,yn−1)}
构造多项式: X [ 0 ] = { ( x 0 , y 0 ) , ( x 1 , y 1 ) , . . . , ( x ⌊ n 2 ⌋ , y ⌊ n 2 ⌋ ) } X^{[0]}=\{(x_0,y_0),(x_1,y_1),...,(x_{\lfloor \frac{n}{2} \rfloor},y_{\lfloor \frac{n}{2} \rfloor})\} X[0]={ (x0,y0),(x1,y1),...,(x⌊2n⌋,y⌊2n⌋)}
X [ 1 ] = { ( x ⌊ n 2 ⌋ + 1 , y ⌊ n 2 ⌋ + 1 ) , ( x ⌊ n 2 ⌋ + 2 , y ⌊ n 2 ⌋ + 2 ) , . . . , ( x n − 1 , y n − 1 ) } X^{[1]}=\{(x_{\lfloor \frac{n}{2} \rfloor+1},y_{\lfloor \frac{n}{2} \rfloor+1}),(x_{\lfloor \frac{n}{2} \rfloor+2},y_{\lfloor \frac{n}{2} \rfloor+2}),...,(x_{n-1},y_{n-1})\} X[1]={ (x⌊2n⌋+1,y⌊2n⌋+1),(x⌊2n⌋+2,y⌊2n⌋+2),...,(xn−1,yn−1)}
设 A ( x ) , A [ 1 ] ( x ) A(x),A^{[1]}(x) A(x),A[1](x)都未知。
有 A [ 1 ] ( x i ) = y i − A [ 0 ] ( x i ) P ( x i ) A^{[1]}(x_i)=\frac{y_i-A{[0]}(x_i)}{P(x_i)} A[1](xi)=P(xi)yi−A[0](xi)
可以得到一个新的点集 X ′ [ 1 ] X'^{[1]} X′[1]。
用插值法求出 A [ 1 ] ( x ) A^{[1]}(x) A[1](x),再求 A ( x ) A(x) A(x)。
[现在都没调出来…]
复杂度: O ( n log 2 n ) O(n\log^2 n) O(nlog2n)
感谢以下dalao的帮助:
1.Miskcoo大佬:牛顿迭代法在多项式运算的应用
2.CaptainHarryChen学长:多项式的各种操作(逆元,除法,取模,开根,对数,exp,多点求值,插值,牛顿迭代法)
3.alan_cty大佬:拉格朗日反演
同时,也用作学习资料供大家参考。