FFT快速傅里叶变换与NTT快速数论变换

前言

大数相乘是公钥密码学中一个非常关键的运算,公钥密码学中往往需要进行大量的大整数相乘运算,它的性能影响着许多公钥密码算法的性能[1]。

最近在阅读格上后量子密钥交换相关论文的过程中,我发现在基于RLWE(Ring learning with errors, 环上容错学习)问题的格密钥交换方案中会进行多项式相乘运算,而其中往往会使用到NTT快速数论变换算法,快速数论变换(NTT)是快速傅里叶变换(FFT)在数论基础上的实现,为了弄懂其中的原理,我对FFT快速傅里叶变换以及NTT快速数论变换的相关知识进行了学习。


基础知识

在学习FFT以及NTT之前,我们应该先对多项式有一个基本的了解。
多项式有两种基本的表示方法,一种是系数表示,一种是点值表示;对于一个已知的多项式 A ( x ) = a 0 + a 1 x + a 2 x 2 + ⋯ + a n − 1 x n − 1 A(x)=a_0+a_1 x+a_2 x^2+⋯+a_{n-1} x^{n-1} A(x)=a0+a1x+a2x2++an1xn1,

  • 系数表示法:用 n n n个系数确定一个 n − 1 n-1 n1次多项式, ( a 0 , a 1 , a 2 , … , a n − 1 ) (a_0,a_1,a_2,…,a_{n-1}) (a0,a1,a2,,an1)
  • 点值表示法:对于多项式 A ( x ) A(x) A(x),将 x 0 x_0 x0代进去可以得到一个确定的值 y 0 y_0 y0,并且可以将 ( x 0 , y 0 ) (x_0,y_0) (x0,y0)看作是坐标系上的一个点;用 n n n个点可以确定一个 n − 1 n-1 n1次多项式, ( x 0 , x 1 , x 2 , … , x n − 1 ) (x_0,x_1,x_2,…,x_{n-1} ) (x0,x1,x2,,xn1) ( y 0 , y 1 , y 2 , … , y n − 1 ) (y_0,y_1,y_2,…,y_{n-1}) (y0,y1,y2,,yn1)

现在有两个多项式 A ( x ) , B ( x ) A(x),B(x) A(x),B(x),两个多项式相乘结果为 C ( x ) C(x) C(x),这个就叫多项式的乘法,多项式乘法的结果又可以叫做这两个多项式的卷积。某种程度上,FFT就是在解决多项式乘法的问题。


FTT

快速傅里叶变换(英语:Fast Fourier Transform, FFT),是快速计算串行的离散傅里叶变换(DFT)或其逆变换的方法[2]。直接暴力求解两个多项式的卷积,复杂度是 O ( n 2 ) O(n^2) O(n2)的,而FFT可以将这一过程的复杂度降到 O ( n l o g ⁡ n ) O(n log⁡n) O(nlogn),具体过程分为两个过程:离散傅里叶变换(DFT)和离散傅里叶逆变换(IDFT)。通俗地来说,多项式由系数表示法转为点值表示法的过程,就是DFT,多项式由点值表示法转化为系数表示法的过程,就是IDFT;而FFT就是通过取某些特殊的x的点值来加速DFT和IDFT的过程[3]。
FFT通过找到一组特殊的点代入到多项式中,从而快速计算出一组 A ( x ) , B ( x ) A(x),B(x) A(x),B(x)的点值,而这组特殊点就是复数中的单位根。在复平面上,一个复数可以用一个向量表示,所有在单位圆上的向量都可以称为一个单位根。考虑将这个单位圆从 x x x轴开始等分成 n n n份,其中得到的这 n n n个单位根,就是 n n n次单位根,其中的第 k k k个可以记为 ω n k ω_n^k ωnk,且 ω n 0 = 1 ω_n^0=1 ωn0=1


图1 复平面上的3次单位根

众所周知, e i θ = c o s ⁡ θ + i ⋅ s i n ⁡ θ e^iθ=cos⁡θ+i·sin⁡θ eiθ=cosθ+isinθ,所以
ω n k = c o s ⁡ ( 2 π ⋅ k n ) + i ⋅ s i n ⁡ ( 2 π ⋅ k n ) = e 2 π ⋅ k n i ω_n^k=cos⁡(2π·\frac{k}{n})+i·sin⁡(2π·\frac{k}{n})=e^{2π·\frac{k}{n} i} ωnk=cos(2πnk)+isin(2πnk)=e2πnki
显然,单位根具有以下一些性质:
性质一: ω n k = ω 2 n 2 k ω_n^k=ω_{2n}^{2k} ωnk=ω2n2k
性质二: ω n k + n 2 = − ω n k ω_n^{k+\frac{n}{2}}=-ω_n^k ωnk+2n=ωnk
性质三: ω n k ⋅ ω n l = ω n k + l ω_n^k·ω_n^l=ω_n^{k+l} ωnkωnl=ωnk+l
接下来我们来看FFT的具体过程是如何实现的。

第一步:离散傅里叶变换(DFT)

考虑一个 n = 2 b n=2^b n=2b项的多项式 A ( x ) A(x) A(x)系数表示为 ( a 0 , a 1 , a 2 , … , a n − 1 ) (a_0,a_1,a_2,…,a_{n-1}) (a0,a1,a2,,an1

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值