Circle STARKs 是一种新型 zk-STARK 方案,已在 Stwo 和 Plonky3 中实现,并被多个 zkVM 项目所采用。其关键创新点在于能够使用小型的 32 位域(Mersenne 素数 2 31 − 1 2^{31}-1 2 31 − 1 ),同时仍然保持高效 FFT 操作所需的数学属性。在这个解释性系列文章中,我们将讨论 Circle STARK 背后的主要算法,即 Circle FFT。
在第 1 部分文章中,我们首先回顾 STARK 友好素数的演变过程,然后通过详细的示例和推导,探索 Circle FFT 的基础概念——即 Circle 曲线、其群结构以及孪生陪集 (twin-cosets) 和标准位置陪集 (standard-position cosets) 的作用。随后,在第 2 部分文章中,我们将详细描述 Circle FFT 算法本身。
我们还结合 Python 脚本提供了对这些核心概念(例如 Circle 群和 Circle FFT)的详细演练,以及针对 p = 31 p=31 p = 31 (指数为 5 5 5 的 Mersenne 素数:2 5 − 1 2^5 -1 2 5 − 1 )的明确计算示例。
我们的重点是:即使在 p − 1 p-1 p − 1 没有较大的 2-adic 因子的情况下,这些构建模块中的每一个是如何引导出一个完整的类似 FFT 的例程的。
如果您有兴趣自己运行这些示例,完整的 Python 代码可以在这里 找到,我们将在后面的部分(如第 4 节和第 6 节)引用它,在这些部分我们将通过代码演练群和域的构建。
本文由 Yugo 与 RareSkills 合作编写。本文由 Soulforge Grant 提供资金支持。我们对他们的支持表示感谢。
0. 从 STARK 友好素数到 Mersenne 31
在深入探讨 STARK 友好素数之前,让我们先回顾一下有限域的基础知识。
域是一个定义了加法、减法、乘法和除法(除数不为零)的集合。当集合的元素是有限的时候,它被称为有限域。F p \mathbb{F}_p F p 指的是从 0 0 0 到 p − 1 p-1 p − 1 (其中 p p p 是一个素数)的整数集合,其加法、减法和乘法均在模 p p p 下进行,除法被定义为模 p p p 乘法的逆元。
我们用 F p ∗ \mathbb{F}_p^* F p ∗ 表示集合 F p ∖ { 0 } \mathbb{F}_p \setminus \{0\} F p ∖ { 0 } 。F p ∗ \mathbb{F}_p^* F p ∗ 中的每个元素都有一个乘法逆元,因此可以将 F p ∗ \mathbb{F}_p^* F p ∗ 视为一个乘法群。这个群的大小 ∣ F p ∗ ∣ |\mathbb{F}_p^*| ∣ F p ∗ ∣ 为 p − 1 p-1 p − 1 。当我们将 p − 1 p-1 p − 1 分解为其素因数时,众所周知,如果一个素数 q q q 出现了 r r r 次,那么必定存在一个大小为 q r q^r q r 的循环子群。
你可以用一个小素数(例如 p = 7 p=7 p = 7 )来简略说明这一点。由于 p − 1 = 6 p-1=6 p − 1 = 6 可分解为 2 × 3 2\times 3 2 × 3 ,因此必定存在大小为 2 2 2 和 3 3 3 的子群。实际上,在 F 7 ∗ = { 1 , 2 , 3 , 4 , 5 , 6 } \mathbb{F}_7^* = \{1,2,3,4,5,6\} F 7 ∗ = { 1 , 2 , 3 , 4 , 5 , 6 } 中,元素 6 6 6 生成了一个大小为 2 2 2 的子群 { 1 , 6 } \{1,6\} { 1 , 6 } ,元素 2 2 2 生成了一个大小为 3 3 3 的子群 { 1 , 2 , 4 } \{1,2,4\} { 1 , 2 , 4 } 。
在许多 STARK 协议中,数论变换 (NTT) 或快速傅里叶变换 (FFT) 依赖于这样一个子群:其因子是 2 的幂次,从而使该子群的大小为 2 r 2^r 2 r 。使得 2 r 2^r 2 r 能整除 ( p − 1 ) (p-1) ( p − 1 ) 的最大整数 r r r 被称为 two-adicity。较高的 two-adicity 允许为 FFT/NTT 域设置更大的 2 的幂次大小,这是实现快速多项式求值、插值和多项式乘法的关键。此外,高效实现基于 NTT 的这些操作严重依赖于快速的模乘运算——因为 FFT/NTT 涉及重复地将元素相乘并对 p p p 取模。
最初,STARKs 使用的素数是 p = 2 251 + 17 ⋅ 2 192 + 1 p = 2^{251} + 17 \cdot 2^{192} + 1 p = 2 251 + 17 ⋅ 2 192 + 1 ,其 two-adicity 为 192 192 192 。在现代 STARK 实现中,为了通过减小有限域的规模来降低开销,进行了一项改进。例如,Goldilocks 域为 p = 2 64 − 2 32 + 1 p = 2^{64} - 2^{32} + 1 p = 2 64 − 2 32 + 1 ,其 two-adicity 为 32 32 32 。至关重要的是,因为 2 64 ≡ 2 32 − 1 ( m o d p ) 2^{64} \equiv 2^{32} - 1 \pmod{p} 2 64 ≡ 2 32 − 1 ( mod p ) ,两个 64 位数字的乘积可以在基数 2 32 2^{32} 2 32 下进行拆分,并只需几次加法和减法即可完成归约。
那么 Circle STARKs 呢?如 Circle STARKs 论文 中提出的,它使用了一个 Mersenne 素数,
p = 2 31 − 1. p = 2^{31} - 1. p = 2 31 − 1.
Mersenne 素数是形式为 2 n − 1 2^n -1 2 n − 1 的素数,其中 n n n 为某个整数。在这里,n = 31 n=31 n = 31 得到了 2 31 − 1 2^{31}-1 2 31 − 1 ,它恰好是素数,因此被归类为 Mersenne 素数。
选择 2 31 − 1 2^{31}-1 2 31 − 1 的一个主要原因是它刚好能放入一个 32 位的机器字中,使得模乘运算极其快速。具体来说,当两个 32 位数字相乘时,结果是一个 64 位的值,而对 2 31 − 1 2^{31}-1 2 31 − 1 进行模归约只需进行两次加法即可完成。
借助向量化指令,此操作的速度还能大幅提升。现代 CPU 擅长原生处理 32 位整数,而 Mersenne 31 (2 31 − 1 2^{31}-1 2 31 − 1 ) 正好契合这种架构,从而允许最佳地利用硬件能力。正如 Eli Ben-Sasson 在 Why I’m Excited By Circle Stark And Stwo 中所讨论的,与原始 STARK 中使用的 256 位素数相比,Mersenne 31 的模乘速度大约快 125 倍,并且比 Baby Bear (2 31 − 2 27 + 1 2^{31} - 2^{27} + 1 2 31 − 2 27 + 1 ) 快 1.3 倍。
然而,传统的 FFT 或 NTT 方法要求在 p − 1 p-1 p − 1 中存在一个较大的 2-adic 因子,以便在 F p ∗ \mathbb{F}_p^* F p ∗ 中形成足够大的 2 的幂次子群。但在本例中,∣ F p ∗ ∣ = p − 1 = 2 31 − 2 |\mathbb{F}_p^*| = p - 1 \;=\; 2^{31} - 2 ∣ F p ∗ ∣ = p − 1 = 2 31 − 2 ,其 two-adicity 仅为 1。因此,我们不能直接使用乘法下的较大 2 的幂次子群。
Circle STARK 仍然采用了 Mersenne 素数域 p = 2 31 − 1 p = 2^{31} - 1 p = 2 31 − 1 。然而,我们不再直接在 F p \mathbb{F}_p F p 内部操作,而是观察到曲线
x 2 + y 2 = 1 x^2 + y^2 = 1 x 2 + y 2 = 1 在 F p \mathbb{F}_p F p (其中 p ≡ 3 ( m o d 4 ) p \equiv 3 \pmod{4} p ≡ 3 ( mod 4 ) )上恰好有 p + 1 p + 1 p + 1 个点。例如,当 p = 3 ( = 2 2 − 1 ) p = 3\; (= 2^2 - 1) p = 3 ( = 2 2 − 1 ) 时,恰好有四个这样的点:( 0 , 1 ) , ( 0 , 2 ) , ( 1 , 0 ) , ( 2 , 0 ) (0,1), (0,2), (1,0), (2,0) ( 0 , 1 ) , ( 0 , 2 ) , ( 1 , 0 ) , ( 2 , 0 ) 。
这非常关键,因为 p + 1 p+1 p + 1 可以包含一个很大的 2 的幂次,从而创建出大小为 2 n 2^n 2 n 的子群。因此,Circle STARK 没有在 F p \mathbb{F}_p F p 中处理单个元素,而是考虑满足 x 2 + y 2 = 1 x^2 + y^2 = 1 x 2 + y 2 = 1 的坐标对 ( x , y ) ∈ F p 2 (x,y)\in \mathbb{F}_p^2 ( x , y ) ∈ F p 2 (即 Circle 曲线上的点)。
通过这种方式,Circle STARK 可以直接在这些 Circle 元素上实现自己专属的快速多项式插值和求值——这通常被称为 Circle FFT。
1. Circle 曲线
让我们进入 Circle STARKs 的核心数学。有限域 F p \mathbb{F}_p F p 上的 Circle 曲线是 F p 2 \mathbb{F}_p^2 F p 2 的一个子集,由所有满足下式的点 ( x , y ) (x,y) ( x , y ) 定义:
x 2 + y 2 = 1. x^2 + y^2 = 1. x 2 + y 2 = 1.
我们有时将该集合表示为 C ( F p ) C(\mathbb{F}_p) C ( F p ) ,或者简称为“Circle”。
在 Circle STARKs 中,我们重点关注满足 p ≡ 3 ( m o d 4 ) p \equiv 3 \pmod{4} p ≡ 3 ( mod 4 ) (例如 p = 3 , 7 , 11 , … p=3,7,11,\dots p = 3 , 7 , 11 , … )的素数 p p p 。在这个条件下,− 1 -1 − 1 在 F p \mathbb{F}_p F p 中不是一个平方数。具体而言,这确保了方程 x 2 + y 2 = 1 x^2 + y^2 = 1 x 2 + y 2 = 1 在 F p 2 \mathbb{F}_p^2 F p 2 中恰好有 p + 1 p+1 p + 1 个解,并且没有额外的异常解(即无穷远点)。对于本文来说,我们只需知道在该条件下,F p 2 \mathbb{F}_p^2 F p 2 中的 x 2 + y 2 = 1 x^2 + y^2 = 1 x 2 + y 2 = 1 恰好能给出 p + 1 p+1 p + 1 个点。
(不过,对于有兴趣从几何角度理解为何 p ≡ 3 ( m o d 4 ) p \equiv 3 \pmod{4} p ≡ 3 ( mod 4 ) 会恰好得出 p + 1 p + 1 p + 1 个解的读者,请参阅附录。)
1.1 简单示例 p = 7 ≡ 3 ( m o d 4 ) p=7\equiv 3 \pmod{4} p = 7 ≡ 3 ( mod 4 )
例如,如果 p = 7 p =7 p = 7 (即 3 ( m o d 4 ) 3 \pmod{4} 3 ( mod 4 ) ),那么 C ( F 7 ) C(\mathbb{F}_{7}) C ( F 7 ) 就是所有满足 x 2 + y 2 = 1 x^2 + y^2 = 1 x 2 + y 2 = 1 的 ( x , y ) ∈ F 7 2 (x,y) \in \mathbb{F}_{7}^2 ( x , y ) ∈ F 7 2 构成的集合。
以下是 F 7 2 \mathbb{F}_{7}^2 F 7 2 中满足 x 2 + y 2 ≡ 1 ( m o d 7 ) x^2 + y^2 \equiv 1 \pmod{7} x 2 + y 2 ≡ 1 ( mod 7 ) 的几个 ( x , y ) (x,y) ( x , y ) 数对示例:
( 1 , 0 ) (1, 0) ( 1 , 0 ) 和 ( 0 , 1 ) (0, 1) ( 0 , 1 ) 是显而易见的,因为 1 2 + 0 2 = 1 1^2 + 0^2=1 1 2 + 0 2 = 1 且 0 2 + 1 2 = 1 0^2 + 1^2=1 0 2 + 1 2 = 1 。
( 5 , 2 ) (5,2) ( 5 , 2 ) 也成立,因为 5 2 + 2 2 = 25 + 4 = 29 5^2 + 2^2 = 25 + 4 = 29 5 2 + 2 2 = 25 + 4 = 29 ,而 29 m o d 7 = 1 29 \bmod 7 = 1 29 mod 7 = 1 。
我们可以看到,对于 p = 7 p=7 p = 7 ,恰好有 8 8 8 (即 p + 1 p+1 p + 1 )个这样的数对。
2. Circle 群
这类集合记为 C ( F p ) C(\mathbb{F}_p) C ( F p ) ,并且通常被称为 F p \mathbb{F}_p F p 上的 Circle 曲线。一个惊人的事实是 ∣ C ( F p ) ∣ = p + 1 |C(\mathbb{F}_p)| = p + 1 ∣ C ( F p ) ∣ = p + 1 。例如,如果 p = 7 p = 7 p = 7 ,那么圆上恰好有 7 + 1 = 8 7 + 1 = 8 7 + 1 = 8 个点——值得注意的是 8 = 2 3 8 = 2^3 8 = 2 3 。
这很重要,因为在通常的 STARK 设定中,我们经常需要一个大小为 2 n 2^n 2 n 的域来进行类似于 FFT 的操作。在 p = 7 p = 7 p = 7 的情况下,圆上恰好有 8 个点,这意味着我们可以形成大小为 2 n 2^n 2 n 的子群。稍后,我们将看到 Circle FFT 是如何利用这一属性(即 p + 1 p+1 p + 1 中的高 2-adicity)的。
一个关键的属性是,C ( F p ) C(\mathbb{F}_p) C ( F p ) 可以在其点上赋予一个群运算(本质上是一个二元运算符)。具体来说,我们使用“⋅ \cdot ⋅ ”来表示这种运算:对于 C ( F p ) C(\mathbb{F}_p) C ( F p ) 中的两点 ( x 0 , y 0 ) (x_0,y_0) ( x 0 , y 0 ) 和 ( x 1 , y 1 ) (x_1,y_1) ( x 1 , y 1 ) ,
( x 0 , y 0 ) ⋅ ( x 1 , y 1 ) = ( x 0 x 1 − y 0 y 1 , x 0 y 1 + y 0 x 1 ) . (x_0, y_0)\,\cdot\,(x_1, y_1)
\;=\;
\bigl(x_0 x_1 - y_0 y_1,\;\; x_0 y_1 + y_0 x_1\bigr). ( x 0 , y 0 ) ⋅ ( x 1 , y 1 ) = ( x 0 x 1 − y 0 y 1 , x 0 y 1 + y 0 x 1 ) .
我们可以验证这种群运算仍然保持在 C ( F p ) C(\mathbb{F}_p) C ( F p ) 内(结果仍然满足 x 2 + y 2 = 1 x^2 + y^2=1 x 2 + y 2 = 1 ),并使该集合成为一个大小为 p + 1 p+1 p + 1 的循环群。
2.1 检验群公理
作为群的公理,我们通常列出以下四个属性:封闭性、单位元、逆元和结合律。让我们仔细看看每一个以确认它们都成立。
2.1.1 封闭性
取圆上的两点 ( x 0 , y 0 ) (x_0, y_0) ( x 0 , y 0 ) 和 ( x 1 , y 1 ) (x_1, y_1) ( x 1 , y 1 ) ;
x 0 2 + y 0 2 = 1 and x 1 2 + y 1 2 = 1. x_0^2 + y_0^2 = 1
\quad\text{and}\quad
x_1^2 + y_1^2 = 1. x 0 2 + y 0 2 = 1 and x 1 2 + y 1 2 = 1.
定义一个新点
( x ^ , y ^ ) = ( x 0 x 1 − y 0 y 1 , x 0 y 1 + y 0 x 1 ) . (\hat{x}, \hat{y})
\;=\;
\bigl(
x_0\,x_1 \;-\; y_0\,y_1,
\;\; x_0\,y_1 \;+\; y_0\,x_1
\bigr). ( x ^ , y ^ ) = ( x 0 x 1 − y 0 y 1 , x 0 y 1 + y 0 x 1 ) .
我们将通过逐步计算 ( x ^ 2 + y ^ 2 ) (\hat{x}^2 + \hat{y}^2) ( x ^ 2 + y ^ 2 ) 来证明 ( x ^ , y ^ ) (\hat{x}, \hat{y}) ( x ^ , y ^ ) 也位于圆上:
x ^ 2 + y ^ 2 = ( x 0 x 1 − y 0 y 1 ) 2 + ( x 0 y 1 + y 0 x 1 ) 2 // 展开平方 = x 0 2 x 1 2 − 2 x 0 x 1 y 0 y 1 + y 0 2 y 1 2 + x 0 2 y 1 2 + 2 x 0 y 1 y 0 x 1 + y 0 2 x 1 2 = x 0 2 x 1 2 + y 0 2 y 1 2 + x 0 2 y 1 2 + y 0 2 x 1 2 // 抵消 ± 2 x 0 y 1 y 0 x 1 = x 0 2 ( x 1 2 + y 1 2 ) + y 0 2 ( x 1 2 + y 1 2 ) // 提取因子 ( x 1 2 + y 1 2 ) = ( x 0 2 + y 0 2 ) ( x 1 2 + y 1 2 ) // 使用 x 0 2 + y 0 2 再次提取因子 \begin{aligned}
\hat{x}^2 + \hat{y}^2
&=\; (x_0 x_1 - y_0 y_1)^2 \;+\; (x_0 y_1 + y_0 x_1)^2 \quad \text{// 展开平方}
\\[6pt]
&=\;
{x_0^2 x_1^2}
-\;
2\,x_0 x_1\,y_0 y_1
+\;
{y_0^2 y_1^2}
\;+\;
{x_0^2 y_1^2}
+\;
2\,x_0 y_1\,y_0 x_1
+\;
{y_0^2 x_1^2}
\\[4pt]
&=\;
x_0^2 x_1^2
\;+\;
y_0^2 y_1^2
\;+\;
x_0^2 y_1^2
\;+\;
y_0^2 x_1^2
\quad \text{// 抵消 }\pm2\,x_0 y_1\,y_0 x_1
\\[3pt]
&=\;
x_0^2 \bigl(x_1^2 + y_1^2\bigr)
\;+\;
y_0^2 \bigl(x_1^2 + y_1^2\bigr)
\quad \text{// 提取因子 }(x_1^2 + y_1^2)
\\[3pt]
&=\;
\bigl(x_0^2 + y_0^2\bigr)\,
\bigl(x_1^2 + y_1^2\bigr)
\quad \text{// 使用 }x_0^2 + y_0^2 \text{ 再次提取因子}
\end{aligned} x ^ 2 + y ^ 2 = ( x 0 x 1 − y 0 y 1 ) 2 + ( x 0 y 1 + y 0 x 1 ) 2 // 展开平方 = x 0 2 x 1 2 − 2 x 0 x 1 y 0 y 1 + y 0 2 y 1 2 + x 0 2 y 1 2 + 2 x 0 y 1 y 0 x 1 + y 0 2 x 1 2 = x 0 2 x 1 2 + y 0 2 y 1 2 + x 0 2 y 1 2 + y 0 2 x 1 2 // 抵消 ± 2 x 0 y 1 y 0 x 1 = x 0 2 ( x 1 2 + y 1 2 ) + y 0 2 ( x 1 2 + y 1 2 ) // 提取因子 ( x 1 2 + y 1 2 ) = ( x 0 2 + y 0 2 ) ( x 1 2 + y 1 2 ) // 使用 x 0 2 + y 0 2 再次提取因子
因为我们已知 x 0 2 + y 0 2 = 1 x_0^2 + y_0^2 = 1 x 0 2 + y 0 2 = 1 且 x 1 2 + y 1 2 = 1 x_1^2 + y_1^2 = 1 x 1 2 + y 1 2 = 1 ,我们将这些值代入乘积中:
x ^ 2 + y ^ 2 = ( x 0 2 + y 0 2 ) ( x 1 2 + y 1 2 ) = 1 × 1 = 1. \hat{x}^2 + \hat{y}^2
\;=\;
(x_0^2 + y_0^2)\,(x_1^2 + y_1^2)
\;=\;
1 \times 1
\;=\;
1. x ^ 2 + y ^ 2 = ( x 0 2 + y 0 2 ) ( x 1 2 + y 1 2 ) = 1 × 1 = 1.
因此 ( x ^ , y ^ ) (\hat{x}, \hat{y}) ( x ^ , y ^ ) 也满足 ( x ^ 2 + y ^ 2 = 1 ) (\hat{x}^2 + \hat{y}^2 = 1) ( x ^ 2 + y ^ 2 = 1 ) ,并因此位于圆上。这证实了集合在如下运算下是封闭的:
( x 0 , y 0 ) ⋅ ( x 1 , y 1 ) = ( x ^ , y ^ ) . (x_0, y_0)
\;\cdot\;
(x_1, y_1)
\;=\;
(\hat{x}, \hat{y}). ( x 0 , y 0 ) ⋅ ( x 1 , y 1 ) = ( x ^ , y ^ ) .
2.1.2 单位元
在群运算中,点 ( 1 , 0 ) (1,0) ( 1 , 0 ) 充当单位元。具体而言,对于圆上的任何点 ( x , y ) (x,y) ( x , y ) ,
( 1 , 0 ) ⋅ ( x , y ) = ( 1 ⋅ x − 0 ⋅ y , 1 ⋅ y + 0 ⋅ x ) = ( x , y ) , (1,0)\cdot(x,y)
\;=\;
\bigl(1\cdot x - 0\cdot y,\;1\cdot y + 0\cdot x\bigr)
\;=\;
(x,y), ( 1 , 0 ) ⋅ ( x , y ) = ( 1 ⋅ x − 0 ⋅ y , 1 ⋅ y + 0 ⋅ x ) = ( x , y ) ,
有人可能会对点 ( 0 , 1 ) (0,1) ( 0 , 1 ) 感到好奇。如果我们试图使用 ( 0 , 1 ) (0,1) ( 0 , 1 ) 作为单位元,我们会发现它不成立:
( 0 , 1 ) ⋅ ( x , y ) = ( 0 ⋅ x − 1 ⋅ y , 0 ⋅ y + 1 ⋅ x ) = ( − y , x ) , (0,1)\cdot(x,y) \;=\; \bigl(0\cdot x - 1\cdot y,\;0\cdot y + 1\cdot x\bigr)
\;=\;
(-y,\;x), ( 0 , 1 ) ⋅ ( x , y ) = ( 0 ⋅ x − 1 ⋅ y , 0 ⋅ y + 1 ⋅ x ) = ( − y , x ) ,
对于一般的 x , y x,y x , y ,这并不等于 ( x , y ) (x,y) ( x , y ) 。因为单位元是唯一的,所以 ( 0 , 1 ) (0,1) ( 0 , 1 ) 不能是单位元。
2.1.3 逆元
在一个群中,元素 ( x , y ) (x,y) ( x , y ) 的逆元是满足下式的唯一解 ( x ′ , y ′ ) (x',y') ( x ′ , y ′ ) :
( x , y ) ⋅ ( x ′ , y ′ ) = ( 1 , 0 ) . (x,y)\,\cdot\,(x',y') \;=\; (1,0). ( x , y ) ⋅ ( x ′ , y ′ ) = ( 1 , 0 ) .
在圆上,我们看到 ( x , − y ) (x,-y) ( x , − y ) 可以作为 ( x , y ) (x,y) ( x , y ) 在该群运算下的逆元。确实,
( x , y ) ⋅ ( x , − y ) = ( x x − y ( − y ) , x ( − y ) + y x ) = ( x 2 + y 2 , 0 ) = ( 1 , 0 ) , (x,y)\,\cdot\,(x,\,-y)
\;=\;
\bigl(x\,x - y\,(-y),\; x\,(-y) + y\,x\bigr)
\;=\;
\bigl(x^2 + y^2,\;0\bigr)
\;=\;
(1,0), ( x , y ) ⋅ ( x , − y ) = ( x x − y ( − y ) , x ( − y ) + y x ) = ( x 2 + y 2 , 0 ) = ( 1 , 0 ) ,
因为 x 2 + y 2 = 1 x^2 + y^2 = 1 x 2 + y 2 = 1 。
因此,在群运算下 ( x , y ) (x,y) ( x , y ) 的逆元是 ( x , − y ) (x,\,-y) ( x , − y ) 。
2.1.4 结合律
最后一个群公理是结合律:对于圆上的任意三点
( x 0 , y 0 ) , ( x 1 , y 1 ) , ( x 2 , y 2 ) (x_0,y_0), (x_1,y_1), (x_2,y_2) ( x 0 , y 0 ) , ( x 1 , y 1 ) , ( x 2 , y 2 ) ,
( ( x 0 , y 0 ) ⋅ ( x 1 , y 1 ) ) ⋅ ( x 2 , y 2 ) = ( x 0 , y 0 ) ⋅ ( ( x 1 , y 1 ) ⋅ ( x 2 , y 2 ) ) . \bigl((x_0,y_0)\,\cdot\,(x_1,y_1)\bigr)\,\cdot\,(x_2,y_2)
\;=\;
(x_0,y_0)\,\cdot\,\bigl((x_1,y_1)\,\cdot\,(x_2,y_2)\bigr). ( ( x 0 , y 0 ) ⋅ ( x 1 , y 1 ) ) ⋅ ( x 2 , y 2 ) = ( x 0 , y 0 ) ⋅ ( ( x 1 , y 1 ) ⋅ ( x 2 , y 2 ) ) .
这可以通过展开多项式来验证,但由于过程太长,我们不在这里详细讨论。
2.2 一个特殊运算:平方映射 π \pi π
除了这些群公理之外,圆上还有另一个运算,它在后续章节中非常有用,特别是在 Circle FFT 中,即平方映射。该映射将群运算应用于点与其自身:
π ( x , y ) = ( x , y ) ⋅ ( x , y ) = ( x 2 − y 2 , 2 x y ) . \pi(x,y)
\;=\;
(x,y)\,\cdot\,(x,y)
\;=\;
\bigl(x^2 - y^2,\;2\,x\,y\bigr). π ( x , y ) = ( x , y ) ⋅ ( x , y ) = ( x 2 − y 2 , 2 x y ) .
由于圆满足 x 2 + y 2 = 1 x^2 + y^2 = 1 x 2 + y 2 = 1 ,我们得到 x 2 − y 2 = 2 x 2 − 1 x^2 - y^2 = 2x^2 - 1 x 2 − y 2 = 2 x 2 − 1 ,因此
π ( x , y ) = ( 2 x 2 − 1 , 2 x y ) . \pi(x,y)
\;=\;
\bigl(2\,x^2 - 1,\;2\,x\,y\bigr). π ( x , y ) = ( 2 x 2 − 1 , 2 x y ) .
在 Circle FFT 中,我们将使用 π \pi π 以递归的方式将某些求值域减半——每次应用 π \pi π 都会使域的大小缩小两倍。这是因为 π \pi π 与群运算是兼容的。具体来说,对于圆上的两点 P P P 和 Q Q Q ,
π ( P ⋅ Q ) = π ( P ) ⋅ π ( Q ) . \pi\bigl(P \cdot Q\bigr)
\;=\;
\pi(P)
\;\cdot\;
\pi(Q). π ( P ⋅ Q ) = π ( P ) ⋅ π ( Q ) .
这种兼容性意味着 π \pi π 可以将大小为 2 n 2^n 2 n 的孪生陪集映射成另一个大小为 2 n − 1 2^{n-1} 2 n − 1 的孪生陪集。稍后我们将详细讨论这一域减半特性。
2.3 一个特殊运算:对合映射 J J J
除了平方映射之外,还有另一个重要的运算。该运算被称为对合映射 (involution),定义为
J ( x , y ) = ( x , − y ) . J(x,y)
\;=\;
(x,\;-y). J ( x , y ) = ( x , − y ) .
从几何上看,它翻转了 y y y 坐标的符号,同时保持 x x x 坐标不变。请注意,J J J 的逆是它自己——连续两次应用 J J J 会使你回到原来的点:
J ( J ( x , y ) ) = J ( x , − y ) = ( x , y ) . J\bigl(J(x,y)\bigr)
\;=\;
J(x,\;-y)
\;=\;
(x,\;y). J ( J ( x , y ) ) = J ( x , − y ) = ( x , y ) .
在圆 x 2 + y 2 = 1 x^2 + y^2 = 1 x 2 + y 2 = 1 上,对合映射 J ( x , y ) J(x,y) J ( x , y ) 能够将曲线上的每一个点保持在曲线上(因为取 y y y 的负值并不影响 x 2 + y 2 x^2 + y^2 x 2 + y 2 )。然而,y = 0 y=0 y = 0 的点在 J J J 的作用下是固定的,这意味着 J ( x , 0 ) = ( x , 0 ) J(x,\,0) = (x,\,0) J ( x , 0 ) = ( x , 0 ) 。
2.4 p = 31 p=31 p = 31 时的 Circle 群具体操作
在之前的具体示例中,我们探讨了 p = 7 p = 7 p = 7 时的 C ( F p ) C(\mathbb{F}_p) C ( F p ) ,这作为一个有用的简单示例,帮助我们建立直觉。然而,p = 7 p = 7 p = 7 太小了,不足以揭示 Circle 群的深层结构特性——例如更长的子群链,或孪生陪集及标准位置陪集的构建。
因此,我们现在转向稍大一些的素数 p = 31 p = 31 p = 31 (其满足 p = 2 5 − 1 p = 2^5 - 1 p = 2 5 − 1 ),以便以更有意义的方式展示这些更丰富的行为。
给定符合 3 ( m o d 4 ) 3 \pmod{4} 3 ( mod 4 ) 的 p = 31 p = 31 p = 31 ,满足方程 x 2 + y 2 = 1 x^2 + y^2 = 1 x 2 + y 2 = 1 的 F 31 2 \mathbb{F}_{31}^2 F 31 2 中的点集 ( x , y ) (x, y) ( x , y ) 记作 C ( F 31 ) C(\mathbb{F}_{31}) C ( F 31 ) ,如下图所示:
以下是 F 31 2 \mathbb{F}_{31}^2 F 31 2 中满足 x 2 + y 2 ≡ 1 ( m o d 31 ) x^2 + y^2 \equiv 1 \pmod{31} x 2 + y 2 ≡ 1 ( mod 31 ) 的几个坐标对示例 ( x , y ) (x,y) ( x , y ) :
( 5 , 10 ) (5,10) ( 5 , 10 ) 也成立,因为 5 2 + 10 2 = 25 + 100 = 125 5^2 + 10^2 = 25 + 100 = 125 5 2 + 1 0 2 = 25 + 100 = 125 ,并且 125 m o d 31 = 125 − 4 ⋅ 31 = 1 125 \bmod 31 = 125 - 4\cdot31 = 1 125 mod 31 = 125 − 4 ⋅ 31 = 1 。
( 7 , 13 ) (7,13) ( 7 , 13 ) 同样是一个解:7 2 = 49 ≡ 18 7^2 = 49 \equiv 18 7 2 = 49 ≡ 18 (mod 31) 且 13 2 = 169 ≡ 14 13^2 = 169 \equiv 14 1 3 2 = 169 ≡ 14 (mod 31),因此 18 + 14 = 32 ≡ 1 18 + 14 = 32 \equiv 1 18 + 14 = 32 ≡ 1 (mod 31)。
( 30 , 0 ) (30,0) ( 30 , 0 ) 说明 30 ≡ − 1 ( m o d 31 ) 30 \equiv -1 \pmod{31} 30 ≡ − 1 ( mod 31 ) ,因此 ( − 1 ) 2 + 0 2 ≡ 1 (-1)^2 + 0^2 \equiv 1 ( − 1 ) 2 + 0 2 ≡ 1 (mod 31)。
为了了解 Circle 群,让我们在 F 31 \mathbb{F}_{31} F 31 上进行运算,此时圆 C ( F 31 ) C(\mathbb{F}_{31}) C ( F 31 ) 具有 32 个点。假设我们取点
Q = ( 13 , 7 ) . Q \;=\; (13,\,7). Q = ( 13 , 7 ) .
我们可以通过群运算将 Q Q Q 与点 ( 30 , 0 ) (30,0) ( 30 , 0 ) 结合:
( 13 , 7 ) ⋅ ( 30 , 0 ) = ( 13 ⋅ 30 − 7 ⋅ 0 , 13 ⋅ 0 + 7 ⋅ 30 ) = ( 390 , 210 ) ≡ ( 18 , 24 ) ( m o d 31 ) . (13,\,7) \,\cdot\,(30,\,0)
\;=\;
\bigl(
13 \cdot 30 - 7 \cdot 0,\;\;
13 \cdot 0 + 7 \cdot 30
\bigr)
\;=\;
(390,\,210)
\;\equiv\;
(18,\,24)
\pmod{31}. ( 13 , 7 ) ⋅ ( 30 , 0 ) = ( 13 ⋅ 30 − 7 ⋅ 0 , 13 ⋅ 0 + 7 ⋅ 30 ) = ( 390 , 210 ) ≡ ( 18 , 24 ) ( mod 31 ) .
确实,我们可以验证
18 2 + 24 2 ≡ 324 + 576 ≡ 900 ≡ 1 ( m o d 31 ) , 18^2 + 24^2
\;\equiv\;
324 + 576
\;\equiv\;
900
\;\equiv\;
1
\pmod{31}, 1 8 2 + 2 4 2 ≡ 324 + 576 ≡ 900 ≡ 1 ( mod 31 ) ,
因此 ( 18 , 24 ) (18,\,24) ( 18 , 24 ) 也落在圆 x 2 + y 2 = 1 x^2 + y^2 = 1 x 2 + y 2 = 1 上。
同时,Q Q Q 的逆元是
Q − 1 = ( 13 , − 7 ) ≡ ( 13 , 24 ) ( m o d 31 ) , Q^{-1} \;=\; (13,\,-7)\;\equiv\;(13,\,24)\pmod{31}, Q − 1 = ( 13 , − 7 ) ≡ ( 13 , 24 ) ( mod 31 ) ,
因为
( 13 , 7 ) ⋅ ( 13 , 24 ) = ( 1 , 0 ) . (13,\,7)\,\cdot\,(13,\,24) \;=\; (1,\,0). ( 13 , 7 ) ⋅ ( 13 , 24 ) = ( 1 , 0 ) .
此外,平方映射可以作用于点 Q = ( 13 , 7 ) Q=(13,7) Q = ( 13 , 7 ) 。回想一下
π ( x , y ) = ( x , y ) ⋅ ( x , y ) . \pi(x,y)
\;=\;
(x,y)\,\cdot\,(x,y). π ( x , y ) = ( x , y ) ⋅ ( x , y ) .
因此,
π ( Q ) = ( 13 , 7 ) ⋅ ( 13 , 7 ) = ( 13 ⋅ 13 − 7 ⋅ 7 , 13 ⋅ 7 + 7 ⋅ 13 ) ≡ ( 27 , 27 ) ( m o d 31 ) . \pi(Q)
\;=\;
(13,7)\,\cdot\,(13,7)
\;=\;
\bigl(13\cdot 13 - 7\cdot 7,\;13\cdot 7 + 7\cdot 13\bigr)
\;
\;\equiv\;
(27,\,27)
\pmod{31}. π ( Q ) = ( 13 , 7 ) ⋅ ( 13 , 7 ) = ( 13 ⋅ 13 − 7 ⋅ 7 , 13 ⋅ 7 + 7 ⋅ 13 ) ≡ ( 27 , 27 ) ( mod 31 ) .
3. Circle 群的子群
我们已经确定 C ( F p ) C(\mathbb{F}_p) C ( F p ) 是一个大小为 p + 1 p+1 p + 1 的循环群。如果 p + 1 p + 1 p + 1 是 2 的幂次,假设 p + 1 = 2 m p+1 = 2^m p + 1 = 2 m ,那么就存在一条嵌套的子群链
G 0 ⊂ G 1 ⊂ G 2 ⊂ … ⊂ G m = C ( F p ) G_0
\;\subset\;
G_1
\;\subset\;
G_2
\;\subset\;
\dots
\;\subset\;
G_m
\;=\;
C(\mathbb{F}_p) G 0 ⊂ G 1 ⊂ G 2 ⊂ … ⊂ G m = C ( F p )
其中每个 G k G_k G k 的阶为 ∣ G k ∣ = 2 k |G_k| = 2^k ∣ G k ∣ = 2 k 。
换句话说,G 1 G_1 G 1 是大小为 2 的子群,G 2 G_2 G 2 大小为 4,依此类推,直到 G m = C ( F p ) G_m = C(\mathbb{F}_p) G m = C ( F p ) 本身,其大小为 2 m = p + 1 2^m = p+1 2 m = p + 1 。
例如,如果 p = 31 p = 31 p = 31 (此时 p + 1 = 32 = 2 5 p+1 = 32 = 2^5 p + 1 = 32 = 2 5 ),我们得到一条链
G 0 , G 1 , G 2 , G 3 , G 4 , G 5 G_0,\,G_1,\,G_2,\,G_3,\,G_4,\,G_5 G 0 , G 1 , G 2 , G 3 , G 4 , G 5
其中 G 5 = C ( F 31 ) G_5 = C(\mathbb{F}_{31}) G 5 = C ( F 31 ) 并且每个 G k G_k G k 的大小都是 2 k 2^k 2 k 。其摘要如下所示:
k k k
∣ G k ∣ = 2 k \lvert G_k\rvert = 2^k ∣ G k ∣ = 2 k
G 0 G_0 G 0
1
G 1 G_1 G 1
2
G 2 G_2 G 2
4
G 3 G_3 G 3
8
G 4 G_4 G 4
16
G 5 G_5 G 5
32
在下方,我们明确列出了 C ( F 31 ) C(\mathbb{F}_{31}) C ( F 31 ) 中的每一个子群。
Copy Size 1: [Point(1, 0 )]
Size 2: [Point(1, 0 ), Point( 30, 0 )]
Size 4: [Point(1, 0 ), Point( 0, 30 ), Point( 30, 0 ), Point( 0, 1 )]
Size 8: [Point(1, 0 ), Point( 4, 27 ), Point( 0, 30 ), Point( 27, 27 ), Point( 30, 0 ), Point( 27, 4 ), Point( 0, 1 ), Point( 4, 4 )]
Size 16: [Point(1, 0 ), Point( 7, 13 ), Point( 4, 27 ), Point( 18, 24 ), Point( 0, 30 ), Point( 13, 24 ), Point( 27, 27 ), Point( 24, 13 ), Point( 30, 0 ), Point( 24, 18 ), Point( 27, 4 ), Point( 13, 7 ), Point( 0, 1 ), Point( 18, 7 ), Point( 4, 4 ), Point( 7, 18 )]
Size 32: [Point(1, 0 ), Point( 2, 11 ), Point( 7, 13 ), Point( 26, 10 ), Point( 4, 27 ), Point( 21, 5 ), Point( 18, 24 ), Point( 20, 29 ), Point( 0, 30 ), Point( 11, 29 ), Point( 13, 24 ), Point( 10, 5 ), Point( 27, 27 ), Point( 5, 10 ), Point( 24, 13 ), Point( 29, 11 ), Point( 30, 0 ), Point( 29, 20 ), Point( 24, 18 ), Point( 5, 21 ), Point( 27, 4 ), Point( 10, 26 ), Point( 13, 7 ), Point( 11, 2 ), Point( 0, 1 ), Point( 20, 2 ), Point( 18, 7 ), Point( 21, 26 ), Point( 4, 4 ), Point( 26, 21 ), Point( 7, 18 ), Point( 2, 20 )]
4. Python 代码 1:Circle 群
我们现在将通过简单的 Python 实现来回顾 Circle 群代码。这里仅描述了最重要的函数或部分,并且所有代码都可以在这里 找到。
在此,我们定义了两个核心类——FieldElement 和 CirclePoint——以分别处理底层有限域中的算术运算和曲线上的群运算。
4.1 FieldElement
首先,FieldElement 类定义了有限域 F 31 \mathbb{F}_{31} F 31 中的算术运算,例如模 31 加法、乘法和求逆。这是在 Circle 曲线上进行所有计算的基础。
Copy # Mersenne 5
MOD = 31
class FieldElement :
def __init__ (self, value):
"""Initialize a field element"""
self .value = value % MOD
def __add__ (self, other):
"""Add two field elements"""
return FieldElement(( self .value + other.value) % MOD )
def __mul__ (self, other):
"""Multiply two field elements"""
return FieldElement(( self .value * other.value) % MOD )
def inv (self):
"""Compute the multiplicative inverse"""
return FieldElement( pow ( self .value, MOD - 2 , MOD ))
def square (self):
"""Compute the square"""
return self * self
4.2 CirclePoint
CirclePoint 类代表 Circle 曲线 x 2 + y 2 = 1 x^2+y^2=1 x 2 + y 2 = 1 上的点。add 方法实现了群运算,而 double 则应用了平方映射。
Copy class CirclePoint :
def __init__ (self, x, y):
"""Initialize a point on the circle x^2 + y^2 = 1"""
if (x.square() + y.square()).value != 1 :
raise ValueError ( "Point does not lie on the circle" )
self .x = x
self .y = y
def add (self, other):
"""Perform group operation: (x1,y1)・(x2,y2) = (x1*x2 - y1*y2, x1*y2 + x2*y1)."""
nx = self .x * other.x - self .y * other.y
ny = self .x * other.y + other.x * self .y
return CirclePoint(nx, ny)
def double (self):
"""Apply squaring map: π(x,y) = (2*x^2 - 1, 2*x*y), since x^2 + y^2 = 1."""
xx = self .x.square().double() - FieldElement.one()
yy = self .x.double() * self .y
return CirclePoint(xx, yy)
@ classmethod
def identity (cls):
"""Return the identity element (1, 0) of the circle group."""
return cls (FieldElement.one(), FieldElement.zero())
然后,你可以如第 2.4 节所述,模拟一个 Circle 群运算示例。
例如,将 CirclePoint ( 13 , 7 ) (13, 7) ( 13 , 7 ) 和 CirclePoint ( 30 , 0 ) (30, 0) ( 30 , 0 ) 相加会得到 Point ( 18 , 24 ) (18, 24) ( 18 , 24 ) 。
Copy p1 = CirclePoint(FieldElement( 13 ), FieldElement( 7 ))
p2 = CirclePoint(FieldElement( 30 ), FieldElement( 0 ))
# group operation
p3 = p1.add(p2)
print ( f "p1・p2 = { p3 } " )
Copy p1・p2 = Point( 18 , 24 )
对 p 1 = ( 13 , 7 ) p1=(13,7) p 1 = ( 13 , 7 ) 进行 double 会产生 ( 27 , 27 ) (27, 27) ( 27 , 27 )
Copy # squaring map
p1_double = p1.double()
print ( f "π(p1) = { p1_double } " )
Copy π(p1) = Point( 27 , 27 )
( 13 , 7 ) (13, 7) ( 13 , 7 ) 的逆元是 ( 13 , 24 ) (13, 24) ( 13 , 24 ) ,将它们相加得到单位元 ( 1 , 0 ) (1, 0) ( 1 , 0 )
Copy # Inverse
p1_inv = p1.inverse()
print ( f "p1's inverse = { p1_inv } " )
p1_plus_inv = p1.add(p1_inv)
print ( f "p1・p1_inv = { p1_plus_inv } " )
Copy p1 's inverse = Point(13, 24)
p1・p1_inv = Point( 1 , 0 )
4.3 Circle 群
generate_subgroup 函数生成一个阶为 2 k 2^k 2 k 的子群 G k G_k G k 。它从 get_nth_generator 函数获取适当的生成元,并重复执行群运算 add 来构建该子群。
Copy def generate_subgroup (k: int ) -> list[CirclePoint]:
"""Generate a subgroup of size 2^k using the generator."""
g_k = get_nth_generator(k)
p = CirclePoint.identity()
return [ (p := p.add(g_k)) if i else p
for i in range ( 1 << k) ]
例如,你可以获取大小为 8 的子群。
Copy G3 = generate_subgroup( 3 )
Copy Size 8: [Point(1, 0 ), Point( 4, 27 ), Point( 0, 30 ), Point( 27, 27 ), Point( 30, 0 ), Point( 27, 4 ), Point( 0, 1 ), Point( 4, 4 )]
5. 陪集、孪生陪集与标准位置陪集
孪生陪集和标准位置陪集是 Circle STARKs 中的域 (domains)。在理解孪生陪集和标准位置陪集的数学属性之前,让我们简要回顾一下传统 STARKs 中域是如何被使用的。正如第 0 节所讨论的,传统的 STARKs 通常利用表示为 F p ∗ \mathbb{F}_p^* F p ∗ 的乘法(子)群作为它们的域。这些域主要用于两个目的。
首先,当通过 IFFT 从计算轨迹构建多项式时,它们充当求值域 (evaluation domain),我们需要通过 FFT 使用扩展域来进行低次扩展 (LDE),并构建约束多项式并在 LDE 上进行求值。
其次,在低次测试中,特别是在使用 FRI 承诺时,必须在域上通过 FFT 对多项式进行求值,并且在递归 FRI 折叠步骤中,这些域会被迭代地减半。
此外,在 FRI 折叠步骤中,随着多项式的度数减半,域的大小也需要减半。将域大小减半是 FRI 和 FFT 的核心。我们在继续学习时请记住这一点。
因为虽然 Circle 群本身已经提供了高 2-adicity,但孪生陪集或标准位置陪集的构建能够确保:在 FFT 的递归平方步骤中,求值域(即孪生陪集或标准位置陪集)的规模同样可以减半,同时保持其陪集结构。这对于在递归的每一层支持基于这些域的类 FFT 操作而言至关重要。
5.1 陪集
让我们回顾一下群论中陪集的定义。假设 H H H 是群 G \mathcal{G} G 的子群,且设 Q ∈ G Q \in \mathcal{G} Q ∈ G 。那么 H H H 关于 Q Q Q 的左陪集就是集合
Q ⋅ H = { Q ⋅ h ∣ h ∈ H } . Q \,\cdot\, H
\;=\;
\{\,Q \cdot h \;\mid\; h \in H\}. Q ⋅ H = { Q ⋅ h ∣ h ∈ H } .
如果 Q ∈ H Q \in H Q ∈ H ,那么 Q ⋅ H = H Q \cdot H = H Q ⋅ H = H 。否则,在 Q ∉ H Q \notin H Q ∈ / H 的情况下,Q ⋅ H Q \cdot H Q ⋅ H 是一个与 H H H 不相交的集合,但仍具有与 H H H 相同的大小。这之所以成立,是因为如果 Q ∈ H Q \in H Q ∈ H ,群运算下 H H H 的封闭性确保了 Q ⋅ H = H Q \cdot H = H Q ⋅ H = H ;而如果 Q ∉ H Q \notin H Q ∈ / H ,则 Q ⋅ H Q \cdot H Q ⋅ H 中的任何元素都不能在 H H H 中(否则暗示 Q ∈ H Q \in H Q ∈ H ),同时双射 h ↦ Q ⋅ h h \mapsto Q \cdot h h ↦ Q ⋅ h 保证了大小的一致。
在我们特定的设定中,G = C ( F p ) \mathcal{G} = C(\mathbb{F}_p) G = C ( F p ) ,它是大小为 p + 1 p+1 p + 1 的循环群。从上一节我们知道,存在一条子群链 G 0 ⊂ G 1 ⊂ ⋯ ⊂ G m G_0 \subset G_1 \subset \dots \subset G_m G 0 ⊂ G 1 ⊂ ⋯ ⊂ G m ,其中 ∣ G k ∣ = 2 k |G_k| = 2^k ∣ G k ∣ = 2 k 。
因此,举例来说,如果我们固定阶为 2 n − 1 2^{n-1} 2 n − 1 的 G n − 1 G_{n-1} G n − 1 ,那么对于圆上的任意点 Q Q Q ,陪集
Q ⋅ G n − 1 = { Q ⋅ g ∣ g ∈ G n − 1 } Q \,\cdot\, G_{n-1}
\;=\;
\bigl\{Q\cdot g \;\mid\; g\in G_{n-1}\bigr\} Q ⋅ G n − 1 = { Q ⋅ g ∣ g ∈ G n − 1 }
被称为 G n − 1 G_{n-1} G n − 1 的一个陪集。
该集合将拥有相同的基数 2 n − 1 2^{n-1} 2 n − 1 ,并且除非 Q Q Q 本身已经属于 G n − 1 G_{n-1} G n − 1 ,否则它与 G n − 1 G_{n-1} G n − 1 本身是不相交的。
5.1.1 陪集示例
让我们快速说明一下这个示例。在 p = 31 p=31 p = 31 的情况下,回想一下 p + 1 = 32 = 2 5 p+1=32=2^5 p + 1 = 32 = 2 5 ,所以存在子群链 G 1 , G 2 , … , G 5 G_1, G_2, \dots, G_5 G 1 , G 2 , … , G 5 ,其中 ∣ G 1 ∣ = 2 |G_1|=2 ∣ G 1 ∣ = 2 。具体而言,
G 1 = { ( 1 , 0 ) , ( 30 , 0 ) } . G_1 \;=\; \{\,(1,0),\,(30,0)\}. G 1 = { ( 1 , 0 ) , ( 30 , 0 )} .
现在取一个不在 G 1 G_1 G 1 中的点 Q Q Q 。例如,
Q = ( 2 , 11 ) . Q \;=\; (2,\,11). Q = ( 2 , 11 ) .
既然 Q Q Q 不在 G 1 G_1 G 1 中,那么集合
Q ⋅ G 1 = { ( 2 , 11 ) ⋅ ( 1 , 0 ) , ( 2 , 11 ) ⋅ ( 30 , 0 ) } Q \,\cdot\, G_1
\;=\;
\{\,(2,11)\cdot(1,0),\,(2,11)\cdot(30,0)\} Q ⋅ G 1 = { ( 2 , 11 ) ⋅ ( 1 , 0 ) , ( 2 , 11 ) ⋅ ( 30 , 0 )}
将是 G 1 G_1 G 1 的一个不同陪集,与 G 1 G_1 G 1 自身不相交。
( 2 , 11 ) ⋅ ( 1 , 0 ) = ( 2 ⋅ 1 − 11 ⋅ 0 , 2 ⋅ 0 + 11 ⋅ 1 ) = ( 2 , 11 ) , (2,11)\cdot(1,0)
\;=\;
(\,2\cdot1 - 11\cdot0,\;\;2\cdot0 + 11\cdot1)
\;=\;
(2,\,11), ( 2 , 11 ) ⋅ ( 1 , 0 ) = ( 2 ⋅ 1 − 11 ⋅ 0 , 2 ⋅ 0 + 11 ⋅ 1 ) = ( 2 , 11 ) ,
( 2 , 11 ) ⋅ ( 30 , 0 ) = ( 2 ⋅ 30 − 11 ⋅ 0 , 2 ⋅ 0 + 30 ⋅ 11 ) ≡ ( 29 , 20 ) ( m o d 31 ) . (2,11)\cdot(30,0)
\;=\;
(\,2\cdot30 - 11\cdot0,\;\;2\cdot0 + 30\cdot11)
\;\equiv\;
(29,\,20)
\;\pmod{31}. ( 2 , 11 ) ⋅ ( 30 , 0 ) = ( 2 ⋅ 30 − 11 ⋅ 0 , 2 ⋅ 0 + 30 ⋅ 11 ) ≡ ( 29 , 20 ) ( mod 31 ) .
因此,
Q ⋅ G 1 = { ( 2 , 11 ) , ( 29 , 20 ) } , Q \cdot G_1
\;=\;
\{(2,\,11),\,(29,\,20)\}, Q ⋅ G 1 = {( 2 , 11 ) , ( 29 , 20 )} ,
其大小确实为 2。这是对应于 Q = ( 2 , 11 ) Q=(2,11) Q = ( 2 , 11 ) 的 G 1 G_1 G 1 的陪集,它显然不同于子群 G 1 G_1 G 1 本身。
5.2 孪生陪集
现在,我们通过合并两个陪集来定义一个孪生陪集:Q ⋅ G n − 1 Q \cdot G_{n-1} Q ⋅ G n − 1 及其逆向陪集 Q − 1 ⋅ G n − 1 Q^{-1} \cdot G_{n-1} Q − 1 ⋅ G n − 1 。具体来说,设
D = ( Q ⋅ G n − 1 ) ∪ ( Q − 1 ⋅ G n − 1 ) . D \;=\;
\bigl(Q \,\cdot\, G_{n-1}\bigr)
\;\cup\;
\bigl(Q^{-1} \,\cdot\, G_{n-1}\bigr). D = ( Q ⋅ G n − 1 ) ∪ ( Q − 1 ⋅ G n − 1 ) .
如果满足以下条件,我们就说 D D D 是一个大小为 2 n 2^n 2 n 的孪生陪集:
不相交性 (Disjointness)
两个陪集 Q ⋅ G n − 1 Q \cdot G_{n-1} Q ⋅ G n − 1 和 Q − 1 ⋅ G n − 1 Q^{-1} \cdot G_{n-1} Q − 1 ⋅ G n − 1 是不相交的。
实际上,这种不相交性等价于确保 Q 2 ∉ G n − 1 Q^2 \notin G_{n-1} Q 2 ∈ / G n − 1 。这种等价性源于陪集的性质。如果 Q 2 ∈ G n − 1 Q^2 \in G_{n-1} Q 2 ∈ G n − 1 ,那么 Q = Q − 1 ⋅ Q 2 Q = Q^{-1} \cdot Q^2 Q = Q − 1 ⋅ Q 2 将同时位于 Q ⋅ G n − 1 Q \cdot G_{n-1} Q ⋅ G n − 1 和 Q − 1 ⋅ G n − 1 Q^{-1} \cdot G_{n-1} Q − 1 ⋅ G n − 1 中(出现重叠)。反之,如果两个陪集不重叠,那么 Q Q Q 不能被写为 Q − 1 ⋅ g Q^{-1} \cdot g Q − 1 ⋅ g (对任意的 g ∈ G n − 1 g \in G_{n-1} g ∈ G n − 1 ),这意味着 Q 2 ∉ G n − 1 Q^2 \notin G_{n-1} Q 2 ∈ / G n − 1 。
在对合映射 J J J 下没有不动点
如果 f ( P ) = P f(P) = P f ( P ) = P ,则点 P P P 被称为映射 f f f 的不动点。在我们的案例中,我们考虑的是对合映射 J ( x , y ) = ( x , − y ) . J(x,y) \;=\; \bigl(x,\;-y\bigr). J ( x , y ) = ( x , − y ) .
如果 D D D 中包含任何 y = 0 y=0 y = 0 的点,那么 J ( x , 0 ) = ( x , 0 ) J(x,0) = (x,0) J ( x , 0 ) = ( x , 0 ) 将保持不变。这就是一个不动点。我们希望避免在 D D D 中出现这样的点,因为根据定义,孪生陪集排除了 J J J 的任何不动点。
在这些条件下,每个陪集 Q ⋅ G n − 1 Q \cdot G_{n-1} Q ⋅ G n − 1 和 Q − 1 ⋅ G n − 1 Q^{-1} \cdot G_{n-1} Q − 1 ⋅ G n − 1 都各有 2 n − 1 2^{n-1} 2 n − 1 个不同的点,这让 D D D 的总点数达到 2 n 2^n 2 n 。直观地说,我们将一个陪集与其逆向陪集合并,从而形成一个拥有 2 n 2^n 2 n 个元素的域。
5.2.1 孪生陪集示例
接续第 5.1.1 节中的陪集示例(当时我们选择了一个不在 G 1 G_1 G 1 中的 Q = ( 2 , 11 ) Q=(2,11) Q = ( 2 , 11 ) ),现在我们来构建一个大小为 2 n = 2 2 = 4 2^n = 2^2 = 4 2 n = 2 2 = 4 的孪生陪集。我们已经看到:
Q ⋅ G 1 = { ( 2 , 11 ) , ( 29 , 20 ) } . Q \cdot G_1
\;=\;
\{(2,\,11),\,(29,\,20)\}. Q ⋅ G 1 = {( 2 , 11 ) , ( 29 , 20 )} .
接着,计算 Q − 1 = ( 2 , 20 ) Q^{-1}=(2,\,20) Q − 1 = ( 2 , 20 ) 并形成陪集 Q − 1 ⋅ G 1 Q^{-1}\cdot G_1 Q − 1 ⋅ G 1 :
Q − 1 ⋅ G 1 = { ( 2 , 20 ) ⋅ ( 1 , 0 ) , ( 2 , 20 ) ⋅ ( 30 , 0 ) } Q^{-1} \,\cdot\, G_1
\;=\;
\{\,(2,20)\cdot(1,0),\,(2,20)\cdot(30,0)\} Q − 1 ⋅ G 1 = { ( 2 , 20 ) ⋅ ( 1 , 0 ) , ( 2 , 20 ) ⋅ ( 30 , 0 )}
( 2 , 20 ) ⋅ ( 1 , 0 ) = ( 2 ⋅ 1 − 20 ⋅ 0 , 2 ⋅ 0 + 1 ⋅ 20 ) = ( 2 , 20 ) . (2,20)\cdot(1,0)\;=\;\bigl(2\cdot1 \;-\;20\cdot0,\;\;2\cdot0 \;+\;1\cdot20\bigr)\;=\;(2,\,20). ( 2 , 20 ) ⋅ ( 1 , 0 ) = ( 2 ⋅ 1 − 20 ⋅ 0 , 2 ⋅ 0 + 1 ⋅ 20 ) = ( 2 , 20 ) .
( 2 , 20 ) ⋅ ( 30 , 0 ) = ( 2 ⋅ 30 − 20 ⋅ 0 , 2 ⋅ 0 + 30 ⋅ 20 ) = ( 60 , 600 ) ≡ ( 29 , 11 ) ( m o d 31 ) . (2,20)\cdot(30,0)\;=\;\bigl(2\cdot30 \;-\;20\cdot0,\;\;2\cdot0 \;+\;30\cdot20\bigr)\;=\;(60,\,600)\;\equiv\;(29,\,11)\;\pmod{31}. ( 2 , 20 ) ⋅ ( 30 , 0 ) = ( 2 ⋅ 30 − 20 ⋅ 0 , 2 ⋅ 0 + 30 ⋅ 20 ) = ( 60 , 600 ) ≡ ( 29 , 11 ) ( mod 31 ) .
因此,
Q − 1 ⋅ G 1 = { ( 2 , 20 ) , ( 29 , 11 ) } . Q^{-1}\cdot G_1
\;=\;
\{(2,\,20),\,(29,\,11)\}. Q − 1 ⋅ G 1 = {( 2 , 20 ) , ( 29 , 11 )} .
进行并集操作,孪生陪集为:
D = ( Q ⋅ G 1 ) ∪ ( Q − 1 ⋅ G 1 ) = { ( 2 , 11 ) , ( 29 , 20 ) } ∪ { ( 2 , 20 ) , ( 29 , 11 ) } . D
\;=\;
\bigl(Q \cdot G_1\bigr)
\;\cup\;
\bigl(Q^{-1}\cdot G_1\bigr)
\;=\;
\{(2,\,11),\,(29,\,20)\}
\;\cup\;
\{(2,\,20),\,(29,\,11)\}. D = ( Q ⋅ G 1 ) ∪ ( Q − 1 ⋅ G 1 ) = {( 2 , 11 ) , ( 29 , 20 )} ∪ {( 2 , 20 ) , ( 29 , 11 )} .
这个域 D D D 大小为 4,并且满足孪生陪集条件:两个陪集是不相交的(因为 Q 2 ∉ G 1 Q^2\notin G_1 Q 2 ∈ / G 1 ),并且 D D D 里面不包含任何 y = 0 y=0 y = 0 的点,因此在对合映射 J ( x , y ) = ( x , − y ) J(x,y)=(x,-y) J ( x , y ) = ( x , − y ) 下没有不动点。所以,D D D 确实是一个大小为 2 2 = 4 2^2=4 2 2 = 4 的孪生陪集。
5.3 标准位置陪集
标准位置陪集是大小为 2 n 2^n 2 n 的一种特殊类型的孪生陪集 D D D ,它同时巧合地等同于子群 G n G_n G n 的单个陪集:
D = Q ⋅ G n − 1 ∪ Q − 1 ⋅ G n − 1 = Q ⋅ G n . D \;=\;
Q \cdot G_{n-1}
\;\cup\;
Q^{-1}\cdot G_{n-1}
\;=\;
Q \cdot G_n. D = Q ⋅ G n − 1 ∪ Q − 1 ⋅ G n − 1 = Q ⋅ G n .
在这里,回忆一下 G n G_n G n 是 C ( F p ) C(\mathbb{F}_p) C ( F p ) 中阶为 2 n 2^n 2 n 的唯一子群,就像第 3 节中介绍的那样。我们拥有如下的子群链:
G 0 ⊂ G 1 ⊂ ⋯ ⊂ G n ⊂ ⋯ ⊂ C ( F p ) , G_0 \subset G_1 \subset \dots \subset G_n \subset \dots \subset C(\mathbb{F}_p), G 0 ⊂ G 1 ⊂ ⋯ ⊂ G n ⊂ ⋯ ⊂ C ( F p ) ,
并且每个 G k G_k G k 的大小都为 2 k 2^k 2 k 。因此,G n G_n G n 包含了 G n − 1 G_{n-1} G n − 1 ,并且我们将使用一个阶为 2 n + 1 2^{n+1} 2 n + 1 的点 Q Q Q 来关联这些子群的陪集。
让我们逐步拆解:
首先,因为 G n − 1 ⊂ G n G_{n-1} \subset G_n G n − 1 ⊂ G n ,我们可以将 G n G_n G n 视为由 G n − 1 G_{n-1} G n − 1 的两个不相交的陪集组成,也就是:
G n = G n − 1 ∪ R ⋅ G n − 1 , 其中 R ∉ G n − 1 . G_n = G_{n-1} \cup R \cdot G_{n-1},\quad \text{其中 } R \notin G_{n-1}. G n = G n − 1 ∪ R ⋅ G n − 1 , 其中 R ∈ / G n − 1 .
如果我们现在用一个固定且阶为 2 n + 1 2^{n+1} 2 n + 1 的点 Q Q Q 乘以它,我们得到:
Q ⋅ G n = Q ⋅ G n − 1 ∪ Q ⋅ R ⋅ G n − 1 . Q \cdot G_n = Q \cdot G_{n-1} \cup Q \cdot R \cdot G_{n-1}. Q ⋅ G n = Q ⋅ G n − 1 ∪ Q ⋅ R ⋅ G n − 1 .
结果表明 Q ⋅ R = Q − 1 Q \cdot R = Q^{-1} Q ⋅ R = Q − 1 ,因此:
Q ⋅ G n = Q ⋅ G n − 1 ∪ Q − 1 ⋅ G n − 1 . Q \cdot G_n = Q \cdot G_{n-1} \cup Q^{-1} \cdot G_{n-1}. Q ⋅ G n = Q ⋅ G n − 1 ∪ Q − 1 ⋅ G n − 1 .
因此,陪集 Q ⋅ G n Q \cdot G_n Q ⋅ G n 可以写作两个不相交陪集的并集:一个基于 Q Q Q ,另一个基于 Q − 1 Q^{-1} Q − 1 ,且两者都是在较小的子群 G n − 1 G_{n-1} G n − 1 之上。这恰好就是孪生陪集的定义。
但并非所有的孪生陪集都是这样产生的。为了确保这种构建正常运作,我们需要:
不相交性:Q 2 ∉ G n − 1 Q^2 \notin G_{n-1} Q 2 ∈ / G n − 1 。否则,这两个陪集会重叠。
对合下没有不动点:生成集合 D D D 必须避免含有 y = 0 y = 0 y = 0 的点,以便让对合映射 J ( x , y ) = ( x , − y ) J(x, y) = (x, -y) J ( x , y ) = ( x , − y ) 在 D D D 中没有不动点。
正确的阶:Q Q Q 的阶必须是 2 n + 1 2^{n+1} 2 n + 1 ,以保证 Q ⋅ G n Q \cdot G_n Q ⋅ G n 能够覆盖整整 2 n 2^n 2 n 个不同的元素。
当这些条件被满足时,陪集 D = Q ⋅ G n D = Q \cdot G_n D = Q ⋅ G n 会给出一个标准位置陪集:它是一个大小为 2 n 2^n 2 n 的域,同时既是一个孪生陪集,也是一个较大子群的单个陪集。
5.4 手算示例:p = 31 p=31 p = 31 时的孪生陪集与标准位置陪集
以下,我们展示在 p = 31 p=31 p = 31 时如何应用孪生陪集和标准位置陪集的概念。由于 p + 1 = 32 = 2 5 p+1=32=2^5 p + 1 = 32 = 2 5 ,所以存在子群 G 1 , G 2 , G 3 , G 4 , G 5 G_1,\,G_2,\,G_3,\,G_4,\,G_5 G 1 , G 2 , G 3 , G 4 , G 5 ,其中 ∣ G 3 ∣ = 8 |G_3|=8 ∣ G 3 ∣ = 8 以及 ∣ G 2 ∣ = 4 |G_2|=4 ∣ G 2 ∣ = 4 。我们将展示 G 3 G_3 G 3 的标准位置陪集为 D = Q ⋅ G 2 ∪ Q − 1 ⋅ G 2 = Q ⋅ G 3 D=Q \cdot G_2 \;\cup\; Q^{-1} \cdot G_2=Q \cdot G_3 D = Q ⋅ G 2 ∪ Q − 1 ⋅ G 2 = Q ⋅ G 3 。
5.4.1 孪生陪集构建
设定
令 n = 3 n=3 n = 3 。那么 G 2 G_2 G 2 大小为 4。选择一个阶为 16 的点 Q Q Q (所以 Q ∉ G 3 Q\notin G_3 Q ∈ / G 3 ,但 Q ∈ G 4 Q \in G_4 Q ∈ G 4 )。具体来说,我们可以选择 Q = ( 13 , 7 ) Q = (13,\,7) Q = ( 13 , 7 )
形成孪生陪集
D = ( Q ⋅ G 2 ) ∪ ( Q − 1 ⋅ G 2 ) . D=
\bigl(Q \cdot G_2\bigr)
\;\cup\;
\bigl(Q^{-1}\cdot G_2\bigr). D = ( Q ⋅ G 2 ) ∪ ( Q − 1 ⋅ G 2 ) .
因为 G 2 G_2 G 2 有 ( 1 , 0 ) (1,0) ( 1 , 0 ) , ( 0 , 30 ) (0,30) ( 0 , 30 ) , ( 30 , 0 ) (30,0) ( 30 , 0 ) , 和 ( 0 , 1 ) (0,1) ( 0 , 1 ) 四个点,每一个点都要乘以 Q = ( 13 , 7 ) Q = (13,\,7) Q = ( 13 , 7 ) 或者是 Q − 1 = ( 13 , 24 ) Q^{-1}=(13,24) Q − 1 = ( 13 , 24 ) 。
Q ⋅ ( 1 , 0 ) = ( 13 , 7 ) Q \cdot (1,0)=(13,7) Q ⋅ ( 1 , 0 ) = ( 13 , 7 ) ,
Q ⋅ ( 0 , 30 ) = ( 7 , 18 ) Q \cdot (0,30)=(7,18) Q ⋅ ( 0 , 30 ) = ( 7 , 18 ) ,
Q ⋅ ( 30 , 0 ) = ( 18 , 24 ) Q \cdot (30,0)=(18,24) Q ⋅ ( 30 , 0 ) = ( 18 , 24 ) ,
Q ⋅ ( 0 , 1 ) = ( 24 , 13 ) Q \cdot (0,1)=(24,13) Q ⋅ ( 0 , 1 ) = ( 24 , 13 ) ,
Q − 1 ⋅ ( 1 , 0 ) = ( 13 , 24 ) Q^{-1}\cdot(1,0)=(13,24) Q − 1 ⋅ ( 1 , 0 ) = ( 13 , 24 ) ,
Q − 1 ⋅ ( 0 , 30 ) = ( 24 , 18 ) Q^{-1}\cdot(0,30)=(24,18) Q − 1 ⋅ ( 0 , 30 ) = ( 24 , 18 ) ,
Q − 1 ⋅ ( 30 , 0 ) = ( 18 , 7 ) Q^{-1}\cdot(30,0)=(18,7) Q − 1 ⋅ ( 30 , 0 ) = ( 18 , 7 ) ,
Q − 1 ⋅ ( 0 , 1 ) = ( 7 , 13 ) Q^{-1}\cdot(0,1)=(7,13) Q − 1 ⋅ ( 0 , 1 ) = ( 7 , 13 ) 。
D = ( Q ⋅ G 2 ) ∪ ( Q − 1 ⋅ G 2 ) = { ( 13 , 7 ) , ( 7 , 18 ) , ( 18 , 24 ) , ( 24 , 13 ) , ( 13 , 24 ) , ( 24 , 18 ) , ( 18 , 7 ) , ( 7 , 13 ) } D=
\bigl(Q \cdot G_2\bigr)
\;\cup\;
\bigl(Q^{-1}\cdot G_2\bigr)=
\{(13,7),(7,18),(18,24),(24,13),(13,24),(24,18),(18,7),(7,13)\} D = ( Q ⋅ G 2 ) ∪ ( Q − 1 ⋅ G 2 ) = {( 13 , 7 ) , ( 7 , 18 ) , ( 18 , 24 ) , ( 24 , 13 ) , ( 13 , 24 ) , ( 24 , 18 ) , ( 18 , 7 ) , ( 7 , 13 )}
合并这些点可以给出 8 个不同的点。没有 D D D 中的元素被 J J J 所固定,因此 D D D 是一个大小为 2 3 = 8 2^3=8 2 3 = 8 的孪生陪集。合并这些就得到了 8 个不同的点。由于 D D D 中的所有元素都不在 J J J 的映射下产生不动点,因此 D D D 是一个大小为 2 3 = 8 2^3 = 8 2 3 = 8 的孪生陪集。
在下方图表中,🔴 红点表示 Q ⋅ G 2 Q \cdot G_2 Q ⋅ G 2 ,而 🔵 蓝点表示 Q − 1 ⋅ G 2 Q^{-1} \cdot G_2 Q − 1 ⋅ G 2 。它们合在一起形成了 8 个点的孪生陪集 D D D 。
5.4.2 检查标准位置陪集
对于某个大小为 8 的子群 G 3 G_3 G 3 ,这个相同的 D D D 同样也等于 Q ⋅ G 3 Q\cdot G_3 Q ⋅ G 3 ,这意味着 D D D 是一个标准位置陪集。
G 3 G_3 G 3 是子群 { ( 1 , 0 ) , ( 4 , 27 ) , ( 0 , 30 ) , ( 27 , 27 ) , ( 30 , 0 ) , ( 27 , 4 ) , ( 0 , 1 ) , ( 4 , 4 ) } \{(1,0),(4,27),(0,30),(27,27),(30,0),(27,4),(0,1),(4,4)\} {( 1 , 0 ) , ( 4 , 27 ) , ( 0 , 30 ) , ( 27 , 27 ) , ( 30 , 0 ) , ( 27 , 4 ) , ( 0 , 1 ) , ( 4 , 4 )} ,那么将它的每个元素与 Q = ( 13 , 7 ) Q=(13,7) Q = ( 13 , 7 ) 相乘正好产生 D D D 中的这 8 个点。
Q ⋅ ( 1 , 0 ) = ( 13 , 7 ) Q \cdot (1,\,0) = (13,\,7) Q ⋅ ( 1 , 0 ) = ( 13 , 7 )
Q ⋅ ( 4 , 27 ) = ( 18 , 7 ) Q \cdot (4,\,27) = (18,\,7) Q ⋅ ( 4 , 27 ) = ( 18 , 7 )
Q ⋅ ( 0 , 30 ) = ( 7 , 18 ) Q \cdot (0,\,30) = (7,\,18) Q ⋅ ( 0 , 30 ) = ( 7 , 18 )
Q ⋅ ( 27 , 27 ) = ( 7 , 13 ) Q \cdot (27,\,27) = (7,\,13) Q ⋅ ( 27 , 27 ) = ( 7 , 13 )
Q ⋅ ( 30 , 0 ) = ( 18 , 24 ) Q \cdot (30,\,0) = (18,\,24) Q ⋅ ( 30 , 0 ) = ( 18 , 24 )
Q ⋅ ( 27 , 4 ) = ( 13 , 24 ) Q \cdot (27,\,4) = (13,\,24) Q ⋅ ( 27 , 4 ) = ( 13 , 24 )
Q ⋅ ( 0 , 1 ) = ( 24 , 13 ) Q \cdot (0,\,1) = (24,\,13) Q ⋅ ( 0 , 1 ) = ( 24 , 13 )
Q ⋅ ( 4 , 4 ) = ( 24 , 18 ) Q \cdot (4,\,4) = (24,\,18) Q ⋅ ( 4 , 4 ) = ( 24 , 18 )
Q ⋅ G 3 = { ( 13 , 7 ) , ( 18 , 7 ) , ( 7 , 18 ) , ( 7 , 13 ) , ( 18 , 24 ) , ( 13 , 24 ) , ( 24 , 13 ) , ( 24 , 18 ) } . Q \cdot G_3
\;=\;
\{
(13,7),\,(18,7),\,(7,18),\,(7,13),
(18,24),\,(13,24),\,(24,13),\,(24,18)
\}. Q ⋅ G 3 = {( 13 , 7 ) , ( 18 , 7 ) , ( 7 , 18 ) , ( 7 , 13 ) , ( 18 , 24 ) , ( 13 , 24 ) , ( 24 , 13 ) , ( 24 , 18 )} .
因此
D = Q ⋅ G 3 = Q ⋅ G 2 ∪ Q − 1 ⋅ G 2 . D=
Q\cdot G_3 =
Q\cdot G_2
\;\cup\;
Q^{-1}\cdot G_2. D = Q ⋅ G 3 = Q ⋅ G 2 ∪ Q − 1 ⋅ G 2 .
因为 D D D 同时是 G 2 G_2 G 2 的一个孪生陪集,也是 G 3 G_3 G 3 的单个陪集,所以我们称其为大小为 8 的标准位置陪集。
在下方图表中,🟢 绿点表示子群 G 3 G_3 G 3 ,🔴 红点和 🔵 蓝点分别表示两个不相交的陪集 Q ⋅ G 2 Q \cdot G_2 Q ⋅ G 2 和 Q − 1 ⋅ G 2 Q^{-1} \cdot G_2 Q − 1 ⋅ G 2 。它们的并集形成了孪生陪集 D D D ,并且整个由 8 个点组成的集合构成了标准位置陪集 Q ⋅ G 3 Q \cdot G_3 Q ⋅ G 3 。
因此,只要 Q Q Q 的阶是 2 n + 1 2^{n+1} 2 n + 1 ,我们就可以建立一个大小为 2 n 2^n 2 n 的标准位置陪集。这种结构在 Circle STARK 中非常重要,因为即使 p − 1 p-1 p − 1 不具备充足的 2-adicity,它依然能够提供一个整齐的有 2 n 2^n 2 n 个点的域。
6. Python 代码 2:Circle Domain
我们现在将通过简单的 Python 实现来回顾 Circle Domain 代码。该域的构建(比如孪生陪集和标准位置陪集)同样在相同的 Python 笔记本 中得到了实现。你可以运行它并一步一步检查这些集合是如何建立的。
6.1 孪生陪集
这个函数通过对子群上的 Q Q Q 及其逆 Q − 1 Q^{-1} Q − 1 应用群运算 add 来生成域,以确保对称性和规模 2 n 2^n 2 n 。
Copy def generate_twin_coset (Q, G_n_minus_1):
"""Generate twin-coset: D = Q・G_(n-1) ∪ Q^{-1}・G_(n-1)."""
Q_inv = Q.inverse()
coset_Q = [Q.add(g) for g in G_n_minus_1]
coset_Q_inv = [Q_inv.add(g) for g in G_n_minus_1]
return coset_Q + coset_Q_inv
G2 = generate_subgroup( 2 )
Q = CirclePoint(FieldElement( 13 ), FieldElement( 7 ))
twin_cosets = generate_twin_coset(Q, G2)
print (twin_cosets)
Copy [Point( 13 , 7 ), Point( 7 , 18 ), Point( 18 , 24 ), Point( 24 , 13 ), Point( 13 , 24 ), Point( 24 , 18 ), Point( 18 , 7 ), Point( 7 , 13 )]
6.2 标准位置陪集
这个函数通过对 Q Q Q 和子群应用群运算 add 来生成标准位置陪集。
Copy def generate_standard_position_coset (Q, G_n):
"""Generate standard position coset D = Q・G_n."""
return [Q.add(g) for g in G_n]
G3 = generate_subgroup( 3 )
Q = CirclePoint(FieldElement( 13 ), FieldElement( 7 ))
D = generate_standard_position_coset(Q, G3)
Copy [Point( 13 , 7 ), Point( 18 , 7 ), Point( 7 , 18 ), Point( 7 , 13 ), Point( 18 , 24 ), Point( 13 , 24 ), Point( 24 , 13 ), Point( 24 , 18 )]
通过这部分代码,你可以检查标准位置陪集 D = Q ⋅ G n − 1 ∪ Q − 1 ⋅ G n − 1 = Q ⋅ G n . D \;=\;Q \,\cdot\, G_{n-1}\;\cup\;Q^{-1} \,\cdot\, G_{n-1}\;=\;Q \,\cdot\, G_n. D = Q ⋅ G n − 1 ∪ Q − 1 ⋅ G n − 1 = Q ⋅ G n . 的等价性:
Copy D_std = generate_standard_position_coset(Q, G3)
D_twin = generate_twin_coset(Q, G2)
print ( "Q・G3:" , D_std)
print ( "(Q・G2) ∪ (Q^-1・G2):" , D_twin)
if set (D_std) == set (D_twin):
print ( "Equal: standard position coset Q·G3 = Q·G2 ∪ Q^-1·G2" )
else :
print ( "Not Equal" )
7. 将较大的标准位置陪集分解为较小的孪生陪集
在 Circle FFT 和 FRI 的许多步骤中,我们需要管理各种不同大小的求值域,并且所有这些域都位于 Circle 曲线上。实现这一点的一项关键方法源于 Circle STARKs 论文 中的引理 2,该引理确保一个大小为 2 m 2^m 2 m 的标准位置陪集能够分解为任意 n ≤ m n \le m n ≤ m 大小为 2 n 2^n 2 n 的较小孪生陪集。
7.1 引理 2 声明
设 D ⊂ C ( F p ) D \subset C(\mathbb{F}_p) D ⊂ C ( F p ) 为一个大小为 2 m 2^m 2 m 的标准位置陪集。那么对于任意 n ≤ m n \le m n ≤ m ,都可以将 D D D 分解为大小为 2 n 2^n 2 n 的孪生陪集。具体来说,如果
D = Q ⋅ G m 其中 ∣ G m ∣ = 2 m , D \;=\; Q \cdot G_m
\quad \text{其中}\quad
|G_m| = 2^m, D = Q ⋅ G m 其中 ∣ G m ∣ = 2 m ,
那么
D = ⋃ k = 0 ( 2 m 2 n ) − 1 ( Q 4 k + 1 ⋅ G n − 1 ∪ Q − ( 4 k + 1 ) ⋅ G n − 1 ) D = \bigcup_{k=0}^{\left(\frac{2^m}{2^n}\right)-1} \Bigl( Q^{4k+1} \cdot G_{n-1} \cup Q^{-(4k+1)} \cdot G_{n-1} \Bigr) D = k = 0 ⋃ ( 2 n 2 m ) − 1 ( Q 4 k + 1 ⋅ G n − 1 ∪ Q − ( 4 k + 1 ) ⋅ G n − 1 )
用更简单的话来说,如果 D D D 是一个大小为 2 m 2^m 2 m 的标准位置陪集,我们可以使用 Q Q Q 的幂次把它切片成更小的孪生陪集(每个大小为 2 n 2^n 2 n )。这种划分允许大家精确构造出 Circle FFT 协议某一步中所需的那部分 D D D 。
7.2 手算示例:将大小为 8 的标准位置陪集拆分为 2 个大小为 4 的孪生陪集
假设 p = 31 p = 31 p = 31 ,所以 p + 1 = 32 = 2 5 p+1 = 32 = 2^5 p + 1 = 32 = 2 5 。我们存在子群 G 1 , G 2 , G 3 , … G_1, G_2, G_3, \dots G 1 , G 2 , G 3 , … ,其中 ∣ G 3 ∣ = 8 \lvert G_3\rvert=8 ∣ G 3 ∣ = 8 。
我们的标准位置陪集
令 D = Q ⋅ G 3 D = Q \cdot G_3 D = Q ⋅ G 3 ,具有 ∣ D ∣ = 8 \lvert D\rvert=8 ∣ D ∣ = 8 。这里,Q Q Q 的阶为 16 16 16 ,意思是 Q ∉ G 3 Q\notin G_3 Q ∈ / G 3 ,但 Q ⋅ G 3 Q \cdot G_3 Q ⋅ G 3 形成了一个大小为 8 8 8 的陪集。
D = ( Q ⋅ G 2 ) ∪ ( Q − 1 ⋅ G 2 ) = Q ⋅ G 3 = { ( 13 , 7 ) , ( 7 , 18 ) , ( 18 , 24 ) , ( 24 , 13 ) , ( 13 , 24 ) , ( 24 , 18 ) , ( 18 , 7 ) , ( 7 , 13 ) } D=
\bigl(Q \cdot G_2\bigr)
\;\cup\;
\bigl(Q^{-1}\cdot G_2\bigr)= Q\cdot G_3 =
\{(13,7),(7,18),(18,24),(24,13),(13,24),(24,18),(18,7),(7,13)\} D = ( Q ⋅ G 2 ) ∪ ( Q − 1 ⋅ G 2 ) = Q ⋅ G 3 = {( 13 , 7 ) , ( 7 , 18 ) , ( 18 , 24 ) , ( 24 , 13 ) , ( 13 , 24 ) , ( 24 , 18 ) , ( 18 , 7 ) , ( 7 , 13 )}
目标
将 D D D 拆分为大小为 2 n = 4 2^n=4 2 n = 4 的孪生陪集。令 n = 2 n=2 n = 2 ,因此 ∣ G 2 ∣ = 4 \lvert G_2\rvert=4 ∣ G 2 ∣ = 4 且 ∣ G 1 ∣ = 2 \lvert G_1\rvert=2 ∣ G 1 ∣ = 2 。
那么引理 2 提示
D = ⋃ k = 0 ( 8 / 4 ) − 1 ( Q 4 k + 1 ⋅ G 1 ∪ Q − ( 4 k + 1 ) ⋅ G 1 ) . D=
\bigcup_{k=0}^{(8/4)-1}
\Bigl(
Q^{\,4k+1}\cdot G_{1}
\;\cup\;
Q^{-\,\bigl(4k+1\bigr)}\cdot G_{1}
\Bigr). D = k = 0 ⋃ ( 8/4 ) − 1 ( Q 4 k + 1 ⋅ G 1 ∪ Q − ( 4 k + 1 ) ⋅ G 1 ) .
因为 8 / 4 = 2 8/4=2 8/4 = 2 ,我们有 k = 0 k=0 k = 0 和 k = 1 k=1 k = 1 。
7.2.1 k = 0 k=0 k = 0 的情况
Q 4 ⋅ 0 + 1 = Q 1 = Q Q^{4\cdot0+1}=Q^1=Q Q 4 ⋅ 0 + 1 = Q 1 = Q 。
G 1 = { ( 1 , 0 ) , ( 30 , 0 ) } G_1=\{(1,0), (30,0)\} G 1 = {( 1 , 0 ) , ( 30 , 0 )} 。
计算:
Q ⋅ ( 1 , 0 ) = ( 13 , 7 ) Q\cdot(1,0) = (13,7) Q ⋅ ( 1 , 0 ) = ( 13 , 7 )
Q ⋅ ( 30 , 0 ) = ( 18 , 24 ) Q\cdot(30,0) = (18,24) Q ⋅ ( 30 , 0 ) = ( 18 , 24 )
Q − 1 ⋅ ( 1 , 0 ) = ( 13 , 24 ) Q^{-1}\cdot(1,0) = (13,24) Q − 1 ⋅ ( 1 , 0 ) = ( 13 , 24 )
Q − 1 ⋅ ( 30 , 0 ) = ( 18 , 7 ) Q^{-1}\cdot(30,0) = (18,7) Q − 1 ⋅ ( 30 , 0 ) = ( 18 , 7 )
因此,第一个孪生陪集拥有 4 个不同的点。
7.2.2 k = 1 k=1 k = 1 的情况
Q 4 ⋅ 1 + 1 = Q 5 Q^{4\cdot1+1} = Q^5 Q 4 ⋅ 1 + 1 = Q 5 。
也就是 Q 5 = ( 24 , 13 ) Q^5 = (24,13) Q 5 = ( 24 , 13 ) 。
同理,Q − 5 = ( 24 , − 13 ) ≡ ( 24 , 18 ) Q^{-5} = (24, -13)\equiv (24,18) Q − 5 = ( 24 , − 13 ) ≡ ( 24 , 18 ) 。
再次,用它们各自乘以 ( 1 , 0 ) (1,0) ( 1 , 0 ) 和 ( 30 , 0 ) (30,0) ( 30 , 0 ) :
Q 5 ⋅ ( 1 , 0 ) = ( 24 , 13 ) Q^5\cdot(1,0) = (24,13) Q 5 ⋅ ( 1 , 0 ) = ( 24 , 13 )
Q 5 ⋅ ( 30 , 0 ) = ( 7 , 18 ) Q^5\cdot(30,0) = (7,18) Q 5 ⋅ ( 30 , 0 ) = ( 7 , 18 )
Q − 5 ⋅ ( 1 , 0 ) = ( 24 , 18 ) Q^{-5}\cdot(1,0) = (24,18) Q − 5 ⋅ ( 1 , 0 ) = ( 24 , 18 )
Q − 5 ⋅ ( 30 , 0 ) = ( 7 , 13 ) Q^{-5}\cdot(30,0) = (7,13) Q − 5 ⋅ ( 30 , 0 ) = ( 7 , 13 )
这产生了另外 4 个点,形成了第二个大小为 4 的孪生陪集。
7.2.3 两个孪生陪集的并集
将两个 4 点集合(对应于 k = 0 k=0 k = 0 和 k = 1 k=1 k = 1 )进行并集操作,我们恢复了拥有 8 个元素的整个陪集 D D D 。因此:
D = ( Q 1 ⋅ G 1 ∪ Q − 1 ⋅ G 1 ) ∪ ( Q 5 ⋅ G 1 ∪ Q − 5 ⋅ G 1 ) . D=\Bigl(
Q^1 \cdot G_1 \;\cup\; Q^{-1} \cdot G_1
\Bigr)
\;\;\cup\;\;
\Bigl(
Q^5 \cdot G_1 \;\cup\; Q^{-5} \cdot G_1
\Bigr). D = ( Q 1 ⋅ G 1 ∪ Q − 1 ⋅ G 1 ) ∪ ( Q 5 ⋅ G 1 ∪ Q − 5 ⋅ G 1 ) .
这恰好与引理 2 的声明完全一致,展示了一个包含 8 个点的标准位置陪集是如何被分解为两个大小均为 4 的孪生陪集的。
7.3 手算示例:将大小为 8 的标准位置陪集拆分为 4 个大小为 2 的孪生陪集
我们同样可以将这个大小为 8 的标准位置陪集分成更多个更小的孪生陪集。
令 n = 1 n=1 n = 1 ,那么 ∣ G 1 ∣ = 2 \lvert G_1\rvert=2 ∣ G 1 ∣ = 2 。引理 2 给出:
D = ⋃ k = 0 ( 8 / 2 ) − 1 ( Q 4 k + 1 ⋅ G 0 ∪ Q − ( 4 k + 1 ) ⋅ G 0 ) . D = \bigcup_{k=0}^{(8/2)-1} \Bigl( Q^{4k+1}\cdot G_0 \;\cup\; Q^{-\,(4k+1)}\cdot G_0 \Bigr). D = k = 0 ⋃ ( 8/2 ) − 1 ( Q 4 k + 1 ⋅ G 0 ∪ Q − ( 4 k + 1 ) ⋅ G 0 ) .
由于 G 0 = { ( 1 , 0 ) } G_0 = \{(1,0)\} G 0 = {( 1 , 0 )} ,每个孪生陪集有 2 个点:
k = 0 k=0 k = 0 : { Q 1 ⋅ G 0 = Q , Q − 1 ⋅ G 0 = Q − 1 } \{Q^1 \cdot G_0 = Q, Q^{-1} \cdot G_0 = Q^{-1}\} { Q 1 ⋅ G 0 = Q , Q − 1 ⋅ G 0 = Q − 1 } = { ( 13 , 7 ) , ( 13 , 24 ) } =\{(13, 7), (13, 24)\} = {( 13 , 7 ) , ( 13 , 24 )}
k = 1 k=1 k = 1 : { Q 5 ⋅ G 0 = Q 5 , Q − 5 ⋅ G 0 = Q − 5 } \{Q^5 \cdot G_0 = Q^5, Q^{-5} \cdot G_0 = Q^{-5}\} { Q 5 ⋅ G 0 = Q 5 , Q − 5 ⋅ G 0 = Q − 5 } $
={(24, 13), (24, 18)}$
k = 2 k=2 k = 2 : ${Q^9 \cdot G_0 = Q^9, Q^{-9} \cdot G_0 = Q^{-9}}
$= { ( 18 , 24 ) , ( 18 , 7 ) } =\{(18, 24), (18, 7)\} = {( 18 , 24 ) , ( 18 , 7 )}
k = 3 k=3 k = 3 : { Q 13 ⋅ G 0 = Q 13 , Q − 13 ⋅ G 0 = Q − 13 } \{Q^{13} \cdot G_0 = Q^{13}, Q^{-13} \cdot G_0 = Q^{-13}\} { Q 13 ⋅ G 0 = Q 13 , Q − 13 ⋅ G 0 = Q − 13 } $
={(7, 18), (7, 13)}$
D = { ( 13 , 7 ) , ( 13 , 24 ) } ∪ { ( 24 , 13 ) , ( 24 , 18 ) } ∪ { ( 18 , 24 ) , ( 18 , 7 ) } ∪ { ( 7 , 18 ) , ( 7 , 13 ) } D = \{(13,7),(13,24)\} \cup \{(24,13),(24,18)\} \cup \{(18,24),(18,7)\} \cup \{(7,18),(7,13)\} D = {( 13 , 7 ) , ( 13 , 24 )} ∪ {( 24 , 13 ) , ( 24 , 18 )} ∪ {( 18 , 24 ) , ( 18 , 7 )} ∪ {( 7 , 18 ) , ( 7 , 13 )}
这把 D D D 分解成了四个大小为 2 2 2 的孪生陪集。
8. 平方映射将孪生陪集减半
引理 2 的重点是将大规模陪集拆分为较小的孪生陪集,而引理 3 则利用平方映射将一个孪生陪集的大小减半。该过程用于 Circle FFT 中的域减半步骤,在那里我们迭代地缩减域的规模。
8.1 引理 3 声明
该引理出现在 Circle STARKs 论文 中,用于形式化由平方映射支持的递归域减半机制。
假设 D D D 是一个大小为 2 n 2^n 2 n 的孪生陪集(且 n ≥ 2 n \ge 2 n ≥ 2 )。随后应用平方映射 π ( x , y ) = ( x 2 − y 2 , 2 x y ) \pi(x,y) = (x^2 - y^2,\,2xy) π ( x , y ) = ( x 2 − y 2 , 2 x y ) ,它将把 D D D 转化为另一个大小为 2 n − 1 2^{n-1} 2 n − 1 的孪生陪集 π ( D ) \pi(D) π ( D ) 。并且,如果 D D D 原本是一个标准位置陪集,那么 π ( D ) \pi(D) π ( D ) 也将保持作为一个标准位置陪集。
直观地说,π \pi π 是一个群自同态,它将子群 G n − 1 G_{n-1} G n − 1 映射到 G n − 2 G_{n-2} G n − 2 。由此,大小为 2 n 2^n 2 n 的孪生陪集自然能生成另一个大小为 2 n − 1 2^{n-1} 2 n − 1 的孪生陪集。
8.1.1 引理 3 证明的抽象视角
设 D D D 是大小为 2 n 2^n 2 n 的孪生陪集,这在抽象记法下意味着
D = Q ⋅ G n − 1 ∪ Q − 1 ⋅ G n − 1 , D =
Q \cdot G_{n-1}
\;\cup\;
Q^{-1}\cdot G_{n-1}, D = Q ⋅ G n − 1 ∪ Q − 1 ⋅ G n − 1 ,
其中 ∣ G n − 1 ∣ = 2 n − 1 |G_{n-1}| = 2^{n-1} ∣ G n − 1 ∣ = 2 n − 1 。
特别地,由于群自同态,π \pi π 将子群 G n − 1 G_{n-1} G n − 1 映射成了 G n − 2 G_{n-2} G n − 2 。
π ( D ) = π ( Q ⋅ G n − 1 ∪ Q − 1 ⋅ G n − 1 ) = ( π ( Q ) ⋅ G n − 2 ) ∪ ( π ( Q ) − 1 ⋅ G n − 2 ) . \pi(D)
\;=\;
\pi\!\Bigl(Q \cdot G_{n-1} \cup Q^{-1}\cdot G_{n-1}\Bigr)=
\bigl(\pi(Q) \cdot G_{n-2}\bigr)
\;\cup\;
\bigl(\pi(Q)^{-1} \cdot G_{n-2}\bigr). π ( D ) = π ( Q ⋅ G n − 1 ∪ Q − 1 ⋅ G n − 1 ) = ( π ( Q ) ⋅ G n − 2 ) ∪ ( π ( Q ) − 1 ⋅ G n − 2 ) .
这正好是子群 G n − 2 G_{n-2} G n − 2 (大小为 2 n − 2 2^{n-2} 2 n − 2 )上孪生陪集的定义。相应地,π ( D ) \pi(D) π ( D ) 本身就成了一个大小为 2 n − 1 2^{n-1} 2 n − 1 的孪生陪集。
如果 D D D 最初是标准位置陪集,那么应用 π \pi π 仍会保留该标准位置的性质,因为 π ( G n ) = G n − 1 \pi(G_n) = G_{n-1} π ( G n ) = G n − 1 。因此 π ( D ) \pi(D) π ( D ) 再次成为了一个标准位置陪集,但现在它的大小变成了 2 n − 1 2^{n-1} 2 n − 1 。
8.2 手算示例(将大小为 8 的孪生陪集减半到大小 4)
假设 p = 31 p=31 p = 31 且让 D D D 为一个大小为 2 3 = 8 2^3=8 2 3 = 8 的孪生陪集。具体而言,
D = Q ⋅ G 2 ∪ Q − 1 ⋅ G 2 其中 Q = ( 13 , 7 ) . D = Q\cdot G_2 \;\cup\; Q^{-1}\cdot G_2 \quad\text{其中}\quad Q=(13,7). D = Q ⋅ G 2 ∪ Q − 1 ⋅ G 2 其中 Q = ( 13 , 7 ) .
由于 ∣ G 2 ∣ = 4 \lvert G_2\rvert=4 ∣ G 2 ∣ = 4 ,所以有 ∣ D ∣ = 8 \lvert D\rvert=8 ∣ D ∣ = 8 。我们来检查 π \pi π 是如何影响 D D D 的:
8.2.1 计算 π ( Q ) \pi(Q) π ( Q ) 和 π ( Q − 1 ) \pi(Q^{-1}) π ( Q − 1 )
π ( Q ) = ( 13 2 − 7 2 , 2 ⋅ 13 ⋅ 7 ) = ( 27 , 27 ) , \pi(Q)=
\bigl(13^2 - 7^2,\;2\cdot13\cdot7\bigr)=
(27,\,27), π ( Q ) = ( 1 3 2 − 7 2 , 2 ⋅ 13 ⋅ 7 ) = ( 27 , 27 ) ,
π ( Q − 1 ) = ( 27 , 4 ) . \pi(Q^{-1})=
(27,\,4). π ( Q − 1 ) = ( 27 , 4 ) .
8.2.2 将 π \pi π 应用于 D D D
子群 G 1 G_1 G 1 的大小为 2,即 G 1 = { ( 1 , 0 ) , ( 30 , 0 ) } G_1 = \{(1,0), (30,0)\} G 1 = {( 1 , 0 ) , ( 30 , 0 )} 。根据引理 3,
π ( D ) = ( π ( Q ) ⋅ G 1 ) ∪ ( π ( Q ) − 1 ⋅ G 1 ) . \pi(D) =
\bigl(\pi(Q)\cdot G_1\bigr)
\cup
\bigl(\pi(Q)^{-1}\cdot G_1\bigr). π ( D ) = ( π ( Q ) ⋅ G 1 ) ∪ ( π ( Q ) − 1 ⋅ G 1 ) .
$$
\begin{align*}
\pi(Q)\cdot(1,0) &= (27,27)\
\pi(Q)\cdot(30,0) &= (4,4)\
\pi(Q^{-1})\cdot(1,0) &= (27,4)\
\pi(Q^{-1})\cdot(30,0) &= (4,27)
\end{align*}
{(27,27), (4,4)}
\cup
{(27,4), (4,27)}$$
这就是一个大小为 4 的孪生陪集。
因此,π \pi π 将 D D D 从 8 个元素减半到了 4 个元素,恰如引理 3 所述。重复应用 π \pi π 继续以 2 的幂次缩小域,在 Circle FFT 的递归结构中起着至关重要的作用。
在下方图表中:
左圆展示了原始的孪生陪集 D = Q ⋅ G 2 ∪ Q − 1 ⋅ G 2 D = Q \cdot G_2 \cup Q^{-1} \cdot G_2 D = Q ⋅ G 2 ∪ Q − 1 ⋅ G 2 ,其中 🔴 红点 = Q ⋅ G 2 Q \cdot G_2 Q ⋅ G 2 ,🔵 蓝点 = Q − 1 ⋅ G 2 Q^{-1} \cdot G_2 Q − 1 ⋅ G 2 。
右圆展示了减半后的孪生陪集 π ( D ) \pi(D) π ( D ) ,其中 🔵 蓝点 = π ( Q ) ⋅ G 1 \pi(Q) \cdot G_1 π ( Q ) ⋅ G 1 ,🔴 红点 = π ( Q − 1 ) ⋅ G 1 \pi(Q^{-1}) \cdot G_1 π ( Q − 1 ) ⋅ G 1 。
⚫ 黑点标记了子群 G 1 = { ( 1 , 0 ) , ( 30 , 0 ) } G_1 = \{(1, 0), (30, 0)\} G 1 = {( 1 , 0 ) , ( 30 , 0 )} 。
该视觉图说明了 π \pi π 是如何通过群自同态将原始大小为 2 3 = 8 2^3 = 8 2 3 = 8 的域映射成一个新的大小为 2 2 = 4 2^2 = 4 2 2 = 4 的孪生陪集的。
9. 第 1 部分的总结
在本文中,我们重点讨论了如何将 F p \mathbb{F}_p F p 上的 Circle 曲线 x 2 + y 2 = 1 x^2 + y^2 = 1 x 2 + y 2 = 1 转换为大小为 p + 1 p + 1 p + 1 的循环群,并通过具体示例讨论了孪生陪集和标准位置陪集。我们还展示了两项关键技术:一种用于将较大规模的标准位置陪集拆分为较小的孪生陪集,另一种通过应用平方映射将孪生陪集的大小减半。结合起来,这些技术让我们能够随心所欲地重构大小为 2 n 2^n 2 n 的域。
在下一部分中,我们将深入探讨 Circle FFT 本身,展示这些 2 n 2^n 2 n 大小的域——再加上对其进行拆分或减半的能力——是如何实现在 p − 1 p - 1 p − 1 不具备充分的 2-adicity 时依然做到快速的多项式求值和插值的。
参考资料
附录
在下文中,我们介绍了 Circle 曲线的射影视图与仿射视图,接着解释了为什么 Circle STARKs 专门选择满足 p ≡ 3 ( m o d 4 ) p \equiv 3 \pmod{4} p ≡ 3 ( mod 4 ) 的素数来避免诸如无穷远点之类的射影复杂性。
A.1 射影视图与仿射视图
在 F p \mathbb{F}_p F p 上的仿射平面中,一个点简单地记为 ( x , y ) (x,y) ( x , y ) ,其中 x , y ∈ F p x,y \in \mathbb{F}_p x , y ∈ F p 。相比之下,在射影平面 P 2 ( F p ) \mathbb{P}^2(\mathbb{F}_p) P 2 ( F p ) 中,每一个点都记为 ( X : Y : Z ) (X : Y : Z) ( X : Y : Z ) ,但所有非零标量倍数均代表同一位置。形式上,
( X : Y : Z ) ≡ ( λ X : λ Y : λ Z ) ( λ ≠ 0 ) . (X : Y : Z) \;\equiv\; (\lambda X : \lambda Y : \lambda Z)\quad (\lambda \neq 0). ( X : Y : Z ) ≡ ( λ X : λY : λ Z ) ( λ = 0 ) .
当 Z ≠ 0 Z \neq 0 Z = 0 时,我们通过将每个坐标除以 Z Z Z 来重新缩放,从而得出一个仿射点 ( X / Z , Y / Z ) \bigl(X/Z,\;Y/Z\bigr) ( X / Z , Y / Z ) 。
当 Z = 0 Z=0 Z = 0 时,我们得到一个无穷远点,其没有对应的仿射点。
A.2 为什么要避免无穷远点?
为了看看无穷远点是如何出现的,我们将 x 2 + y 2 = 1 x^2 + y^2 = 1 x 2 + y 2 = 1 重写为射影形式:
X 2 + Y 2 = Z 2 . X^2 + Y^2 \;=\; Z^2. X 2 + Y 2 = Z 2 .
在这里,如果 Z ≠ 0 Z \neq 0 Z = 0 ,我们将其视为 x = X / Z x = X/Z x = X / Z 和 y = Y / Z y = Y/Z y = Y / Z ,因此 x 2 + y 2 = 1 x^2 + y^2 = 1 x 2 + y 2 = 1 变成了 X 2 + Y 2 = Z 2 X^2 + Y^2 = Z^2 X 2 + Y 2 = Z 2 。
一个无穷远点就是在 Z = 0 Z=0 Z = 0 时的任何解。这类解是否存在取决于 − 1 -1 − 1 在 F p \mathbb{F}_p F p 中是不是一个平方数:
例如,如果 p ≡ 1 ( m o d 4 ) p \equiv 1 \pmod{4} p ≡ 1 ( mod 4 ) ,那么 − 1 -1 − 1 在 F p \mathbb{F}_p F p 中是一个平方数。
具体而言,存在某个 a a a 使得 a 2 ≡ − 1 ( m o d p ) a^2 \equiv -1 \pmod{p} a 2 ≡ − 1 ( mod p ) ,暗示了 X 2 + Y 2 ≡ 0 ( m o d p ) X^2 + Y^2 \equiv 0 \pmod{p} X 2 + Y 2 ≡ 0 ( mod p ) 在 Z = 0 Z=0 Z = 0 时可能有非零的 ( X , Y ) (X,Y) ( X , Y ) 。
这将在圆上产生额外的无穷远点,从而使得群运算和实现变得复杂。
示例:p = 5 p=5 p = 5
这里,在 F 5 \mathbb{F}_5 F 5 中 − 1 ≡ 4 -1 \equiv 4 − 1 ≡ 4 ,而 4 4 4 确实是 ( 2 2 ) (2^2) ( 2 2 ) 。
所以 X 2 + Y 2 ≡ 0 ( m o d 5 ) X^2 + Y^2 \equiv 0 \pmod{5} X 2 + Y 2 ≡ 0 ( mod 5 ) 允许在 Z = 0 Z=0 Z = 0 时存在非零的 ( X , Y ) (X,Y) ( X , Y ) ,这就给出了两个无穷远点。
仿射方程 x 2 + y 2 = 1 x^2 + y^2=1 x 2 + y 2 = 1 恰好有四个仿射解:
{ ( 0 , 1 ) , ( 0 , 4 ) , ( 1 , 0 ) , ( 4 , 0 ) } . \{(0,1),\,(0,4),\,(1,0),\,(4,0)\}. {( 0 , 1 ) , ( 0 , 4 ) , ( 1 , 0 ) , ( 4 , 0 )} .
且射影的无穷远点是
{ ( 2 : 1 : 0 ) , ( 3 : 1 : 0 ) } \{(2:1:0), (3:1:0)\} {( 2 : 1 : 0 ) , ( 3 : 1 : 0 )} ,所以共有 6 6 6 个解——符合 p + 1 = 6 p+1=6 p + 1 = 6 (仿射 4 + 无穷远 2)。
如果 p ≡ 3 ( m o d 4 ) p \equiv 3 \pmod{4} p ≡ 3 ( mod 4 ) ,那么 − 1 -1 − 1 在 F p \mathbb{F}_p F p 中不是一个平方数。
结果就是,X 2 + Y 2 ≡ 0 ( m o d p ) X^2 + Y^2 \equiv 0 \pmod{p} X 2 + Y 2 ≡ 0 ( mod p ) 在 Z = 0 Z=0 Z = 0 时并没有非零解。我们就不会得到任何无穷远点,所有的解都保留为仿射形式。
示例:p = 3 p=3 p = 3
因为 − 1 ≡ 2 ( m o d 3 ) -1 \equiv 2 \pmod{3} − 1 ≡ 2 ( mod 3 ) 不是一个平方数(我们有 1 2 ≡ 1 1^2 \equiv 1 1 2 ≡ 1 以及 2 2 ≡ 1 2^2 \equiv 1 2 2 ≡ 1 ),所以不存在能够满足 X 2 + Y 2 ≡ 0 X^2+Y^2\equiv0 X 2 + Y 2 ≡ 0 于 Z = 0 Z=0 Z = 0 时的 ( X , Y ) (X,Y) ( X , Y ) 。
此后,方程 x 2 + y 2 = 1 x^2 + y^2=1 x 2 + y 2 = 1 只有仿射解。检查 x , y ∈ { 0 , 1 , 2 } x,y \in \{0,1,2\} x , y ∈ { 0 , 1 , 2 } 会得出:
{ ( 0 , 1 ) , ( 0 , 2 ) , ( 1 , 0 ) , ( 2 , 0 ) } , \{(0,1),\,(0,2),\,(1,0),\,(2,0)\}, {( 0 , 1 ) , ( 0 , 2 ) , ( 1 , 0 ) , ( 2 , 0 )} , 总共 4 4 4 个解,恰好符合 p + 1 = 4 p+1=4 p + 1 = 4 。
在 Circle STARK 中,我们特地选择 p ≡ 3 ( m o d 4 ) p \equiv 3 \pmod{4} p ≡ 3 ( mod 4 ) 使得 − 1 -1 − 1 在 F p \mathbb{F}_p F p 中不是平方数。这保证了我们的圆 x 2 + y 2 = 1 x^2 + y^2=1 x 2 + y 2 = 1 没有无穷远(射影)点,将所有的解都留在了仿射坐标系里,并避免了处理无穷远点所带来的种种复杂性。