多项式运算→复数域FFT→有限域NTT
1. 如何降低时间复杂度
多项式有系数计算和点乘计算方式。点乘计算会考奇偶差分的方式加速运算,但是问题是相反数平方运算后所得结果均为正数,无法构造相反数对,无法实现递归。所以考虑扩展到复平面。
FFT 把多项式运算迁移到复数域,利用单位根实现了快速的点值计算,大大降低了运算复杂度。但由于复数运算存在精度问题,在计算机系统表示复数需要比实数花费更多的资源并且计算复数时会产生误差。
于是就引出了 NTT,它在有限域里进行运算,用原根替代单位根。原根在有限域的模运算下有很好的性质,能避免 FFT 的那些精度误差,同样高效地完成多项式相关运算。
2. 详细介绍
2.1 介绍多项式运算
2.1.1 多项式的两种表示方法
(1)
一般 n 次多项式如公式(1)所示。多项式具有两种表示方法分别是系数表示法和点值表示法。
系数表示法
任意多项式都可以通过一组系数所确定,而这组系数所组成的向量也叫做系数向量,通过一组系数向量表示一个多项的方式也叫做系数表示法。
例如公式(1)中 A(x) 的系数向量为:
点值表示法
对于一个已知的多项式例如公式(1)中的 ,将
代进去可以得到一个确定的值
,如:
。可以将
看作是坐标系上的一个点。如果将任意多(互不相等)的自变量
代入到
中,得到更多的点:
。
通过 n+1 个不同点组成的点集 ,唯一确定一个 n 次多项式,叫做多项式的点值表示法。
2.1.2 多项式乘法
系数乘法
系数乘法是将两个多项式的系数相乘,如公式(5)所示。不难看出时间复杂度为。整理可得公式(6):
点值乘法
点值乘法只需将对应的纵坐标相乘即可,但是因为新得到的多项式次数更高,所以每个因子多项式都需要提供个点参与运算。时间复杂度为
。
减少求值的点数可以较少计算时间!!!
在计算系统中系数表示更加的常用,把系数形式转化为点值形式乘法运算,然后再转换为系数表示法。这个变换过程时间复杂度为
。
2.2 介绍FFT
“分而治之”三个阶段DIVIDE,CONQUER,COMBINE阶段。
先DIVIDE,划分简单重复小块
CONQUER,分别求解这些小块
2.2.1 前置
根据函数的奇偶性我们可以只求一半的点值,从而减少一半的计算量。
为了方便表示设一个次的一般多项式
自然而然想到了递归执行。通过把多项式按奇偶次分成两个关于的多项式,并不断递归下去实现这个过程,就可以加速运算。
但是问题是相反数平方运算后所得结果均为正数,无法构造相反数对,无法实现递归. 因此扩展到复平面。
单位根
欧拉公式:
n 次单位复数根的推导:
如果一个复数z满足,那z就被叫做n次单位根。
消去引理是在单个单位根幂次计算上做简化
折半引理则是从整体结构上对 DFT 运算进行分治简化
求和引理是在多个单位根幂次累加的式子直接得出结果
从多项式乘法引入的DFT和IDFT,推广到FFT
2.2.2 FFT推导
蝶形操作
引入蝴蝶操作来计算样本对的DFT,实现了对简单重复小块的处理,
CT 蝶形变换
把时域序列按时间顺序进行抽取,这样能方便地利用序列的奇偶性来简化运算,它比较适合时域信号的处理
蝶形操作得名于其数据流图的形状,上面的推导过程出现的是 CT 蝶形变换. CT方法也叫DIT(时域抽取)操作
GS 蝶形变换
从频域的角度出发,对频域进行抽取操作,这种方式在某些特定情况下,比如已经对频域有一定需求或者处理的时候,会更高效
通过公式(9-10)我们可以推导出 GS 蝶形变换的形式。将公式(9)和(10)分别加减运算得:
整理得公式(11-12)不难看出,GS 操作是 CT 操作的逆过程,GS操作也叫DIF(频域抽取)操作。
旋转因子
引入蝶形操作的同时又引入信号相位改变的新问题,为保持整体的结果不变,利用“旋转因子”将平移后的信号再次平移回去,作为下一阶段的输入
被成为转换因子:上标数字表示旋转因子的索引,下标数字表示蝴蝶中的点数。
旋转因子本身是一个复数,在进行蝶形运算之前,通常会先与旋转因子进行相乘等变换,乘以W相位因子只是调整信号相位,最终计算结果不变。
旋转因子 W,它有实部和虚部。而 呢,它和信号的频率成分紧密相关。旋转因子和信号相乘的时候,就会给信号带来相位和幅度上的变化,能让原始信号
更好地为蝶形运算做准备。
旋转因子用形式,能通过改变
来调节相位,使信号各频率成分在蝶形运算前有合适相位关系,避免运算出错 。
旋转因子若被攻击,会使信号相位和幅度调整出错,导致蝶形操作无法正确分离频率成分,整个频域变换计算就会失误。
2.3 介绍NTT
首先 FFT 是在复数域上的表示,而计算机系统中表示复数,需要比实数花费更多的资源,且复数运算也比实数运算更加复杂。此外 FFT 涉及大量的正余弦运算,对于精度有影响。于是我们期望在实数域内寻找类似单位根性质的数学概念。有限域上的原根满足相应的要求。
2.3.1 数学基础
原根
2.3.2 NTT推导
参考文献
快速傅里叶变换 - 知乎
NTT - Cankun Zhao's Blogs
NTT(快速数论变换) -
【数学】【多项式】快速数论变换(NTT) - zimujun - 博客园
PQC密码芯片