Skip to content
Draft
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
51 changes: 37 additions & 14 deletions twenty-first/src/shared_math/polynomial.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2525,28 +2525,51 @@ mod test_polynomials {

#[test]
fn fast_coset_evaluate_test() {
let _1 = BFieldElement::from(1u64);
let _0 = BFieldElement::from(0u64);
// x^5 + x^3
let poly_coefficients = [0, 0, 0, 1, 0, 1].map(BFieldElement::new).to_vec();
let poly = Polynomial::<BFieldElement>::new(poly_coefficients);

let domain_length = 8;
let offset = BFieldElement::generator();
let primitive_root = BFieldElement::primitive_root_of_unity(domain_length as u64).unwrap();

let values = poly.fast_coset_evaluate(offset, primitive_root, domain_length);

let poly_interpolated = Polynomial::fast_coset_interpolate(offset, primitive_root, &values);
assert_eq!(poly, poly_interpolated);
}

#[test]
fn fast_coset_evaluate_on_small_domain() {
// x^5 + x^3
let poly = Polynomial::<BFieldElement>::new(vec![_0, _0, _0, _1, _0, _1]);
let poly_coefficients = [0, 0, 0, 1, 0, 1].map(BFieldElement::new).to_vec();
let poly = Polynomial::<BFieldElement>::new(poly_coefficients);

let domain_length = 4;
let offset = BFieldElement::generator();
let omega = BFieldElement::primitive_root_of_unity(8).unwrap();
let primitive_root = BFieldElement::primitive_root_of_unity(domain_length as u64).unwrap();

let values = poly.fast_coset_evaluate(offset, omega, 8);
poly.fast_coset_evaluate(offset, primitive_root, domain_length);
}

let mut domain = vec![_0; 8];
domain[0] = offset;
for i in 1..8 {
domain[i] = domain[i - 1].to_owned() * omega.to_owned();
}
#[test]
fn fast_and_slow_evaluation_are_equivalent() {
let poly_coefficients = [0, 0, 0, 1, 0, 1].map(BFieldElement::new).to_vec();
let poly = Polynomial::<BFieldElement>::new(poly_coefficients);

let domain_length = 8;
let offset = BFieldElement::generator();
let primitive_root = BFieldElement::primitive_root_of_unity(domain_length as u64).unwrap();

let reinterp = Polynomial::fast_interpolate(&domain, &values, omega, 8);
assert_eq!(reinterp, poly);
let domain = (0..domain_length)
.map(|i| offset * primitive_root.mod_pow(i as u64))
.collect_vec();
let fast_values = poly.fast_evaluate(&domain, primitive_root, domain_length);

let poly_interpolated = Polynomial::fast_coset_interpolate(offset, omega, &values);
assert_eq!(poly, poly_interpolated);
for (i, domain_point) in domain.into_iter().enumerate() {
let slow_value = poly.evaluate(&domain_point);
assert_eq!(slow_value, fast_values[i]);
}
}

#[test]
Expand Down