当前位置: 首页 > news >正文

多项式运算→复数域FFT→有限域NTT

1. 如何降低时间复杂度

多项式有系数计算和点乘计算方式。点乘计算会考奇偶差分的方式加速运算,但是问题是相反数平方运算后所得结果均为正数,无法构造相反数对,无法实现递归。所以考虑扩展到复平面。

FFT 把多项式运算迁移到复数域,利用单位根实现了快速的点值计算,大大降低了运算复杂度。但由于复数运算存在精度问题,在计算机系统表示复数需要比实数花费更多的资源并且计算复数时会产生误差。

于是就引出了 NTT,它在有限域里进行运算,用原根替代单位根。原根在有限域的模运算下有很好的性质,能避免 FFT 的那些精度误差,同样高效地完成多项式相关运算。

2. 详细介绍

2.1 介绍多项式运算

2.1.1 多项式的两种表示方法

A(x) = a_0 + a_1 x^1 + a_2 x^2 + \ldots + a_{n-1} x^{n-1} + a_n x^n = \sum_{i=0}^{n} a_i x^i             (1)

一般 n 次多项式如公式(1)所示。多项式具有两种表示方法分别是系数表示法和点值表示法。

系数表示法

任意多项式都可以通过一组系数所确定,而这组系数所组成的向量也叫做系数向量,通过一组系数向量表示一个多项的方式也叫做系数表示法。

例如公式(1)中 A(x) 的系数向量为: a = [a_0, a_1, \ldots, a_{n-1}, a_n]

点值表示法

对于一个已知的多项式例如公式(1)中的 A(x) ,将 x_i代进去可以得到一个确定的值y_i,如: y_0 = A(x_0) 。可以将(x_0, y_0) 看作是坐标系上的一个点。如果将任意多(互不相等)的自变量(x_1, x_2, \ldots, x_{n-1}, x_n) 代入到 A(x)中,得到更多的点: (x_1, y_1), (x_2, y_2), \ldots (x_n, y_n)

通过 n+1 个不同点组成的点集 P = (x_0, y_0), (x_1, y_1), \ldots, (x_n, y_n),唯一确定一个 n 次多项式,叫做多项式的点值表示法。

2.1.2 多项式乘法

系数乘法

系数乘法是将两个多项式的系数相乘,如公式(5)所示。不难看出时间复杂度为O(n^2)。整理可得公式(6):

点值乘法

点值乘法只需将对应的纵坐标相乘即可,但是因为新得到的多项式次数更高,所以每个因子多项式都需要提供m+n+1个点参与运算。时间复杂度为 O(n)

减少求值的点数可以较少计算时间!!!

在计算系统中系数表示更加的常用,把系数形式转化为点值形式乘法运算,然后再转换为系数表示法。这个变换过程时间复杂度为O(n^2)

2.2 介绍FFT

“分而治之”三个阶段DIVIDE,CONQUER,COMBINE阶段。

先DIVIDE,划分简单重复小块

CONQUER,分别求解这些小块

2.2.1 前置

根据函数的奇偶性我们可以只求一半的点值,从而减少一半的计算量。

为了方便表示设一个n−1次的一般多项式n=2^a , a\in N

自然而然想到了递归执行。通过把多项式按奇偶次分成两个关于x^2的多项式,并不断递归下去实现这个过程,就可以加速运算。

但是问题是相反数平方运算后所得结果均为正数,无法构造相反数对,无法实现递归.  因此扩展到复平面。

单位根

欧拉公式:e^{i \theta}=\cos\theta+i\sin\theta

z^n=1=\cos2k\pi+i\sin2k\pi=e^{2k\pi i},k \in[ 0,n)
n 次单位复数根的推导:z=\sqrt[n]{e^{2k\pi i}}=e^\frac{2k\pi i}{n} ,k \in[ 0,n)

如果一个复数z满足z^n = 1,那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(频域抽取)操作。

旋转因子

引入蝶形操作的同时又引入信号相位改变的新问题,为保持整体的结果不变,利用“旋转因子”将平移后的信号再次平移回去,作为下一阶段的输入

\omega_{n}^{k}被成为转换因子:上标数字表示旋转因子的索引,下标数字表示蝴蝶中的点数。

旋转因子本身是一个复数,在进行蝶形运算之前,通常会先与旋转因子进行相乘等变换,乘以W相位因子只是调整信号相位,最终计算结果不变。

旋转因子 W,它有实部和虚部。而 \cos(2\pi\frac{n}{N}k)呢,它和信号的频率成分紧密相关。旋转因子和信号相乘的时候,就会给信号带来相位和幅度上的变化,能让原始信号 x(n) 更好地为蝶形运算做准备

旋转因子用\cos\Theta + i\sin \Theta形式,能通过改变\Theta来调节相位,使信号各频率成分在蝶形运算前有合适相位关系,避免运算出错 。

旋转因子若被攻击,会使信号相位和幅度调整出错,导致蝶形操作无法正确分离频率成分,整个频域变换计算就会失误。

2.3 介绍NTT

首先 FFT 是在复数域上的表示,而计算机系统中表示复数,需要比实数花费更多的资源,且复数运算也比实数运算更加复杂。此外 FFT 涉及大量的正余弦运算,对于精度有影响。于是我们期望在实数域内寻找类似单位根性质的数学概念。有限域上的原根满足相应的要求。

2.3.1 数学基础

原根

2.3.2 NTT推导


参考文献

快速傅里叶变换 - 知乎

NTT - Cankun Zhao's Blogs

NTT(快速数论变换) -

【数学】【多项式】快速数论变换(NTT) - zimujun - 博客园

PQC密码芯片

http://www.dtcms.com/a/277637.html

相关文章:

  • 在上海开发小程序,怎么做出“高级感”?
  • RTDETR融合[CVPR2024]SHViT中的SHSA模块
  • 业务访问控制-ACL与包过滤
  • openeuler使用桥接模式(包括新建虚拟机和已有虚拟机)
  • C语言集成ip2region快速指南
  • java: DDD using oracle 21c
  • 【实证分析】上市公司绿色战略数据集(2000-2023年)
  • 【PTA数据结构 | C语言版】字符串删除操作
  • Mybatis自动创建数据库表,并根据创建的表自动生成Mvc框架基础代码
  • WPS新版Latex公式改为显示样式,防止内嵌缩小
  • 清华北大西工大!具身导航最新综述
  • Git的常用操作
  • MYSQL笔记2
  • NW756NW815美光固态闪存NW821NW828
  • Switch表达式
  • 算法第三十二天--动态规划part01(第九章)
  • 苍穹外卖@RequestBody导错包导致接收不到传入参数
  • Linux锁的概念及线程同步
  • 互斥锁详解(操作系统os)
  • VUE3(二)、路由
  • 时序预测 | Pytorch实现CNN-KAN电力负荷时间序列预测模型
  • day16~17-系统负载高故障与磁盘管理
  • 【开源项目】拆解机器学习全流程:一份GitHub手册的工程实践指南
  • Dubbo-Admin 安装与使用指南:可视化管理 Dubbo 服务
  • 基于 SpringBoot 的 REST API 与 RPC 调用的统一封装
  • Linux操作系统之信号概念启程
  • Scrapy Spider深度解析:从基础到高级应用实战
  • 基于MATLAB的Lasso回归的数据回归预测方法应用
  • 【论文阅读】AdaptThink: Reasoning Models Can Learn When to Think
  • muduo概述