在摸索了很久很久,还是没找到多项式的正确入门方式,所以尝试着自己写一下
内容包含
- 多项式乘法
- 多项式求逆
- 多项式除法
- 多项式取模
- 多项式开根(待更新)
- 多项式求ln(待更新)
- 多项式求exp(待更新)
多项式乘法
- 对于多项式 A ( x ) , B ( x ) A(x),B(x) A(x),B(x) A ( x ) = a n x n + a n − 1 x n − 1 + a n − 2 x n − 2 + a n − 3 x n − 3 + . . . + a 1 x + a 0 A(x)=a_nx^n + a_{n-1}x ^ {n-1} + a_{n-2}x ^ {n-2} + a_{n-3}x ^ {n-3} + ... + a_1x + a_0 A(x)=anxn+an−1xn−1+an−2xn−2+an−3xn−3+...+a1x+a0 B ( x ) = b n x n + b n − 1 x n − 1 + b n − 2 x n − 2 + b n − 3 x n − 3 + . . . + b 1 x + b 0 B(x)=b_nx^n + b_{n-1}x ^ {n-1} + b_{n-2}x ^ {n-2} + b_{n-3}x ^ {n-3} + ... + b_1x + b_0 B(x)=bnxn+bn−1xn−1+bn−2xn−2+bn−3xn−3+...+b1x+b0
G ( x ) = A ( x ) B ( x ) G(x) = A(x)B(x) G(x)=A(x)B(x) 中第 x x x 项的系数 g x = ∑ i + j = x a i b j g_x=\sum_{i+j=x}a_ib_j gx=i+j=x∑aibj
这是一个卷积的形式,因此我们可以考虑使用 F F T FFT FFT 或者 N T T NTT NTT 来优化这个卷积,这样就可以在 O ( n l o g ( n ) ) O(nlog(n)) O(nlog(n)) 时间内实现多项式乘法
void mul(LL* a,int n, LL* b,int m){
for(int i=n+1; i<=Lim; i++) a[i] = 0;
for(int i=m+1; i<=Lim; i++) b[i] = 0;
for(int i=0; i<=n; i++) a[i] = (a[i]%P + P) % P; // 第一个多项式系数
for(int i=0; i<=m; i++) b[i] = (b[i]%P + P) % P; // 第二个多项式系数
NTT(a,1); NTT(b,1);
for(int i=0; i<= Lim; i++) a[i] = a[i]*b[i] % P; // O(n)求点值表示法
NTT(a,-1); // 逆变换变成系数表示法
}