arnaucube
arnaucube/r1cs-interpolate-poly-testPublic Self-hosted repository
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}