基本概念
多项式的度:对于一个多项式 A(x)A(x) ,称其最高项次数为多项式的度,记作 degAdegA
多项式的逆元:对于 A(x)A(x) 若存在 B(x)B(x) 满足 degB≤degAdegB≤degA 且
A(x)B(x)≡1(modxn)A(x)B(x)≡1(modxn)
就称 B(x)B(x) 为 A(x)A(x) 在模 xnxn 意义下的逆元。实际上就是多项式乘法的逆元。注意是多项式逆元是在数乘法有逆元的前提下才有的。
算法
大概是个倍增。
当 n=1n=1 时,A(x)≡a0(modx)A(x)≡a0(modx) ,所以A−1(x)=c−1A−1(x)=c−1 。
当 n>1n>1 时,设 B(x)B(x) 是 A(x)A(x) 模 xnxn 下的逆元,设 B′(x)B′(x)是 A(x)A(x) 模 x⌊n2⌋x⌊n2⌋ 下的逆元且已求出,则
A(x)B(x)≡1(modx⌊n2⌋),A(x)B′(x)≡1(modx⌊n2⌋)A(x)B(x)≡1(modx⌊n2⌋),A(x)B′(x)≡1(modx⌊n2⌋)
两式相减,得
B(x)−B′(x)≡0(modx⌊n2⌋)B(x)−B′(x)≡0(modx⌊n2⌋)
现在是重要的一步,两边平方,把 x⌊n2⌋x⌊n2⌋ 推到 xnxn :
B2(x)−2B(x)B′(x)+B′2(x)≡0(modxn)B2(x)−2B(x)B′(x)+B′2(x)≡0(modxn)
然后同乘 A(x)A(x) :
B(x)≡2B′(x)−B′2(x)A(x)(modxn)B(x)≡2B′(x)−B′2(x)A(x)(modxn)
就可以倍增啦,用 NTTNTT 做乘法,复杂度:
T(n)=T(n/2)+O(nlogn)=O(nlogn)T(n)=T(n/2)+O(nlogn)=O(nlogn)
模板:
#include<cstdio>
int main(){
}