Skip to content

Commit

Permalink
Add Add/Neg trait bounds to Polynomial (#38)
Browse files Browse the repository at this point in the history
  • Loading branch information
ryanleh authored Nov 13, 2020
1 parent 2fe5a6e commit 7135cd2
Show file tree
Hide file tree
Showing 3 changed files with 36 additions and 18 deletions.
4 changes: 3 additions & 1 deletion poly/src/polynomial/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ use ark_ff::Field;
use ark_std::{
fmt::Debug,
hash::Hash,
ops::{AddAssign, SubAssign},
ops::{Add, AddAssign, Neg, SubAssign},
vec::Vec,
};
use rand::Rng;
Expand All @@ -20,6 +20,8 @@ pub trait Polynomial<F: Field>:
+ Hash
+ PartialEq
+ Eq
+ Add
+ Neg
+ for<'a> AddAssign<&'a Self>
+ for<'a> AddAssign<(F, &'a Self)>
+ for<'a> SubAssign<&'a Self>
Expand Down
8 changes: 8 additions & 0 deletions poly/src/polynomial/multivariate/sparse.rs
Original file line number Diff line number Diff line change
Expand Up @@ -125,6 +125,14 @@ impl<F: Field> MVPolynomial<F> for SparsePolynomial<F, SparseTerm> {
}
}

impl<F: Field, T: Term> Add for SparsePolynomial<F, T> {
type Output = SparsePolynomial<F, T>;

fn add(self, other: SparsePolynomial<F, T>) -> Self {
&self + &other
}
}

impl<'a, 'b, F: Field, T: Term> Add<&'a SparsePolynomial<F, T>> for &'b SparsePolynomial<F, T> {
type Output = SparsePolynomial<F, T>;

Expand Down
42 changes: 25 additions & 17 deletions poly/src/polynomial/univariate/dense.rs
Original file line number Diff line number Diff line change
Expand Up @@ -144,6 +144,23 @@ impl<F: Field> DensePolynomial<F> {
}
}

impl<F: FftField> DensePolynomial<F> {
/// Evaluate `self` over `domain`.
pub fn evaluate_over_domain_by_ref<D: EvaluationDomain<F>>(
&self,
domain: D,
) -> Evaluations<F, D> {
let poly: DenseOrSparsePolynomial<'_, F> = self.into();
DenseOrSparsePolynomial::<F>::evaluate_over_domain(poly, domain)
}

/// Evaluate `self` over `domain`.
pub fn evaluate_over_domain<D: EvaluationDomain<F>>(self, domain: D) -> Evaluations<F, D> {
let poly: DenseOrSparsePolynomial<'_, F> = self.into();
DenseOrSparsePolynomial::<F>::evaluate_over_domain(poly, domain)
}
}

impl<F: Field> fmt::Debug for DensePolynomial<F> {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> Result<(), fmt::Error> {
for (i, coeff) in self.coeffs.iter().enumerate().filter(|(_, c)| !c.is_zero()) {
Expand Down Expand Up @@ -173,6 +190,14 @@ impl<F: Field> DerefMut for DensePolynomial<F> {
}
}

impl<F: Field> Add for DensePolynomial<F> {
type Output = DensePolynomial<F>;

fn add(self, other: DensePolynomial<F>) -> Self {
&self + &other
}
}

impl<'a, 'b, F: Field> Add<&'a DensePolynomial<F>> for &'b DensePolynomial<F> {
type Output = DensePolynomial<F>;

Expand Down Expand Up @@ -242,23 +267,6 @@ impl<'a, 'b, F: Field> AddAssign<(F, &'a DensePolynomial<F>)> for DensePolynomia
}
}

impl<F: FftField> DensePolynomial<F> {
/// Evaluate `self` over `domain`.
pub fn evaluate_over_domain_by_ref<D: EvaluationDomain<F>>(
&self,
domain: D,
) -> Evaluations<F, D> {
let poly: DenseOrSparsePolynomial<'_, F> = self.into();
DenseOrSparsePolynomial::<F>::evaluate_over_domain(poly, domain)
}

/// Evaluate `self` over `domain`.
pub fn evaluate_over_domain<D: EvaluationDomain<F>>(self, domain: D) -> Evaluations<F, D> {
let poly: DenseOrSparsePolynomial<'_, F> = self.into();
DenseOrSparsePolynomial::<F>::evaluate_over_domain(poly, domain)
}
}

impl<F: Field> Neg for DensePolynomial<F> {
type Output = DensePolynomial<F>;

Expand Down

0 comments on commit 7135cd2

Please sign in to comment.