[学习笔记][省选算法]多项式乘法之 FFT & NTT 及卷积

这篇博客讲述了在神犇协会的讨论中,通过考题来教授快速傅里叶变换(FFT)和快速数论变换(NTT)的知识。内容涵盖复数、单位根、原根等预备知识,详细解释了如何进行多项式乘法、DFT、IDFT,并探讨了FFT的递归和迭代实现,以及NTT在模数意义下的应用。此外,还提到了如何解决NTT的任意模数问题,并给出了多个使用FFT和NTT解题的实际例子。
摘要由CSDN通过智能技术生成

一、开头

(Place :山东省神犇协会第 998244353 会议厅)
SD 神犇 998244353 号(会长):所有神犇,洛谷黑题都切完了吗?
全体神犇:切完了!
神犇 1004535809 号: 998244353 ,我昨天看到一个弱鸡,洛谷名叫 xyz32768 ,他一道黑题都没做,您认为应该怎样呢?
神犇 998244353 号:这个问题您们考虑一下,应该用怎样的方式把 xyz32768 D 一遍。时刻记住,我们协会的口号:见一弱鸡, D 一弱鸡!
神犇 167772161 号:要不,考他 FFT 吧。这是我们协会里每个人都会的算法!
神犇 998244353 号:Good idea !
(Place : FFT 星球 DFT 国 IDFT 省 NTT 市)
神犇 167772161 号:哈哈,好久没见,我们搞 OI 多年,能回忆起的比赛,至少也从三年前的 SDOI 2015 开始吧,那次比赛有一道十分模板的题。题目名称:序列统计。题面你自己去 BZOJ 或洛谷上去查,如果你 1h 内写不出来我会对整个 FFT 星球说你菜!
xyz32768 :BZOJ 3992 / 洛谷 P3321 ?
神犇 1004535809 号:对。这是一道紫题,但此大佬已经将之视为宇宙之水题了。
(蒟蒻 xyz32768 当然不会,看了看算法标签)
xyz32768 : 什么?????? 快速傅里叶变换,DFT,FFT ??????
神犇 998244353 号:哈哈哈哈哈,你真是菜啊, FFT 这么水的算法都不会,再见蒟蒻!
神犇 998244353 号 & 神犇 1004535809 号 & 神犇 167772161 号(大声喊): xyz32768 菜, xyz32768 好菜, xyz32768 最菜!

二、预备知识

1、复数

下面的 i i ,除非作为 求和的变量,其余都表示虚数单位 1 − 1
一个复数可以表示成 a+bi a + b i 的形式,也可以表示成 r(cosθ+isinθ) r ( cos ⁡ θ + i sin ⁡ θ ) 的形式。
上面 a a 为实部, b 为虚部, r=a2+b2 r = a 2 + b 2 为模长, θ=arctanba θ = arctan ⁡ b a 为辐角。
C++ 中,

#include <bits/stdc++.h>
using namespace std;

复数类为( T 为实部和虚部的数据类型):

complex<T>

定义一个复数( a a 为实部, b 为虚部)

complex <T> x(a, b)

实部

x.real()

一个复数 a+bi a + b i 对应复平面上一个点 (a,b) ( a , b ) ,模长 r r 为点到原点的距离,辐角 θ 为终边为 (0,0)(a,b) ( 0 , 0 ) − ( a , b ) 的角(即该边与 x 轴正半轴形成的角)。

2、单位根

ωn=cos2πn+isin2πn ω n = cos ⁡ 2 π n + i sin ⁡ 2 π n

那么
ω0n,ω1n,ω2n,...,ωn1n ω n 0 , ω n 1 , ω n 2 , . . . , ω n n − 1
称为 n n 次单位根。
如:
ω 4 0 = 1 , ω 4 1 = i , ω 4 2 = 1 , ω 4 3 = i

n n 次单位根的性质 :
(1) n 次单位根所表示的点分布在复平面的单位圆上,并且把圆周等分成 n n 段。
(2) n 次单位根的 n n 次方等于 1
(3)
ω2i2n=ωin,ωn2n=1,ωn+i2n=ωi2n ω 2 n 2 i = ω n i , ω 2 n n = − 1 , ω 2 n n + i = − ω 2 n i

3、原根

在模 p p (为质数)意义下,如果存在数 g ,满足

g0,g1,g2,...,gp2 g 0 , g 1 , g 2 , . . . , g p − 2

互不相同,那么 g g 为模 p 的原根。
原根都比较小,可以暴力枚举。将 p1 p − 1 分解质因数,对于一个 g g ,如果对于 p 1 的任何一个质因子 x x ,都有
g p 1 x 1

那么 g g 是模 p 的一个原根。

三、多项式乘法

步入正题。一个 n n 次多项式 A 和一个 n n 次多项式 B 相乘,设 A A 的系数为 a 0... n xi x i 的项系数为 ai a i ), B B 的系数为 b 0... n ,那么

abk=i+j=kaibj a b k = ∑ i + j = k a i b j

复杂度显然是 O(n2) O ( n 2 ) 的。快速傅里叶变换( FFT )则能做到 O(nlogn) O ( n log ⁡ n ) 的复杂度。

四、多项式的点值表示及 DFT

多项式的点值表示:选取 n+1 n + 1 互不相同的值 x0...n x 0... n 代入 A A 对多项式进行求值,得到 n + 1 个多项式值,那么这 n+1 n + 1 个自变量和这 n+1

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值