Circle FFT in the Plonky3

传统的STARK系统需要在域中具有平滑阶数的循环群。如此,可以通过采用快速傅里叶变换(FFT)算法高效的计算多项式的插值点,并在相邻行中加入约束。对于具有阶数为 n n n 单位根的有限域 F p \mathbb{F}_p Fp,对于很多基本的多项式运算,FFT是最快的已知的代数算法,如乘法、除法、插值和多点估值。然而,对于不满足平滑阶单位根的域,这些计算的效率将降低。其原因为需引入合成单位根以采用FFT进行加速计算。

为了解决经典的FFT受限于域的平滑阶数单位根问题,Eli Ben-Sasson等人[1]引入一种新的快速算法用于在所有大的有限域的多项式计算,即椭圆曲线FFT或ECFFT。在该方法中,通过类似Lenstra方法相类似的方法,以椭圆曲线替代乘性群 F q × \mathbb{F}_q^{\times} Fq×,将快速傅里叶变换的核心应用扩展到所有素数幂 q q q

在Plonky3中,为了使得对于任何有限域STARKs都能高效,发明者采用了类似ECFFT的处理,具体的包括两点[2]

  • 1) 采用Mersenne素数 p = 2 31 − 1 p=2^{31}-1 p=2311 (即M31)为域;在Plonky2中,采用 p = 2 64 − 2 31 + 1 p=2^{64}-2^{31}+1 p=264231+1作为模。对于标准的计算机结构,该模值大小可获得高效的域实现。而且,其乘法群具有大小可达 p = 2 32 p=2^{32} p=232的二进制子群,足以支撑高效的FFT Reed-Solomon编码。但是,从高效域实现和算术电路的角度来看,期待更小的域,并且要求尽可能的平滑。对于CFFT友好型的素数应该具有 p = 2 n + 1 × t − 1 p=2^{n+1}\times t-1 p=2n+1×t1的形式( n , t ≥ 1 n,t\geq 1 n,t1),尤其是 p ≡ 3 m o d 4 p \equiv 3 \mod 4 p3mod4。在STARKs的实现过程中,除了考虑可采用CFFT(或者FFT)提高效率外,域中的算术运算的效率也是素数的主要考虑因素,尤其是取模乘运算。从这个角度来说,最有效的域为Mersenne域,即 p = 2 e − 1 p=2^{e}-1 p=2e1。因为,对于现代计算机,通常采用64位或者32位计算位宽。这对于素数 p = 2 31 − 1 p=2^{31}-1 p=2311 2 32 = 2 m o d p 2^{32}=2 \mod p 232=2modp,使得乘法的积 2 32 × x h i + x l o 2^{32} \times x_{hi}+x_{lo} 232×xhi+xlo很容易缩减到一个更小的量 2 × x h i + x l o 2 \times x_{hi}+x_{lo} 2×xhi+xlo。这对于模乘的计算效率是十分有利的。对于AVX-512指令,M31(2.91 ops/cycle)的乘法效率优于Babyear(2.29 ops/cycle)[3]。Mersenne素数具有的卓越的运算效率是Plonky3采用其的主要目的。从如下M31域的算术运算可见其效率[4]
fn add(self, rhs: Self) -> Self {let mut sum = self.value + rhs.value;let msb = sum & (1 << 31);sum.bitxor_assign(msb);sum += u32::from(msb != 0);Self::new(sum)
}fn mul(self, rhs: Self) -> Self {let prod = u64::from(self.value) * u64::from(rhs.value);let prod_lo = (prod & ((1 << 31) - 1)) as u32;let prod_hi = (prod >> 31) as u32;Self::new(prod_lo) + Self::new(prod_hi)
}

其中,模加时可以不用考虑溢出,没有判断的指令跳转;模乘时的模运算十分高效。而对于Babybear域的模运算[5]

fn add(self, rhs: Self) -> Self {let mut sum = self.value + rhs.value;let (corr_sum, over) = sum.overflowing_sub(P);if !over {sum = corr_sum;}Self { value: sum }
}
fn mul(self, rhs: Self) -> Self {let long_prod = self.value as u64 * rhs.value as u64;Self {value: monty_reduce(long_prod),}}

其中,模加的时候需要考虑溢出,带来条件判断的跳转;模乘时模运算需要调用蒙哥马利模约算法。

  • 2)由圆曲线 x 2 + y 2 = 1 x^2+y^2=1 x2+y2=1定义域 F p \mathbb{F}_p Fp。可高效实现算术运算的域是STARKs效率的基础,而是否可采用FFT进行高速点插值是STARKs效率的关键。这要求域中具有平滑阶循环群。在1)中,素数 p p p的选择十分有利于CFFT,具有 p ≡ 3 m o d 4 p \equiv 3 \mod 4 p3mod4特性。基于由方程 C : x 2 + y 2 = 1 \mathbf{C}:x^2+y^2=1 C:x2+y2=1定义的域 F p \mathbb{F}_p Fp,圆曲线 C = C ( F p ) \mathbf{C}=\mathbf{C}(\mathbb{F}_p) C=C(Fp)将是一个平滑代数簇[2]。圆STARKs所有的算术运算都在圆曲线域进行。在给定的群操作下,由 C ( F p ) \mathbf{C}(\mathbb{F}_p) C(Fp) p + 1 p+1 p+1点构成的圆群是循环的。可见,在 C ( F p ) \mathbf{C}(\mathbb{F}_p) C(Fp)上构建循环群的STARKs可通过FFT算法高效实现。与 ECFFT 类似,尽管域的群结构扮演着核心角色,但是圆 FFT 也是一种代数 FFT。

在原文献[2]中,作者对比了采用M31的CFFT与基于BabyBear的FFT运行效率。结果为:新的CFFT获得1.4倍速度提升。在此,我们将在新的Intel平台(MSI GE77笔记本电脑,win11 x64, i7-12800HX, 64GB RAM)上对作者的结果进行复测验证,同时增加对于FFT不同域上的计算效率评估。

Table 1 算法运行时间(M31 CFFT)

FFT大小线程数M31 CFFT(ms)
2^14113.0
2^16159.5
2^181270
2^2011306
2^2216033

从表1中可见,与原文中的测试时间相比,虽然CFFT的消耗的时间有一定的缩短,在CPU的主频超过4.2GHz,也仅比原作者固定1.5GHz主频情况下的时间消耗少18.5%。这主要是在测试代码[6]中没有采用AVX2指令。

Table 2 FFT运行时间比较(M31域和BabyBear域)

FFT大小线程数M31 CFFT(ms)BabyBear FFT(ms)比例
2^142496.5137.61.4
2^16241952771.4
2^18245017991.6
2^2024161530081.6
2^22246222112411.8

在表2中,采用[7]中的测试代码得到的结果验证了M31的效率确实是BabyBear的1.4倍。当测试数据较大时,BabyBear受内存带宽影响,效率将更低于M31。这是因为在测试代码中,M31 FFT是基于复数扩域计算,时间FFT大小是BabyBear FFT的一半。

References:

[1]Ulrich Habock, Daniel Lubarov, and Jacqueline Nabaglo. Reed-Solomon Codes over the Circle Group. In IACR preprint archive, 2023. https://eprint.iacr.org/2023/824.

[2]Ulrich Habock, David Levit, Shahar Papini, Circle STARKs, 2023. https://eprint.iacr.org/2024/278.pdf.

[3] Eli Ben-Sasson, Dan Carmon, Swastik Kopparty, and David Levit. Elliptic Curve Fast Fourier Transform (ECFFT) Part I: Fast polynomial algorithms over all finite fields. In Electronic Colloquium on Compputational Complexity, volume TR21-103, 2021. https://eccc.weizmann.ac.il/report/2021/103/.

[4]https://github.com/Plonky3/Plonky3/blob/6049a30c3b1f5351c3eb0f7c994dc97e8f68d10d/mersenne-31/src/lib.rs

[5]https://github.com/Plonky3/Plonky3/blob/6049a30c3b1f5351c3eb0f7c994dc97e8f68d10d/baby-bear/src/baby_bear.rs

[6]https://github.com/Plonky3/Plonky3/blob/Circle-Fast-Fourier-Transform/cfft/benches/cfft.rs

[7][ S. Setty. Spartan: Efficient and general-purpose zkSNARKs without trusted setup. In CRYPTO, 2020.](https://github.com/Plonky3/Plonky3/blob/Circle-Fast-Fourier-Transform/dft/benches/fft.rs)

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

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

相关文章

【代码随想录算法训练营第四十天|卡码网46.携带研究材料,416.分割等和子集】

文章目录 卡码网46.携带研究材料二维dp数组一维dp数组&#xff08;滚动数组&#xff09; 416.分割等和子集 卡码网46.携带研究材料 这题是01背包问题。 二维dp数组 dp数组[i][j]前一位表示的是物品的种类&#xff0c;后一位表示的是背包的容量&#xff0c;在物体为i时&#…

Android Room数据库使用介绍

1.简介 Room是Google提供的Android架构组件之一&#xff0c;旨在简化数据库操作。它是SQLite的一个抽象层&#xff0c;提供了更易用和安全的API。 Room的总体架构: 2.Room数据库的基础概念 Entity Entity是Room中的数据表&#xff0c;每个Entity类对应一个SQLite表。 DAO …

研发团队的「技术债」如何进行量化管理?

我共事过的每个团队都会讨论技术债。有些团队知道如何管理它&#xff0c;也有些团队因此崩溃瘫痪&#xff0c;甚至有一家公司因为技术债务没有得到解决而宣告失败。 什么是技术债务&#xff1f; 「债务」这个比喻非常恰当。最早提出「技术债务 Technical Debt」比喻的工程师 W…

Linux(Centos7)OpenSSH漏洞修复,升级最新openssh-9.7p1

OpenSSH更新 一、OpenSSH漏洞二、安装zlib三、安装OpenSSL四、安装OpenSSH 一、OpenSSH漏洞 服务器被扫描出了漏洞需要修复&#xff0c;准备升级为最新openssh服务 1. 使用ssh -v查看本机ssh服务版本号 ssh -V虚拟机为OpenSSH7.4p1&#xff0c;现在准备升级为OpenSSH9.7p1…

Centos7 安装oracle 11.2.0.4

荆轲刺秦王 1. 准备工作 需要下载 Oracle 11g 安装包 2.HostName修改&#xff1a; hostnamectl set-hostname oracle 3. 配置hostname&#xff08;本机IP映射&#xff09;注意&#xff1a;192.168.116.129 需要换乘本地ip vi /etc/hosts 192.168.116.129 oracle # 测试hos…

创新实训2024.06.17日志:大模型微调总结

前段时间其实我们已经部署了大模型&#xff0c;并开放了对外的web接口。不过由于之前某几轮微调实验的大模型在对话时会有异常表现&#xff08;例如响应难以被理解&#xff09;&#xff0c;因此我在项目上线后&#xff0c;监控了数据库里存储的对话记录。确定了最近一段时间部署…

docker部署prometheus

1.拉取镜像 docker pull prom/prometheus2.创建配置文件 cd /root/prometheus touch prometheus.yml touch first_rules.yml3.配置文件内容 prometheus.yml文件内容 # my global config global:scrape_interval: 15s # Set the scrape interval to every 15 seconds. Defau…

Docker的常见问题

1.容器启动失败 检查映像&#xff1a;运行 docker images 确认所需映像存在。检查Dockerfile&#xff1a;验证Dockerfile中的指令无误。查看日志&#xff1a;使用 docker logs <container_id> 查找启动失败的具体原因。资源检查&#xff1a;运行 docker info 或 docker …

基 CanMV 的 C 开发环境搭建

不论是使用 CanMV 提供的基于 C 语言和 FreeRTOS 的应用开发方式开发应用程序或是编译 CanMV 固件&#xff0c;都需要搭建基于 CanMV 的 C 开发环境&#xff0c;用于编译 CanMV 源码。 1. 开发环境搭建说明 CanMV 提供了基于 C 语言和 FreeRTOS 的应用开发…

模拟面试三

1. 你能介绍一下什么是微服务架构&#xff1f; 答案&#xff1a;微服务架构是一种软件开发方法&#xff0c;将一个应用程序拆分成一系列小型、自治、可独立运行的服务&#xff0c;每个服务都专注于完成一个特定的业务功能&#xff0c;并通过轻量级的通信机制进行互联。 2. 你…

【教程】hexo 更换主题后,部署在 Github Page 无 CSS 样式

目录 前言环境hexo 更换主题解决部署到 Github Page 后无 CSS 样式的问题 前言 最近更换了 hexo 的主题后&#xff0c;重新部署到 Github Page 上发现不显示 CSS 样式&#xff0c;但在本地启动时又是正常的效果。此外&#xff0c;检查资源请求&#xff0c;发现多个 .css 文件请…

VO 和 DO

什么是 VO? VO&#xff08;Value Object&#xff09; 值对象&#xff08;Value Object&#xff0c;简称 VO&#xff09; 是一种对象&#xff0c;它主要用于在不同的层次之间传递数据。VO 通常是不可变的&#xff0c;即它的状态一旦被创建&#xff0c;就不会改变。值对象没有…

【软件测试】软件测试入门

软件测试入门 一、什么是软件测试二、软件测试和软件开发的区别三、软件测试在不同类型公司的定位1. 无组织性2. 专职 OR 兼职3. 项目性VS.职能性4.综合型 四、一个优秀的软件测试人员具备的素质1. 技能相关2. 非技能相关 一、什么是软件测试 最常见的理解是&#xff1a;软件测…

【效率提升】倍速插件Global Speed

global speed插件可以控制网页在线视频&#xff0c;能够应用在Edge和Google浏览器中&#xff0c;只需要在插件商店中下载并配置即可。这款插件的配置选项有很多&#xff0c;支持视频倍速&#xff08;最低0.25倍速&#xff0c;最高16倍速&#xff09;&#xff0c;固定标签页&…

【Java开发规范】IDEA 设置 text file encoding 为 UTF-8,且文件的换行符使用 Unix 格式

1. IDEA 设置 text file encoding 为 UTF-8 file -> settings -> editor -> code style -> file encoding Transparent-native-to-asci conversion 要不要勾选&#xff1f;> 不推荐勾选&#xff08;它的作用是用来自动转换ASCII编码&#xff0c;防止文件乱码&am…

Modbus协议转Profibus协议模块接热传感器配置攻略

一、前言 在工业自动化控制领域&#xff0c;Modbus协议和Profibus协议是两种常见的通讯协议&#xff0c;它们在设备之间传输数据起着至关重要的作用。而Modbus协议转Profibus协议模块&#xff08;XD-MDPB100&#xff09;设备&#xff0c;则扮演着连接不同通讯协议的桥梁角色。…

常规业务如何做到幂等性

一、前端防抖处理&#xff1a; 采用队列模式&#xff0c;队列插入判重处理&#xff0c;避免多次同事调用接口 二、后端处理 1、新增接口可根据数据库设计采用唯一索引方案机制&#xff0c;避免重复调用 2、更新采用乐观锁 例如update table set where version指定值 3、采用状态…

来点干货,比较好用的3D在线展示网站

制作好的3D模型需要客户对3D模型进行确认&#xff0c;图片和视频给过去&#xff0c;后面往往都会扯皮。无意间翻到几个3D展示网站&#xff0c;试用了下都不是很完善&#xff0c;后面在网上大量查阅资料并经过实际使用&#xff0c;发现几个相对比较好用值得推荐的。 1、Sketchf…

掉电安全文件系统littlefs移植

前言 通过查看oneOS中对littlefs的移植工作&#xff0c;发现&#xff0c;littlefs源码本身&#xff0c;有用的就4个&#xff1a; lfs.clfs.hlfs_util.clfs_util.h 剩下的就是适配层&#xff1a; dfs_lfs.clfs_config.h(和lfs_util.h差不多)lfs_crc.c(和lfs_util.c差不多) …

Python 数据持久化:使用 SQLite3 进行简单而强大的数据存储

&#x1f340; 前言 博客地址&#xff1a; CSDN&#xff1a;https://blog.csdn.net/powerbiubiu &#x1f44b; 简介 SQLite3是一种轻量级嵌入式数据库引擎&#xff0c;它在Python中被广泛使用。SQLite3通常已经包含在Python标准库中&#xff0c;无需额外安装。你只需导入 s…