#finite-fields #polynomial #arithmetic-operations #fft #modulo

无std winter-math

Winterfell STARK证明/验证器所需的数学库

21个不稳定版本 (8个破坏性)

0.9.0 2024年5月9日
0.8.4 2024年3月29日
0.8.1 2024年2月21日
0.7.1 2023年11月17日
0.2.0 2021年8月24日

#72 in 密码学

Download history 2672/week @ 2024-04-26 2378/week @ 2024-05-03 2330/week @ 2024-05-10 1600/week @ 2024-05-17 1637/week @ 2024-05-24 2498/week @ 2024-05-31 2238/week @ 2024-06-07 2523/week @ 2024-06-14 2533/week @ 2024-06-21 2736/week @ 2024-06-28 2483/week @ 2024-07-05 3203/week @ 2024-07-12 2679/week @ 2024-07-19 3390/week @ 2024-07-26 2753/week @ 2024-08-02 1990/week @ 2024-08-09

11,339 每月下载次数
用于 50 个crate (14个直接)

MIT 许可证

310KB
5.5K SLoC

Winter数学

此crate包含STARK证明生成和验证所需的数学运算模块。

有限域

有限域模块实现了STARK友好型有限域中的算术运算。运算包括

  • 基本算术运算:加法、乘法、减法、除法、求逆。
  • 从域中抽取随机和伪随机元素。
  • 计算给定阶的单位根。

目前,有限域有三种实现方式

  • 一个128位的域,模数为2128 - 45 * 240 + 1。这个域没有考虑到性能,并且大多数运算的实现效率较低。在这个域中生成的证明可以支持约100位的安全性级别。如果需要更高的安全性,必须在域的二次扩展中生成证明。
  • 一个62位的域,模数为262 - 111 * 239 + 1。这个域支持非常快的模运算,包括无分支的乘法和加法。为了达到足够的安全性(即约100位),必须在域的二次扩展中生成证明。对于更高的安全性级别,应使用立方扩展域。
  • 一个64位的域,模数为264 - 232 + 1。这个域支持非常快的模运算(与上面描述的62位域相当),提供完全常量时间的实现,并具有其他一些吸引人的特性。为了达到足够的安全性(即约100位),必须在域的二次扩展中生成证明。对于更高的安全性级别,应使用立方扩展域。

扩展域

目前,该库提供了一种通用的方法来创建支持STARK域的二次和立方扩展。这可以通过实现'ExtensibleField' trait来实现,度为2和3。

二次扩展域使用以下不可约多项式定义

  • 对于 f62 域,多项式是 x2 - x - 1。
  • 对于 f64 域,多项式是 x2 - x + 2。
  • 对于 f128 域,多项式是 x2 - x - 1。

三次扩展域使用以下不可约多项式定义

  • 对于 f62 域,多项式是 x3 + 2x + 2。
  • 对于 f64 域,多项式是 x3 - x - 1。
  • 对于 f128 域,不支持三次扩展。

多项式

多项式 模块实现了基本的代数运算,如

  • 在单个点对多项式进行求值。
  • 从一组点对多项式进行插值(使用 Lagrange 插值)。
  • 多项式的加法、乘法、减法和除法。
  • 综合多项式除法(使用 Ruffini 方法)。

快速傅里叶变换

FFT 模块包含计算素数域(也称为 数论变换)中的快速傅里叶变换的操作。只要多项式的域是大小为2的幂的乘子群,就可以在 O(n log n) 时间内用于插值和求值多项式。

包功能

此包可以编译以下功能

  • std - 默认启用,并依赖于 Rust 标准库。
  • concurrent - 意味着 std,并使某些包函数启用多线程执行。
  • no_std - 不依赖于 Rust 的标准库,并使编译到 WebAssembly 成为可能。

要使用 no_std 编译,请使用 --no-default-features 标志禁用默认功能。

并发执行

当启用 concurrent 功能进行编译时,以下操作将在多个线程中执行

  • fft 模块
    • evaluate_poly()
    • evaluate_poly_with_offset()
    • interpolate_poly()
    • interpolate_poly_with_offset()
    • get_twiddles()
    • get_inv_twiddles()
  • utils 模块
    • get_power_series()
    • get_power_series_with_offset()
    • add_in_place()
    • mul_acc()
    • batch_inversion()

可以通过 RAYON_NUM_THREADS 环境变量配置线程数,通常默认为机器上的逻辑核心数。

许可证

此项目是 MIT 许可

依赖关系

~0–360KB