快速数论变换NTT学习笔记

什么是NTT?

数论变换(number-theoretic transform, NTT)是离散傅里叶变换(DFT)在数论基础上的实现。
NTT是一种计算卷积的快速算法,FFT也是其中一种。

但是FFT具有一些实现上的缺点,举例来说,向量必须乘上复数系数的矩阵进行处理,而且每个复数系数的实部和虚部是一个正弦及余弦函数,因此大部分的系数都是浮点数,也就是说,必须做浮点复数运算,计算量会比较大,并且浮点数运算产生的误差会比较大。

NTT解决的是多项式乘法带模数的情况,受到模数的限制,数也比较大。
在数学中,NTT 是关于任意环上的DFT。在有限域的情况下,通常称为数论变换,即NTT。

原根

FFT的实现是找单位圆上的 n n n个点 ω n 0 , ω n 1 , … , ω n n \omega_n^0, \omega_n^1, \dots, \omega_n^n ωn0,ωn1,,ωnn(称为单位根) ,然后对这些点进行FFT。因此,对于NTT,我们需要在取模域上找到和这个点等价的数。为了找到这 n n n个等价的数,我们要使用原根。

n n n为大于1的2的幂, p p p为质数且 n ∣ ( p − 1 ) n|(p-1) n(p1),即 n n n整除 p − 1 p-1 p1 ,则存在本原 n n n次方根。对于质数 p = q n + 1 p=qn+1 p=qn+1,(模 p p p意义下的)原根 g g g满足: g q n = 1 ( m o d p ) g^{qn}=1 (\mod p) gqn=1(modp),将 g n = g q ( m o d p ) = g p − 1 n ( m o d p ) g_n=g^q (\mod p)=g^{{p-1}\over n} (\mod p) gn=gq(modp)=gnp1(modp)看作 ω n \omega_n ωn的等价。

于是原根 g n g_n gn和单位根 ω n \omega_n ωn满足相似的性质!

原根和单位根的等价性

g n = g p − 1 n g_n=g^{{p-1}\over n} gn=gnp1

于是,
g n n = g n ⋅ p − 1 n = g p − 1 g_n^n=g^{n \cdot {p-1\over n}}=g^{p-1} gnn=gnnp1=gp1

g n n 2 = g p − 1 2 g_n^{n\over 2}=g^{p-1\over 2} gn2n=g2p1

g a n a k = g a k ( p − 1 ) a n = g k ( p − 1 ) n = g n k 【对应单位根消去引理】 g_{an}^{ak}=g^{\frac{ak(p-1)}{an}}=g^{\frac{k(p-1)}{n}}=g_n^k【对应单位根消去引理】 ganak=ganak(p1)=gnk(p1)=gnk【对应单位根消去引理】

可以得到:
g n n ≡ 1 ( m o d p ) 【对应单位根 ω n n ≡ 1 】 g_n^n \equiv 1 (\mod p) 【对应单位根\omega_n^n\equiv 1】 gnn1(modp)【对应单位根ωnn1

g n n 2 ≡ − 1 ( m o d p ) 【对应单位根 ω n n 2 ≡ − 1 】 g_n^{n\over 2} \equiv -1 (\mod p)【对应单位根\omega_n^{n\over 2}\equiv -1】 gn2n1(modp)【对应单位根ωn2n1

g n k + n 2 = g n k ⋅ g n n 2 = − g n k ( m o d p ) 【对应单位根折半引理】 g_n^{k+{n\over 2}}=g_n^{k}\cdot g_n^{n\over 2}=-g_n^{k} (\mod p)【对应单位根折半引理】 gnk+2n=gnkgn2n=gnk(modp)【对应单位根折半引理】

( g n k + n 2 ) 2 = g n 2 k + n = g n 2 k ⋅ g n n = g n 2 k ( m o d p ) (g_n^{k+{n\over 2}})^2=g_n^{2k+n}=g_n^{2k}\cdot g_n^n=g_n^{2k} (\mod p) (gnk+2n)2=gn2k+n=gn2kgnn=gn2k(modp)

我们发现单位根具有的性质原根都有,所以我们将 g n k g_n^k gnk g n k + n 2 g_n^{k+{n\over 2}} gnk+2n代入,本质上和将 ω n k \omega_n^k ωnk ω n k + n 2 \omega_n^{k+{n\over 2}} ωnk+2n代入并无二异!

在INTT中,乘单位根的共轭复数的操作也就会相应地变为乘原根在模意义下的逆元。

常见的模数和原根如下:
p = 1004535809 = 479 × 2 21 + 1 , g = 3 p = 998244353 = 7 × 17 × 2 23 + 1 , g = 3 p=1004535809=479\times 2^{21}+1, g=3 \\ p = 998244353=7\times 17\times2^{23}+1, g=3 p=1004535809=479×221+1,g=3p=998244353=7×17×223+1,g=3

快速数论变换(FNTT)

简而言之,FNTT是NTT增加分治操作之后的快速算法,也是FFT在数论基础上的实现。FNTT使用的分治办法,与FFT使用的分治办法完全一致。

DFT、FFT、NTT、FNTT的关系

  • 在 DFT与NTT的基础上,增加分治操作,得到FFT与FNTT。分治操作同FFT一致。
  • 在DFT与FFT的基础上,将复数加法与复数乘法替换为模 p p p意义下的加法和乘法,一般大小限制在0到 p − 1 p-1 p1之间;将本原单位根改为模 p p p意义下的相同阶数的本原单位根,阶数为2的幂,即可得到NTT与FNTT。

一大堆参考资料

  • 快速数论变换(NTT)超详解
  • OI Wiki 快速数论变换
  • 快速数论变换NTT
  • 快速傅立叶变换FFT学习笔记

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/648526.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++技术要点总结, 面试必备, 收藏起来慢慢看

目录 1. 语言对比 1.1 C 11 新特性 2.2 C 和 C 的区别 2.3 Python 和 C 的区别 2. 编译内存相关 2.1. C 程序编译过程 2.2. C 内存管理 2.3. 栈和堆的区别 2.4. 变量的区别 2.5. 全局变量定义在头文件中有什么问题? 2.6. 内存对齐 2.7. 什么是内存泄露 …

ISO27001认证:企业与个人发展的必备之选

ISO27001认证,对于企业和个人来说,都具有极高的价值和重要性。作为国际权威的信息安全管理体系标准,它为企业提供了保障信息安全、防范风险和提升竞争力的有力工具。 💼对企业的价值: ISO27001认证可以帮助企业满足国家…

【通过docker安装常用软件镜像】1.镜像 2.安装 redis,jdk,nginx

1)官网镜像网站 hello-world - Official Image | Docker Hub 2)安装镜像测试例子 Redis 1.查询redis [rootlocalhost ~]# docker search redis NAME DESCRIPTION STARS OFFICIAL redis …

安全产品与等级保护:匹配与选择指南

基本要求项测评项基本措施对应产品网络架构应保证网络各个部分的带宽满足业务高峰期需要;带宽管理流量控制系统应避免将重要网络区域部署在边界处,重要网络区域与其他网络区域之间应采取可靠的技术隔离手段;网络及安全设备配置访问控制策略防…

rancher和k8s接口地址,Kubernetes监控体系,cAdvisor和kube-state-metrics 与 metrics-server

为了能够提前发现kubernetes集群的问题以及方便快捷的查询容器的各类参数,比如,某个pod的内存使用异常高企 等等这样的异常状态(虽然kubernetes有自动重启或者驱逐等等保护措施,但万一没有配置或者失效了呢)&#xff0…

数智化招标采购平台核心功能采购监管系统能做到哪些管控?

郑州信源数智化招标采购平台系统研发商,覆盖全业务类型、全采购流程、全采购方式,核心系统需求计划、电子招投标、非招标管理、供应商管理、采购监管、基础库、订单协同、电子商城、大数据辅助决策等功能,重构采购业务流程,赋能政…

matlab对负数开立方根得到虚数的解决方案

问题描述:在matlab中,对负数开立方根,不出意外你将得到虚数。 例如 − 27 3 \sqrt[3]{-27} 3−27 ​,我们知道其实数解是-3,但在matlab中的计算结果如下: 问题原因:matlab中的立方根运算是在…

【iOS ARKit】人脸检测追踪基础

在计算机人工智能(Artificial Inteligence,AI)物体检测识别领域,最先研究的是人脸检测识别,目前技术发展最成熟的也是人脸检测识别。人脸检测识别已经广泛应用于安防、机场、车站、闸机、人流控制、安全支付等众多社会领域&#x…

提高供电可靠性:配网故障定位装置的实际应用与效果

随着电力系统的不断发展,提高供电可靠性成为了业界关注的焦点。在这个过程中,恒峰智慧科技研发的配网故障定位装置发挥着越来越重要的作用。本文将详细介绍一种基于行波测距技术的配网故障定位装置HFP-GZS1000,以及其在实际应用中的效果。 一…

3d gaussian splatting介绍整理

3D 高斯分布是用于实时辐射场渲染的 3D 高斯分布中描述的一种光栅化技术,它允许实时渲染从小图像样本中学习到的逼真场景。 paper github 本文翻译整理自: blog: Introduction to 3D Gaussian Splatting DDPMs - Part 2 给出一些2D图片,用…

2401llvm,clang的libtooling

LibTooling(库工具) LibTooling是个支持基于Clang编写独立工具的库. 在此,为LLVM安装Clang工具 介绍 用LibTooling构建的工具(如Clang插件)通过代码运行FrontendActions. 这里演示运行Clang的快速检查一堆代码语法的SyntaxOnlyAction的不同方法. 解析内存中的代码片 如果想…

PyTorch 添加 C++ 拓展

参考内容:pytorch添加C拓展简单实战编写及基本功能测试 文章目录 第一步:编写 C 模块test.htest.cpp 第二步:编写 setup.py第三步:安装 C 模块第四步:验证安装第五步:C 模块使用test_cpp1.pytest_cpp2.py 运…

信息安全认证首选CISP-PTE

🔥在信息安全领域,CISP-PTE认证正逐渐成为行业的新星。作为中国信息安全测评中心推出的专业认证,CISP-PTE为信息安全从业者提供了国内Z高标准的资质培训。 🎯为什么选择CISP-PTE? 1️⃣业界认可:CISP-PTE是…

fMRI数据处理(随时更新)

要开始学习处理fMRI的数据了。 一、使用matlab工具包SPM读取fMRI数据 (1)首先得安装工具包SPM,我参考的是下面这篇博客: 在matlab下安装spm工具_spmas包matlab-CSDN博客 (2)使用SPM读取数据&#xff0c…

oracle10g rac节点启动没进程没日志

一节点正常运行,二节点通过crsctl start crs启动,发现alert日志及所有日志都没生成,oracle用户下连一个相关进程都没有清理缓存:rm -rf /tmp/.oracle/服务挨个启动也无效:/etc/init.evmd run >/dev/null 2>&…

抖音详情API:视频内容获取与解析技巧

一、引言 抖音是一款广受欢迎的短视频分享平台,每天都有大量的用户在抖音上分享自己的生活点滴和创意作品。对于开发者而言,如何获取并解析抖音上的视频内容,是一项极具挑战性的任务。本文将详细介绍抖音详情API,以及如何使用它来…

CVPR 2023: Make-a-Story Visual Memory Conditioned Consistent Story Generation

我们采用以下 6 个分类标准来详细解释本文的研究主题: 1. 生成模型类型: 基于扩散的:这种方法通过前向扩散过程迭代地将噪声细化为图像。这允许生成高质量的图像,并控制特定方面,如场景元素和照明。基于注意力的:注意力机制有助于模型在生成每个帧时集中在文本描述和视觉…

如何训练和导出模型

介绍如何通过DI-engine使用DQN算法训练强化学习模型 一、什么是DQN算法 DQN算法,全称为Deep Q-Network算法,是一种结合了Q学习(一种价值基础的强化学习算法)和深度学习的算法。该算法是由DeepMind团队在2013年提出的,…

2024亚马逊开店教程:开店准备与注册流程指南

随着新一年的到来,亚马逊开启了新一轮的卖家入驻,并且针对新卖家优化了入驻流程,下面为大家简单整理一下最新亚马逊入驻教程,有想要入驻开店的小伙伴速速看过来! 一、开店前准备 1、账号环境准备 为了防止账号由于网…

将 Amazon Bedrock 与 Elasticsearch 和 Langchain 结合使用

Amazon Bedrock 是一项完全托管的服务,通过单一 API 提供来自 AI21 Labs、Anthropic、Cohere、Meta、Stability AI 和 Amazon 等领先 AI 公司的高性能基础模型 (FMs) 选择,以及广泛的 构建生成式 AI 应用程序所需的功能,简化开发,…