[拉格朗日反演][FFT][NTT][多项式大全]详解

1、目录

2、多项式的两种表示法

1.系数表示法

我们最常用的多项式表示法就是系数表示法,一个次数界为 n n 的多项式 S ( x ) 可以用一个向量 s=(s0,s1,s2,,sn1) s = ( s 0 , s 1 , s 2 , ⋯ , s n − 1 ) 系数表示如下:

S(x)=k=0n1skxk S ( x ) = ∑ k = 0 n − 1 s k x k

系数表示法很适合做加法,可以在 O(n) O ( n ) 的时间复杂度内完成,表达式为:

S(x)=A(x)+B(x)=k=0n1(ak+bk)xk S ( x ) = A ( x ) + B ( x ) = ∑ k = 0 n − 1 ( a k + b k ) x k

当中

sk=ak+bk s k = a k + b k

但是,系数表示法不适合做乘法,时间复杂度为 O(n2) O ( n 2 ) ,表达式为:

S(x)=A(x)B(x)=k=0n1(j=0n1ajbkj)xk S ( x ) = A ( x ) B ( x ) = ∑ k = 0 n − 1 ( ∑ j = 0 n − 1 a j b k − j ) x k

当中

sk=j=0kajbkj s k = ∑ j = 0 k a j b k − j

这就是卷积的一般形式,记 s=ab s = a ⊗ b ,我们要想办法加速这个过程。

2.点值表示法

顾名思义,点值就是多项式在一个点处的值。多项式 A(x) A ( x ) 点值表达是一个集合:

{ (x0,y0),(x1,y1),(x2,y2),,(xn1,yn1)} { ( x 0 , y 0 ) , ( x 1 , y 1 ) , ( x 2 , y 2 ) , ⋯ , ( x n − 1 , y n − 1 ) }

使得对于 k=0,1,2,,n1 k = 0 , 1 , 2 , ⋯ , n − 1 xk x k 两两不相同且 yk=A(xk) y k = A ( x k )

n n 个点可以确定唯一一个 n 次多项式。

点值表达有很多优良的性质,加法和乘法都可以在 O(n) O ( n ) 的时间复杂度内完成。

现有 A(x) A ( x ) 的点值表达

{ (x0,y0),(x1,y1),(x2,y2),,(xn1,yn1)} { ( x 0 , y 0 ) , ( x 1 , y 1 ) , ( x 2 , y 2 ) , ⋯ , ( x n − 1 , y n − 1 ) }
B(x) B ( x ) 的点值表达
{ (x0,y0),(x1,y1),(x2,y2),,(xn1,yn1)} { ( x 0 , y 0 ′ ) , ( x 1 , y 1 ′ ) , ( x 2 , y 2 ′ ) , ⋯ , ( x n − 1 , y n − 1 ′ ) }

C(x)=A(x)+B(x) C ( x ) = A ( x ) + B ( x ) 的点值表达为:

{ (x0,y0+y0),(x1,y1+y1),(x2,y2+y2),,(xn1,yn1+yn1)} { ( x 0 , y 0 + y 0 ′ ) , ( x 1 , y 1 + y 1 ′ ) , ( x 2 , y 2 + y 2 ′ ) , ⋯ , ( x n − 1 , y n − 1 + y n − 1 ′ ) }

C(x)=A(x)B(x) C ( x ) = A ( x ) B ( x ) 的点值表达为:

{ (x0,y0y0),(x1,y1y1),(x2,y2y2),,(xn1,yn1yn1)} { ( x 0 , y 0 y 0 ′ ) , ( x 1 , y 1 y 1 ′ ) , ( x 2 , y 2 y 2 ′ ) , ⋯ , ( x n − 1 , y n − 1 y n − 1 ′ ) }

可见,点值表示可以帮助我们更快地进行卷积,可是如何在系数表示法和点值表示法之间相互转化呢?

3、复数

x x 为实数时,无法很好地对转换方法进行优化。为了优化计算 x n 所浪费的时间,我们需要 x x 有循环的性质。但点值表示法需要 n 个两两不同的值,而在实数域中只有 1 1 1 ,因此,我们需要复数的帮助。

1.复数、复平面的定义

我们把形如 a+bi a + b i 的数称为复数 z z ,其中 a 实部(Real),记为 Rz ℜ z b b 虚部(Imaginary),记为 z

每一点都对应唯一复数的平面叫复平面,相当于一个把 Rz ℜ z 作为横坐标,把 Iz ℑ z 作为纵坐标的笛卡尔坐标系。如图:

模长:复平面上原点到复数 z z 的距离,记为 | z | 。根据勾股定理, |z|=|a+bi|=a2+b2 | z | = | a + b i | = a 2 + b 2

辐角:复平面上 x x 轴与复数 z 所对应向量之间的夹角,在 (π2,π2) ( − π 2 , π 2 ) 之间的记为辐角主值 argz arg ⁡ z

2.欧拉公式

大名鼎鼎的欧拉公式:

eit=cost+isint e i t = cos ⁡ t + i sin ⁡ t

根据三角函数在单位圆上的几何意义,公式是容易理解的。

几何意义:

当中 θ θ 为角度, t t 为弧长。

则根据欧拉公式,可将一个复数表示为一个二元组 ( a , θ ) ,即模长和辐角(相当于复平面上极坐标系的表示方法)。值为: a(cosθ+isinθ) a ( cos ⁡ θ + i sin ⁡ θ )

特殊情况:欧拉恒等式 eiπ+1=0 e i π + 1 = 0

3.复数的运算
(1)复数加法

运算规则:实部、虚部分别相加

(a+bi)+(c+di)=a+c+bi+di=(a+c)+(b+d)i ( a + b i ) + ( c + d i ) = a + c + b i + d i = ( a + c ) + ( b + d ) i

几何意义:如图

结果相当于两个向量所构成的平行四边形的对角线。如果把一个复数所对应的向量视为一个移动的变换,那么向量加法就是连续运用这两个变换相当于的新变换。

(2)复数乘法

运算规则:展开

(a+bi)(c+di)=ac+adi+bci+bdi2=(acbd)+(ad+bc)i ( a + b i ) ( c + d i ) = a c + a d i + b c i + b d i 2 = ( a c − b d ) + ( a d + b c ) i

几何意义:如图

如图, arga+argb=arga×b arg ⁡ a + arg ⁡ b = arg ⁡ a × b , |a|×|b|=|a×b| | a | × | b | = | a × b |

总结就是:模长相乘,辐角相加

因此,如果模长为 1 1 ,那么它的 n 次方一定还在单位圆上。

证明:

根据欧拉公式,已知 x=(a1,θ1)=a1(cosθ1+isinθ1),y=(a2,θ2)=a2(cosθ2+isinθ2) x = ( a 1 , θ 1 ) = a 1 ( cos ⁡ θ 1 + i sin ⁡ θ 1 ) , y = ( a 2 , θ 2 ) = a 2 ( cos ⁡ θ 2 + i sin ⁡ θ 2 )

x×y=a1a2(cosθ1+isinθ1)(cosθ2+isinθ2)=a1a2[(cosθ1cosθ2sinθ1sinθ2)+i(cosθ1sinθ2+sinθ1cosθ2)]=a1a2[(cos(θ1+θ2)+cos(θ1θ2)2+cos(θ1+θ2)cos(θ1θ2)2)+i(sin(θ1+θ2)sin(θ1θ2)2+sin(θ1+θ2)+sin(θ1θ2)2)]=a1a2[cos(θ1+θ2)+isin(θ1+θ2)]() x × y = a 1 a 2 ( cos ⁡ θ 1 + i sin ⁡ θ 1 ) ( cos ⁡ θ 2 + i sin ⁡ θ 2 ) = a 1 a 2 [ ( cos ⁡ θ 1 cos ⁡ θ 2 − sin ⁡ θ 1 sin ⁡ θ 2 ) + i ( cos ⁡ θ 1 sin ⁡ θ 2 + sin ⁡ θ 1 cos ⁡ θ 2 ) ] = a 1 a 2 [ ( cos ⁡ ( θ 1 + θ 2 ) + cos ⁡ ( θ 1 − θ 2 ) 2 + cos ⁡ ( θ 1 + θ 2 ) − cos ⁡ ( θ 1 − θ 2 ) 2 ) (积化和差公式) + i ( sin ⁡ ( θ 1 + θ 2 ) − sin ⁡ ( θ 1 − θ 2 ) 2 + sin ⁡ ( θ 1 + θ 2 ) + sin ⁡ ( θ 1 − θ 2 ) 2 ) ] = a 1 a 2 [ cos ⁡ ( θ 1 + θ 2 ) + i sin ⁡ ( θ 1 + θ 2 ) ]

|x×y|=|x|×|y|,arg(x×y)=argx+argy ∴ | x × y | = | x | × | y | , arg ⁡ ( x × y ) = arg ⁡ x + arg ⁡ y

证毕。

4.单位复数根
(1)基本性质

单位复数根是方程 ωn=1 ω n = 1 的解,第 k k 个解记为 ω n k (这里的 k k 事实上是乘方的含义)

n = 16 的解在复平面上的位置如下:

可以看到, n n 个解把单位圆分成了 n 等弧,交点即为根。而且, ωkn ω n k 实际上是 ωn ω n n n 次方,模长仍为 1 ,辐角翻倍!

为什么呢?

|xn|=|x|n,argxn=nargx ∵ | x n | = | x | n , arg ⁡ x n = n arg ⁡ x

|ω|n=|ωn|,argωn=nargω ∴ | ω | n = | ω n | , arg ⁡ ω n = n arg ⁡ ω

|ω|n=1(|ω|R+),argω=360n ∴ | ω | n = 1 ( | ω | ∈ R + ) , arg ⁡ ω = 360 ∘ n

|ω|=1,argω=360n ∴ | ω | = 1 , arg ⁡ ω = 360 ∘ n

这就很明显了。

所以, ωkn ω n k 事实上表示的是 ωn ω n k k 次幂。为什么选择单位复数根呢?因为它有循环的优良性质,即 ω n n = 1 。由于其他的都可以由 ω1n ω n 1 得到,因此称为主 n n 次单位根,又记为 ω n

根据单位复数根的平分圆的意义和欧拉公式, ωkn=e2πikn=cos2πkn+isin2πkn ω n k = e 2 π i k n = cos ⁡ 2 π k n + i sin ⁡ 2 π k n

(2)计算引理

显然,由于单位复数根循环( ωznn=e2πiz=[(eπi)2]z=1z=1 ω n z n = e 2 π i z = [ ( e π i ) 2 ] z = 1 z = 1 ),有变换恒等式

ωkn=ωk+wnn(wZ) ω n k = ω n k + w n ( w ∈ Z )

每一份再分成 k k 份,编号也变成 k 倍,位置自然不变( ωdkdn=e2πidkdn=e2πikn=ωkn ω d n d k = e 2 π i d k d n = e 2 π i k n = ω n k ),所以有消去引理

ωd
  • 6
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值