ark_poly/polynomial/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;
}