数论变换是用来干什么的?
数论变换是用来快速高效地计算系数为 Z q Z_q Zq多项式环乘法运算结果的一个算法。
多项式定义
f ( x ) = ∑ i = 0 n a i x i f(x)=\sum_{i=0}^{n}a_ix^i f(x)=∑i=0naixi
- 多项式的根: f ( x 0 ) = 0 f(x_0)=0 f(x0)=0, x 0 x_0 x0为多项式的根
- 若 a n ≠ 0 , d e g ( f ) = n a_n \neq 0, deg(f) =n an=0,deg(f)=n
多项式乘法
f ( x ) = ∑ i = 0 n a i x i f(x)=\sum_{i=0}^{n}a_ix^i f(x)=∑i=0naixi g ( x ) = ∑ j = 0 n a j y j g(x)=\sum_{j=0}^{n}a_jy^j g(x)=∑j=0najyj
f ( x ) ⋅ g ( x ) = ∑ i = 0 n + m C t x t f(x)\cdot g(x)=\sum_{i=0}^{n+m}C_tx^t f(x)⋅g(x)=∑i=0n+mCtxt
其中 C t = ∑ i + j = t a i b j C_t=\sum_{i+j=t}a_ib_j Ct=∑i+j=taibj
并且满足 d e g ( f ) > = d e g ( g ) , f ( x ) ≠ 0 deg(f)>=deg(g), f(x)\neq0 deg(f)>=deg(g),f(x)=0
多项式 f f f和 g g g的乘积 h h h称为 f f f和 g g g的折叠卷积
群的定义
带有二元运算的集合G(以下默认集合非空)
满足以下条件:
1、结合律
2、存在零元
3、有可逆元
Abel群
在以上定义的基础上还满足交换律
a + b = b + a a+b=b+a a+b=b+a
环的定义
对集合 R R R,现在有两种运算, + + +和 ⋅ \cdot ⋅,满足
1、在 + + +(加法)下成Abel群
2、 a ⋅ ( b ⋅ c ) = ( a ⋅ b ) ⋅ c a \cdot (b \cdot c)=(a \cdot b) \cdot c a⋅(b⋅c)=(a⋅b)⋅c(结合律)
3、 ( a + b ) ⋅ c = a c + b c (a+b)\cdot c = ac + bc (a+b)⋅c=ac+bc(分配率)
则称集合 R R R为环
多项式环、多项式商环
多项式环就是多项式系数在环上。多项式商环就是多项式环模了一个多项式
多项式商环下的乘法
现在存在一个多项式环
Z
q
[
x
]
/
(
x
n
+
1
)
,
n
=
2
m
\mathbb{Z}_{q}[x]/(x^n+1),n=2^m
Zq[x]/(xn+1),n=2m(
n
n
n是2的某次幂),
q
q
q是素数,并且满足
2
n
∣
(
q
−
1
)
2n|(q-1)
2n∣(q−1)
其中
f
,
g
f,g
f,g都是是属于多项式环的,需要计算多项式环
f
,
g
f,g
f,g的乘积:
f
,
g
∈
Z
q
/
(
x
n
+
1
)
h
=
f
⋅
g
∈
Z
q
/
(
x
n
+
1
)
f
=
(
f
0
,
f
1
,
f
2
,
.
.
.
,
f
n
−
1
)
g
=
(
g
0
,
g
1
,
g
2
,
.
.
.
,
g
n
−
1
)
f,g \in \mathbb{Z}_{q} /( x^n +1) \\ h=f\cdot g \in \mathbb{Z}_{q}/(x^n+1) \\ f=(f_0,f_1,f_2,...,f_{n-1}) \\ g=(g_0,g_1,g_2,...,g_{n-1}) \\
f,g∈Zq/(xn+1)h=f⋅g∈Zq/(xn+1)f=(f0,f1,f2,...,fn−1)g=(g0,g1,g2,...,gn−1)
1、令
h
ˉ
=
f
⋅
g
∈
Z
q
[
x
]
\bar{h}=f \cdot g \in \mathbb{Z}_{q}[x]
hˉ=f⋅g∈Zq[x](也就是传统多项式乘法)
h
ˉ
=
(
h
0
ˉ
,
h
1
ˉ
,
h
2
ˉ
,
.
.
.
,
h
n
−
1
ˉ
,
h
n
ˉ
,
.
.
.
,
h
2
n
−
2
ˉ
)
\bar{h}=(\bar{h_0},\bar{h_1},\bar{h_2},...,\bar{h_{n-1}},\bar{h_n},...,\bar{h_{2n-2}})
hˉ=(h0ˉ,h1ˉ,h2ˉ,...,hn−1ˉ,hnˉ,...,h2n−2ˉ)
2、
h
=
h
ˉ
m
o
d
(
x
n
+
1
)
h=\bar{h} mod (x^n +1)
h=hˉmod(xn+1) 令
x
n
=
−
1
x^n=-1
xn=−1
则可以得到:
h
=
(
h
0
ˉ
−
h
n
ˉ
,
h
1
ˉ
−
h
n
+
1
ˉ
,
.
.
.
,
h
n
+
2
ˉ
−
h
2
n
−
2
ˉ
,
h
n
−
1
ˉ
)
h=(\bar{h_0}-\bar{h_n},\bar{h_1}-\bar{h_{n+1}},...,\bar{h_{n+2}}-\bar{h_{2n-2}},\bar{h_{n-1}})
h=(h0ˉ−hnˉ,h1ˉ−hn+1ˉ,...,hn+2ˉ−h2n−2ˉ,hn−1ˉ)
具体推导过程如下:
根据上文提到的多项式乘法结果,我们可以把其中的
h
ˉ
\bar{h}
hˉ做一个替换,可以得到如下结果
称
h
h
h是
f
f
f和
g
g
g的负折叠卷积。
傅里叶变换
-
连续: F ( ω ) = F [ f ( t ) ] = ∫ − ∞ ∞ f ( t ) e − i w t d t F(\omega)=\mathcal{F}[f(t)]=\int_{-\infty}^{\infty} f(t) e^{-i w t} d t F(ω)=F[f(t)]=∫−∞∞f(t)e−iwtdt
f ( t ) = F − 1 [ F ( w ) ] = 1 2 π ∫ − ∞ ∞ F ( w ) e − i w t d w f(t)=\mathcal{F}^{-1}[F(w)]=\frac{1}{2\pi}\int_{-\infty}^{\infty}F(w)e^{-i w t}dw f(t)=F−1[F(w)]=2π1∫−∞∞F(w)e−iwtdw -
离散DFT(作用在复数域 C \mathbb{C} C上)
( x 0 , x 1 , . . . x n − 1 ) < = > ( x 0 , x 1 , . . . , x N − 1 ) ∈ C (x_0,x_1,...x_{n-1})<=>(x_0,x_1,...,x_{N-1}) \in \mathbb{C} (x0,x1,...xn−1)<=>(x0,x1,...,xN−1)∈C
x j = ∑ k = 0 n − 1 x k w k j j = 0 , 1 , … , n − 1 x k = ∑ j = 0 n − 1 x j w − k j k = 0 , 1 , … , N − 1 x_j=\sum_{k=0}^{n-1} x_k w^{kj} \quad j=0,1, \ldots, n-1 \\ x_k=\sum_{j=0}^{n-1} x_j w^{-kj} \quad k=0,1, \ldots, N-1 xj=k=0∑n−1xkwkjj=0,1,…,n−1xk=j=0∑n−1xjw−kjk=0,1,…,N−1
其中 w = e − 2 π i N w=e^{-\frac{2\pi i}{N}} w=e−N2πi,N次单位根, X N = 1 X^N=1 XN=1称为N长DFT
记 x ⃗ = ( x 0 , . . . . , x N − 1 ) , X ⃗ = ( X 0 , X 1 , . . . . , X n − 1 ) \vec{x}=(x_0,....,x_{N-1}),\vec{X}=(X_0,X_1,....,X_{n-1}) x=(x0,....,xN−1),X=(X0,X1,....,Xn−1)
X ⃗ = D F T ( x ⃗ ) , x ⃗ = D F T − 1 ( X ⃗ ) \vec{X}=DFT(\vec{x}),\vec{x}=DFT^{-1}(\vec{X}) X=DFT(x),x=DFT−1(X)
离散傅里叶变换的两条性质:
1、 X ⃗ = D F T − 1 ( D F T ( x ⃗ ) ) \vec{X}=DFT^{-1}(DFT(\vec{x})) X=DFT−1(DFT(x))
2、循环卷积性质
x ⃗ = ( x 0 , x 1 , . . . , x N − 1 ) y ⃗ = ( y 0 , y 1 , . . . , y N − 1 ) \vec{x} =(x_0,x_1,...,x_{N-1}) \\ \vec{y} =(y_0,y_1,...,y_{N-1}) x=(x0,x1,...,xN−1)y=(y0,y1,...,yN−1)
实在码不动公式了所以看图吧
数论变换NTT(有限域上的离散傅里叶变换)
f
~
=
(
f
0
~
,
f
1
~
,
f
2
~
,
.
.
.
,
f
N
−
1
~
)
⇔
t
r
a
n
s
f
o
r
m
f
^
=
(
f
0
^
,
f
1
^
,
.
.
.
,
f
N
−
1
^
)
(
f
i
~
,
f
i
^
∈
Z
q
)
{
f
j
^
=
∑
i
=
0
N
−
1
f
i
~
r
i
j
,
j
=
0
,
1
,
.
.
.
,
N
−
1
f
i
~
=
1
N
∑
j
=
0
N
−
1
f
j
^
r
i
j
,
i
=
0
,
1
,
.
.
.
,
N
−
1
{
f
^
=
N
T
T
(
f
~
)
f
~
=
N
T
T
−
1
(
f
^
)
\widetilde{f}=(\widetilde{f_0},\widetilde{f_1},\widetilde{f_2},...,\widetilde{f_{N-1}})\stackrel{transform}\Leftrightarrow \hat{f}=(\hat{f_0},\hat{f_1},...,\hat{f_{N-1}}) (\widetilde{f_i},\hat{f_i} \in \mathbb{Z_q})\\ \left\{\begin{array}{lr} \hat{f_j}=\sum\limits_{i=0}^{N-1}\widetilde{f_i}r^{ij},j=0,1,...,N-1 \\ \widetilde{f_i}=\frac{1}{N}\sum\limits_{j=0}^{N-1}\hat{f_j}r^{ij},i=0,1,...,N-1 \\ \end{array}\right. \\ \left\{\begin{array}{lr} \hat{f}=NTT(\widetilde{f})\\ \widetilde{f}=NTT^{-1}(\hat{f}) \\ \end{array}\right.
f
=(f0
,f1
,f2
,...,fN−1
)⇔transformf^=(f0^,f1^,...,fN−1^)(fi
,fi^∈Zq)⎩⎪⎪⎨⎪⎪⎧fj^=i=0∑N−1fi
rij,j=0,1,...,N−1fi
=N1j=0∑N−1fj^rij,i=0,1,...,N−1{f^=NTT(f
)f
=NTT−1(f^)
其中
r
r
r是
Z
q
\mathbb{Z_q}
Zq中的
N
N
N阶本原单位根,并称此变换为
N
N
N长
N
T
T
NTT
NTT。
r
r
r是
N
N
N阶本原单位根,
w
w
w是
2
N
2N
2N阶本原单位根,因此
r
=
w
2
r=w^2
r=w2
N阶本原单位根
r ∈ Z q , r N ≡ 1 m o d q , r k ≢ m o d q , 0 < k < N r\in \mathbb{Z_q}, r^N \equiv 1 mod q, r^k \not\equiv mod q,0<k<N r∈Zq,rN≡1modq,rk≡modq,0<k<N(小于 N N N的非零幂模 q q q不为1)
- f ~ = N T T − 1 ( N T T ( f ~ ) ) \widetilde{f}=NTT^{-1}(NTT(\widetilde{f})) f =NTT−1(NTT(f ))
- 如果
h
~
\widetilde{h}
h
是
f
~
\widetilde{f}
f
和
g
~
\widetilde{g}
g
的循环卷积,则
N T T ( f ~ ) ∘ N T T ( g ~ ) = N T T ( h ~ ) NTT(\widetilde{f}) \circ NTT(\widetilde{g})=NTT(\widetilde{h}) NTT(f )∘NTT(g )=NTT(h )
如何利用N长NTT计算多项式乘法 h = f ⋅ g ∈ Z q [ x ] / ( x n + 1 ) h=f \cdot g \in \mathbb{Z_q}[x]/(x^n+1) h=f⋅g∈Zq[x]/(xn+1)?
现在我们已经有:(懒得打公式+1)
负折叠卷积下的NTT和循环卷积下的NTT
上面的推导过程是为了验证这样的一个结论:
就是对多项式 f f f负折叠卷积下的NTT等于对多项式 f f f做一个点乘向量 ( 1 , w , w 2 , w 3 , . . . , w n − 1 ) (1,w,w^2,w^3,...,w^{n-1}) (1,w,w2,w3,...,wn−1)得到的结果折叠卷积下的NTT(逆NTT则是点乘向量 ( 1 , w − 1 , w − 2 , . . , w − ( n − 1 ) ) (1,w^{-1},w^{-2},..,w^{-(n-1)}) (1,w−1,w−2,..,w−(n−1)))
用公式表示则如下:
f
^
=
N
T
T
^
(
f
)
=
N
T
T
(
(
1
,
w
,
w
2
,
w
3
,
.
.
.
,
w
n
−
1
)
∘
f
)
f
=
N
T
T
−
1
^
(
f
^
)
=
(
1
,
w
−
1
,
.
.
.
,
w
−
(
n
−
1
)
)
∘
N
T
T
−
1
(
f
^
)
\hat{f}=\hat{NTT}(f)=NTT((1,w,w^2,w^3,...,w^{n-1}) \circ f) \\ f=\hat{NTT^{-1}}(\hat{f})=(1,w^{-1},...,w^{-(n-1)}) \circ NTT^{-1}(\hat{f})
f^=NTT^(f)=NTT((1,w,w2,w3,...,wn−1)∘f)f=NTT−1^(f^)=(1,w−1,...,w−(n−1))∘NTT−1(f^)
令
f
~
=
(
1
,
w
,
.
.
.
,
w
n
−
1
)
∘
f
,
f
i
~
=
w
i
f
i
\widetilde{f}=(1,w,...,w^{n-1}) \circ f, \widetilde{f_i}=w^if_i
f
=(1,w,...,wn−1)∘f,fi
=wifi.
则由数论变换NTT可得:
f
j
^
=
∑
i
=
0
n
−
1
r
i
j
⋅
f
i
~
=
∑
i
=
0
n
−
1
(
w
2
)
i
j
w
i
f
i
=
∑
i
=
0
n
−
1
(
w
)
(
2
j
+
1
)
⋅
i
f
i
=
f
(
w
2
j
+
1
)
\hat{f_j}=\sum\limits_{i=0}^{n-1} r^{ij} \cdot \widetilde{f_i} =\sum\limits_{i=0}^{n-1}(w^2)^{ij}w^if_i = \sum\limits_{i=0}^{n-1}(w)^{(2j+1) \cdot i }f_i = f(w^{2j+1})
fj^=i=0∑n−1rij⋅fi
=i=0∑n−1(w2)ijwifi=i=0∑n−1(w)(2j+1)⋅ifi=f(w2j+1)
以上
N
T
T
^
\hat{NTT}
NTT^就是负折叠卷积下的数论变换,
N
T
T
NTT
NTT算子就是循环卷积下的数论变换(也是我们上文提到的)。我们已知循环卷积下的数论变换,要求负折叠卷积下的数论变换,可以用如上的方式求得。
还有一种方法求负折叠卷积下的数论变换是通过FFT-Trick的方式计算,在本博主另外一篇博文中可以看到FFT-trick及Culey-Tukey蝴蝶变换原理及实现。