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)

  • 24
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值