我们学过了FFT(没学过看这里),发现很滋磁。但是FFT涉及小数,有可能有精度问题,所以这就很闹心了……发现精度问题出现在DFT和IDFT中求
sin
\sin
sin和
cos
\cos
cos导致精度问题和IDFT中乘以
1
n
\frac{1}{n}
n1的精度问题,所以我们考虑能否在整数范围内实现FFT的过程。
那么整数范围内的问题需要数论解决,这就导致了NTT(也叫FNT)的诞生。
可以说,精度问题主要由
n
n
n次单位根引起。回顾FFT,我们用了
n
n
n次单位根,也就是
ω
n
k
\omega_n^k
ωnk的哪些性质?
好像也就是三个引理吧……
列出来所用的性质们:(一些条件有省略,具体请详见FFT学习笔记)
1、
ω
n
n
=
e
2
k
π
i
=
1
\omega_n^n=e^{2k\pi i}=1
ωnn=e2kπi=1;
2、
∀
i
,
j
∈
[
0
,
n
−
1
]
\forall i,j\in [0,n-1]
∀i,j∈[0,n−1]且
i
,
j
∈
Z
,
i
≠
j
i,j\in \mathbb{Z},i\not =j
i,j∈Z,i=j,
ω
n
i
≠
ω
n
j
\omega_n^i\not =\omega_n^j
ωni=ωnj;
3、(折半引理)
(
ω
n
k
)
2
=
ω
n
2
k
(\omega_n^k)^2=\omega_{\frac{n}{2}}^k
(ωnk)2=ω2nk,
ω
n
k
+
n
2
=
−
ω
n
k
\omega_n^{k+\frac{n}{2}}=-\omega_n^k
ωnk+2n=−ωnk;
4、(求和引理)
∑
j
=
0
n
−
1
(
ω
n
k
)
j
=
0
(
k
≠
0
)
\sum\limits_{j=0}^{n-1}(\omega_n^k)^j=0\ \ (k\not =0)
j=0∑n−1(ωnk)j=0 (k=0)。
所以,我们需要在整数范围内找到一个符合这四条性质的一种数。于是我们找到了一种特殊的数——原根。
网上并没有统一的原根的定义,维基百科看不懂(我太弱了……),介绍一下性质。
1、对于一个质数
P
P
P,如果存在原根
g
g
g,则
g
i
≠
g
j
(
m
o
d
P
)
g^i\not =g^j\ \ (\bmod P\ )
gi=gj (modP )。其中
i
≠
j
i\not =j
i=j。
别问我怎么证,有的讲稿是用它定义原根的……
有些证明用到了反证法(但是我觉得有点问题……)
了解就行。
于是这就符合了第二条。
然后,我们用
g
φ
(
P
)
n
g^{\frac{\varphi (P)}{n}}
gnφ(P)代替
n
n
n次单位根进行计算,由
φ
(
P
)
=
P
−
1
\varphi (P)=P-1
φ(P)=P−1,要求
φ
(
P
)
n
\frac{\varphi (P)}{n}
nφ(P)为整数,
n
n
n还是
2
2
2的整数次幂,所以要求
P
=
k
∗
2
q
+
1
P=k*2^q+1
P=k∗2q+1,其中
2
q
≥
n
2^q\ge n
2q≥n。
然后大力推式子,会发现所有的性质都符合……
如果模数任意呢?
如果要模数是
P
P
P,那么多项式的所有系数和不会超过
n
(
P
−
1
)
2
n(P-1)^2
n(P−1)2。所以找出一组
p
p
p,使得
p
i
=
k
i
∗
2
q
i
+
1
p_i=k_i*2^{q_i}+1
pi=ki∗2qi+1,且:
∏
i
=
0
k
−
1
p
i
>
n
(
P
−
1
)
2
\prod_{i=0}^{k-1}p_i>n(P-1)^2
i=0∏k−1pi>n(P−1)2
然后按每个
p
p
p做NTT,然后CRT合并……
又双叒叕CRT合并……
本身NTT常数就比较大,和FFT差不多吧……(中间有快速幂)。
Po姐:“此外,一个答案模一个数的计数问题必须用NTT。”
板子以后补,接着挖坑……
这里是一些常用质数的原根。
[NTT] 快速数论变换学习笔记
最新推荐文章于 2022-05-11 12:55:11 发布