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;
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>
{
type Point: Sized + Clone + Ord + Debug + Sync + Hash;
fn degree(&self) -> usize;
fn evaluate(&self, point: &Self::Point) -> F;
}
pub trait DenseUVPolynomial<F: Field>: Polynomial<F, Point = F> {
fn from_coefficients_slice(coeffs: &[F]) -> Self;
fn from_coefficients_vec(coeffs: Vec<F>) -> Self;
fn coeffs(&self) -> &[F];
fn rand<R: Rng>(d: usize, rng: &mut R) -> Self;
}
pub trait DenseMVPolynomial<F: Field>: Polynomial<F> {
type Term: multivariate::Term;
fn from_coefficients_slice(num_vars: usize, terms: &[(F, Self::Term)]) -> Self {
Self::from_coefficients_vec(num_vars, terms.to_vec())
}
fn from_coefficients_vec(num_vars: usize, terms: Vec<(F, Self::Term)>) -> Self;
fn terms(&self) -> &[(F, Self::Term)];
fn num_vars(&self) -> usize;
fn rand<R: Rng>(d: usize, num_vars: usize, rng: &mut R) -> Self;
}