-
Notifications
You must be signed in to change notification settings - Fork 256
/
mod.rs
80 lines (66 loc) · 2.62 KB
/
mod.rs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
//! Modules for working with univariate or multivariate polynomials.
use ark_ff::{Field, Zero};
use ark_serialize::{CanonicalDeserialize, CanonicalSerialize};
use ark_std::{
fmt::Debug,
hash::Hash,
ops::{Add, AddAssign, Neg, SubAssign},
rand::Rng,
vec::*,
};
pub mod multivariate;
pub mod univariate;
/// Describes the common interface for univariate and multivariate polynomials
pub trait Polynomial<F: Field>:
Sized
+ Clone
+ Debug
+ Hash
+ PartialEq
+ Eq
+ Add
+ Neg
+ Zero
+ CanonicalSerialize
+ CanonicalDeserialize
+ for<'a> AddAssign<&'a Self>
+ for<'a> AddAssign<(F, &'a Self)>
+ for<'a> SubAssign<&'a Self>
{
/// The type of evaluation points for this polynomial.
type Point: Sized + Clone + Ord + Debug + Sync + Hash;
/// Returns the total degree of the polynomial
fn degree(&self) -> usize;
/// Evaluates `self` at the given `point` in `Self::Point`.
fn evaluate(&self, point: &Self::Point) -> F;
}
/// Describes the interface for univariate polynomials
pub trait DenseUVPolynomial<F: Field>: Polynomial<F, Point = F> {
/// Constructs a new polynomial from a list of coefficients.
fn from_coefficients_slice(coeffs: &[F]) -> Self;
/// Constructs a new polynomial from a list of coefficients.
fn from_coefficients_vec(coeffs: Vec<F>) -> Self;
/// Returns the coefficients of `self`
fn coeffs(&self) -> &[F];
/// Returns a univariate polynomial of degree `d` where each
/// coefficient is sampled uniformly at random.
fn rand<R: Rng>(d: usize, rng: &mut R) -> Self;
}
/// Describes the interface for multivariate polynomials
pub trait DenseMVPolynomial<F: Field>: Polynomial<F> {
/// The type of the terms of `self`
type Term: multivariate::Term;
/// Constructs a new polynomial from a list of tuples of the form `(coeff, Self::Term)`
fn from_coefficients_slice(num_vars: usize, terms: &[(F, Self::Term)]) -> Self {
Self::from_coefficients_vec(num_vars, terms.to_vec())
}
/// Constructs a new polynomial from a list of tuples of the form `(coeff, Self::Term)`
fn from_coefficients_vec(num_vars: usize, terms: Vec<(F, Self::Term)>) -> Self;
/// Returns the terms of a `self` as a list of tuples of the form `(coeff, Self::Term)`
fn terms(&self) -> &[(F, Self::Term)];
/// Returns the number of variables in `self`
fn num_vars(&self) -> usize;
/// Outputs an `l`-variate polynomial which is the sum of `l` `d`-degree univariate
/// polynomials where each coefficient is sampled uniformly at random.
fn rand<R: Rng>(d: usize, num_vars: usize, rng: &mut R) -> Self;
}