#有限域 #多项式 #FFT

no-std ark-poly

一个在有限域上通过FFT进行高效多项式算术的库

13个版本

0.5.0-alpha.02024年6月20日
0.4.2 2023年3月18日
0.4.1 2023年2月21日
0.4.0-alpha.72022年12月29日
0.2.0 2021年3月24日

#286 in 加密学

Download history 93722/week @ 2024-05-02 90480/week @ 2024-05-09 88770/week @ 2024-05-16 97468/week @ 2024-05-23 102089/week @ 2024-05-30 90933/week @ 2024-06-06 104668/week @ 2024-06-13 104739/week @ 2024-06-20 94812/week @ 2024-06-27 89807/week @ 2024-07-04 99614/week @ 2024-07-11 107906/week @ 2024-07-18 113718/week @ 2024-07-25 121538/week @ 2024-08-01 133878/week @ 2024-08-08 114833/week @ 2024-08-15

504,970每月下载量
用于 1,836 个crate(46个直接使用)

MIT/Apache

570KB
12K SLoC

ark-poly

此crate实现了多项式、域(称为"域")的FFT友好子集以及这些域的FFT的特性和实现。

多项式

polynomial模块提供了以下特性,用于以系数形式定义多项式

  • Polynomial:要求实现者支持多项式的常见操作,如AddSubZero、在一点上的评估、次数等,并定义了将多项式序列化和反序列化为系数表示的方法。
  • DenseUVPolynomial:指定一个Polynomial实际上是一个一元多项式。
  • DenseMVPolynomial:指定一个Polynomial实际上是一个多元多项式。

此crate还提供了以下实现这些特性的数据结构

此crate还提供了 univariate/DenseOrSparsePolynomial 枚举,允许用户抽象底层单项式多项式的类型(密集或稀疏)。

示例

use ark_poly::{
    polynomial::multivariate::{SparsePolynomial, SparseTerm, Term},
    DenseMVPolynomial, Polynomial,
};
use ark_test_curves::bls12_381::Fq;
// Create a multivariate polynomial in 3 variables, with 4 terms:
// f(x_0, x_1, x_2) = 2*x_0^3 + x_0*x_2 + x_1*x_2 + 5
let poly = SparsePolynomial::from_coefficients_vec(
    3,
    vec![
        (Fq::from(2), SparseTerm::new(vec![(0, 3)])),
        (Fq::from(1), SparseTerm::new(vec![(0, 1), (2, 1)])),
        (Fq::from(1), SparseTerm::new(vec![(1, 1), (2, 1)])),
        (Fq::from(5), SparseTerm::new(vec![])),
    ],
);
assert_eq!(poly.evaluate(&vec![Fq::from(2), Fq::from(3), Fq::from(6)]), Fq::from(51));

评估

evaluations 模块提供数据结构来表示拉格朗日形式的多项式。

evaluations 模块还提供了以下特性来定义拉格朗日形式的多元多项式

此crate提供了一些数据结构来实现这些特性。

示例

use ark_test_curves::bls12_381::Fq;
use ark_poly::{DenseMultilinearExtension, MultilinearExtension, SparseMultilinearExtension};
use ark_poly::{
    polynomial::multivariate::{SparsePolynomial, SparseTerm, Term},
    DenseMVPolynomial, Polynomial,
};
use ark_std::One;

// Create a multivariate polynomial in 3 variables:
// f(x_0, x_1, x_2) = 2*x_0^3 + x_0*x_2 + x_1*x_2 
let f = SparsePolynomial::from_coefficients_vec(
    3,
    vec![
        (Fq::from(2), SparseTerm::new(vec![(0, 3)])),
        (Fq::from(1), SparseTerm::new(vec![(0, 1), (2, 1)])),
        (Fq::from(1), SparseTerm::new(vec![(1, 1), (2, 1)])),
        (Fq::from(0), SparseTerm::new(vec![])),
    ],
);
// g is the multilinear extension of f, defined by the evaluations of f on the Boolean hypercube:
// f(0, 0, 0) = 2*0^3 + 0*0 + 0*0 = 0
// f(1, 0, 0) = 2*1^3 + 0*0 + 0*0 = 2
// ...
// f(1, 1, 1) = 2*1^3 + 1*1 + 1*1 = 4
let g: DenseMultilinearExtension<Fq> = DenseMultilinearExtension::from_evaluations_vec(
    3, 
    vec![
        Fq::from(0),
        Fq::from(2),
        Fq::from(0),
        Fq::from(2),
        Fq::from(0),
        Fq::from(3),
        Fq::from(1),
        Fq::from(4),
    ]
);
// when evaluated at any point within the Boolean hypercube, f and g should be equal
let point_within_hypercube = &vec![Fq::from(0), Fq::from(1), Fq::from(1)];
assert_eq!(f.evaluate(&point_within_hypercube), g.evaluate(&point_within_hypercube));

// We can also define a MLE g'(x_0, x_1, x_2) by providing the list of non-zero evaluations:
let g_prime: SparseMultilinearExtension<Fq> = SparseMultilinearExtension::from_evaluations(
    3,
    &vec![
        (1, Fq::from(2)),
        (3, Fq::from(2)),
        (5, Fq::from(3)),
        (6, Fq::from(1)),
        (7, Fq::from(4)),
    ]
);
// at any random point (X0, X1, X2), g == g' with negligible probability, unless they are the same function
let random_point = &vec![Fq::from(123), Fq::from(456), Fq::from(789)];
assert_eq!(g_prime.evaluate(&random_point), g.evaluate(&random_point));

待办事项

依赖关系

~3–4.5MB
~84K SLoC