本文介绍了在有限域中执行FFT算法(数论变换)所需的n次单位根,并列举了几个常用的FFT友好的有限域,包括Goldilocks Field、Baby Bear Field、Teddy Bear Field、Koala Bear Field、BN-128 field、STARK Field和BLS12-381,以及它们各自的特征和单位根的阶数,并提供了相应的Python代码验证。
为了在有限域中执行 FFT 算法(数论变换),需要存在 -th 个单位根,使得 是 2 的幂。
理想情况下,我们希望 2 的幂尽可能大,这样我们就可以乘更大的多项式。有几个常用的有限域(几乎都有一个朗朗上口的名字)。本文列出了一些较常见的有限域。
简单来说,域的 特征 是我们取模的素数,所以在有限域 中, 是特征。(如果我们考虑有限域扩张,这个定义会有些细微差别,但我们现在不想深入探讨。就我们的目的而言, 是一个素数,并且是有限域的特征)。
正如我们在有限循环群基本定理中看到的,如果子群的阶能整除群的阶,则存在子群。
因此,如果域适合 FFT,则存在某个 使得 且 是一个很大的 2 的幂。换句话说, 可被一个很大的 2 的幂整除。
这里的列表并不完整 —— 我们仅包括截至发布时相对知名的有限域。
Goldilocks 域的特征为 ,并且有 -th 个单位根。
以下 Python 代码断言,该域中存在一个阶为 的乘法子群。
q = 2**64 - 2**32 + 1
k = 2**32
assert (q - 1) % k == 0
由于特征小于 64 位,因此元素可以存储在大多数现代硬件(通常为 64 位)上的单个字中。
但是,将两个 64 位数字相乘暂时需要 128 位,这需要额外的寄存器进行乘法运算。
这促使人们使用更小的仅使用 32 位的域。
Baby Bear 域使用特征 。它具有 -th 个单位根。
q = 2**31 - 2**27 + 1
k = 2**27
assert (q - 1) % k == 0
“Baby Bear”这个名称模仿了Goldilocks 的童话,这个故事强调了 Baby Bear 的小尺寸与故事的主角(Goldilocks)相比。
由于该域适合 32 位,因此 64 位计算机可以在单个字中将两个元素相乘。
Teddy Bear 域使用特征 并且具有 -th 个单位根。
q = 2**32 - 2**30 + 1
k = 2**30
assert (q - 1) % k == 0
与 Baby Bear 域相比,它适合 32 位,但具有更大的、大八倍的乘法子群。
Teddy Bear 域是由 Ingonyama 在这篇论文中提出的。
Koala Bear 域是另一个特征 适合 32 位且具有 -th 个单位根的域。
q = 2**31 - 2**24 + 1
k = 2**24
assert (q - 1) % k == 0
BN-128 域因其对椭圆曲线配对的支持而被使用,但它也具有相对较大的乘法子群,其阶为 。
## curve_order = 21888242871839275222246405745257275088548364400416034343698204186575808495617
from py_ecc.bn128 import curve_order
k = 2**28
assert (curve_order - 1) % k == 0
Starknet 使用的 Cairo VM 具有特征 ,并且具有非常大的 -th 个单位根。
q = 2**251 + 17*2**192 + 1
k = 2**192
assert (q - 1) % k == 0
BLS12-381 是另一个配对友好的椭圆曲线,其曲线阶数具有 -th 个单位根。
## curve_order = 52435875175126190479447740508185965837690552500527637822603658699938581184513
from py_ecc.bls12_381 import curve_order
k = 2**32
assert (curve_order - 1) % k == 0
Plonky3 库 具有 Goldilocks、Baby Bear 和 Koala Bear 的库。
- 原文链接: rareskills.io/post/fft-f...
- 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!