本文共 2914 字,大约阅读时间需要 9 分钟。
markdown源码https://paste.ubuntu.com/p/wyNvxb4PPQ/
假设在   m o d   x n \bmod x^n modxn下,多项式 A A A的逆元是 F F F,在   m o d   x ⌈ n / 2 ⌉ \bmod x^{\lceil n/2\rceil} modx⌈n/2⌉下,多项式 A A A的逆元是 F 0 F_0 F0,根据多项式求逆的基本公式
F = 2 F 0 − F 0 2 A m o d    x n F=2F_0-F_0^2A \mod x^n F=2F0−F02Amodxn 首先定义,对于一个多项式 F F F, F ( k ) F(k) F(k)为其在 x k x^k xk时的系数。(当然,正确的写法是 [ x k ] F [x^k]F [xk]F,但是写起来不是很方便,因此修改了一下)
展开
F ( x ) = 2 F 0 ( x ) − ∑ j = 0 x F 0 ( j ) ∑ k = 0 x − j F 0 ( k ) A ( x − j − k ) F(x)=2F_0(x)-\sum_{j=0}^x F_0(j)\sum_{k=0}^{x-j}F_0(k)A(x-j-k) F(x)=2F0(x)−j=0∑xF0(j)k=0∑x−jF0(k)A(x−j−k) 首先假设 R ( x ) = ∑ i = 0 x F 0 ( i ) A ( x − i ) R(x)=\sum_{i=0}^x F_0(i)A(x-i) R(x)=i=0∑xF0(i)A(x−i) 由逆元的定义可得在 x < ⌈ n 2 ⌉ x<\lceil \frac{n}{2}\rceil x<⌈2n⌉的情况下, R ( x ) = [ x = 0 ] R(x)=[x=0] R(x)=[x=0]。-
对于 x < ⌈ n 2 ⌉ x<\lceil \frac{n}{2}\rceil x<⌈2n⌉的情况,可以得到
F ( x ) = 2 F 0 ( x ) − ∑ j = 0 x F 0 ( j ) R ( x − j ) F(x)=2F_0(x)-\sum_{j=0}^x F_0(j)R(x-j) F(x)=2F0(x)−j=0∑xF0(j)R(x−j) 由于 x < ⌈ n 2 ⌉ x<\lceil \frac{n}{2}\rceil x<⌈2n⌉,因此 R ( x − j ) R(x-j) R(x−j)只有在 j = x j=x j=x时值为 1 1 1,其他情况都为 0 0 0,因此 F ( x ) = 2 F 0 ( x ) − F 0 ( x ) = F 0 ( x ) F(x)=2F_0(x)-F_0(x)=F_0(x) F(x)=2F0(x)−F0(x)=F0(x) -
对于 x ≥ ⌈ n 2 ⌉ x\geq \lceil\frac{n}{2}\rceil x≥⌈2n⌉的情况,由于 F 0 F_0 F0的次数为 ⌈ n 2 ⌉ − 1 \lceil \frac{n}{2}\rceil-1 ⌈2n⌉−1,因此 F 0 ( x ) F_0(x) F0(x)当 x ≥ ⌈ n 2 ⌉ x\geq \lceil \frac{n}{2}\rceil x≥⌈2n⌉时值为 0 0 0,
F ( x ) = − ∑ j = 0 x F 0 ( j ) R ( x − j ) F(x)=-\sum_{j=0}^x F_0(j)R(x-j) F(x)=−j=0∑xF0(j)R(x−j) 若 x − j < ⌈ n 2 ⌉ x-j< \lceil \frac{n}{2}\rceil x−j<⌈2n⌉,则 R ( x − j ) = 0 R(x-j)=0 R(x−j)=0,因此 F ( x ) = − ∑ j = 0 x − ⌈ n / 2 ⌉ F 0 ( j ) R ( x − j ) F(x)=-\sum_{j=0}^{x-\lceil n/2\rceil}F_0(j)R(x-j) F(x)=−j=0∑x−⌈n/2⌉F0(j)R(x−j) 定义 G = − F 0 [ R x ⌈ n / 2 ⌉ ] x ⌈ n / 2 ⌉ G=-F_0[\frac{R}{x^{\lceil n/2\rceil}}]x^{\lceil n/2\rceil} G=−F0[x⌈n/2⌉R]x⌈n/2⌉ 其中,对于一个多项式 F F F,定义 [ F ] [F] [F]为 F F F舍弃 ∀ k < 0 , x k \forall k<0,x^k ∀k<0,xk与其系数,例如 [ 6 x − 3 + 2 + 5 x ] = 2 + 5 x [6x^{-3}+2+5x]=2+5x [6x−3+2+5x]=2+5x。展开得到
G ( x ) = − ∑ j = 0 n − 1 F 0 ( j ) R ( x − j ) [ x − j ≥ ⌈ n 2 ⌉ ] G(x)=-\sum_{j=0}^{n-1}F_0(j)R(x-j)[x-j\geq \lceil \frac{n}{2}\rceil] G(x)=−j=0∑n−1F0(j)R(x−j)[x−j≥⌈2n⌉] 即 G ( x ) = − ∑ j = 0 x − ⌈ n / 2 ⌉ F 0 ( j ) R ( x − j ) G(x)=-\sum_{j=0}^{x-\lceil n/2\rceil}F_0(j)R(x-j) G(x)=−j=0∑x−⌈n/2⌉F0(j)R(x−j) 容易发现 G ( x ) = F ( x ) G(x)=F(x) G(x)=F(x) 而 G G G在求出 R R R的基础上只需要求一个 ⌈ n 2 ⌉ \lceil \frac{n}{2}\rceil ⌈2n⌉次多项式和一个 n − ⌈ n 2 ⌉ n-\lceil \frac{n}{2}\rceil n−⌈2n⌉次多项式的乘积,较为简便。
代码
inline int getinv(int *s,int len,int *res){ if(len==1) { res[0]=quickpow(s[0],mod-2); return 0; } int k=(len+1)/2; getinv(s,k,res); for(int i=0; i
其中multi(int *a,int lena,int *b,int lenb,int *res,int k)
函数代表将多项式a
和多项式b
乘起来并   m o d   x k \bmod x^{k} modxk保存在res
数组中。
转载地址:https://blog.csdn.net/wang3312362136/article/details/86160828 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!