r1cs-interpolate-poly-test/src/lib.rs
src/lib.rsRaw
1#[cfg(test)]
2mod tests {
3 use ark_bls12_381::Fr;
4 use ark_ff::{FftField, Field, One, UniformRand};
5 use ark_poly::{polynomial::univariate::DensePolynomial, DenseUVPolynomial, Polynomial};
6 use ark_r1cs_std::{
7 alloc::AllocVar,
8 fields::{fp::FpVar, FieldVar},
9 poly::{domain::Radix2DomainVar, evaluations::univariate::EvaluationsVar},
10 R1CSVar,
11 };
12 use ark_relations::ns;
13 use ark_relations::r1cs::ConstraintSystem;
14 use ark_std::test_rng;
15
16 /// The following test is directly from
17 /// https://github.com/arkworks-rs/r1cs-std/tree/b477880a3b9c097b65b1e006d8116f3998cf013c/src/poly/evaluations/univariate/mod.rs#L380
18 /// with the only change of adapting it to depend on 'n' instead of hardcoded values, and
19 /// adding some 'dbg!' prints.
20 ///
21 /// run the test:
22 /// > cargo test -- --nocapture
23 #[test]
24 fn test_interpolate_constant_offset() {
25 let mut rng = test_rng();
26
27 // For n<=11 test will pass, for n>11 test will get stack overflow
28 let n = 12;
29 dbg!(n);
30
31 let poly = DensePolynomial::rand((1 << n) - 1, &mut rng);
32 let gen = Fr::get_root_of_unity(1 << n).unwrap();
33 assert_eq!(gen.pow(&[1 << n]), Fr::one());
34 let domain = Radix2DomainVar::new(gen, n, FpVar::constant(Fr::rand(&mut rng))).unwrap();
35 let mut coset_point = domain.offset().value().unwrap();
36 let mut oracle_evals = Vec::new();
37 for _ in 0..(1 << n) {
38 oracle_evals.push(poly.evaluate(&coset_point));
39 coset_point *= gen;
40 }
41 let cs = ConstraintSystem::new_ref();
42 let evaluations_fp: Vec<_> = oracle_evals
43 .iter()
44 .map(|x| FpVar::new_input(ns!(cs, "evaluations"), || Ok(x)).unwrap())
45 .collect();
46 let evaluations_var = EvaluationsVar::from_vec_and_domain(evaluations_fp, domain, true);
47
48 let interpolate_point = Fr::rand(&mut rng);
49 let interpolate_point_fp =
50 FpVar::new_input(ns!(cs, "interpolate point"), || Ok(interpolate_point)).unwrap();
51
52 let expected = poly.evaluate(&interpolate_point);
53
54 let actual = evaluations_var
55 .interpolate_and_evaluate(&interpolate_point_fp)
56 .unwrap()
57 .value()
58 .unwrap();
59
60 assert_eq!(actual, expected);
61 assert!(cs.is_satisfied().unwrap());
62 println!("number of constraints: {}", cs.num_constraints())
63 }
64}