kimchi/circuits/
domain_constant_evaluation.rs

1//! This contains the [DomainConstantEvaluations] which is used to provide precomputations to a [ConstraintSystem](super::constraints::ConstraintSystem).
2
3use crate::circuits::domains::EvaluationDomains;
4use ark_ff::FftField;
5use ark_poly::{
6    univariate::DensePolynomial as DP, DenseUVPolynomial, EvaluationDomain, Evaluations as E,
7    Radix2EvaluationDomain as D,
8};
9use serde::{Deserialize, Serialize};
10use serde_with::serde_as;
11
12use super::polynomials::permutation::{permutation_vanishing_polynomial, vanishes_on_last_n_rows};
13
14#[serde_as]
15#[derive(Clone, Serialize, Deserialize, Debug)]
16/// pre-computed polynomials that depend only on the chosen field and domain
17pub struct DomainConstantEvaluations<F: FftField> {
18    /// 1-st Lagrange evaluated over domain.d8
19    #[serde_as(as = "o1_utils::serialization::SerdeAs")]
20    pub poly_x_d1: E<F, D<F>>,
21    /// 0-th Lagrange evaluated over domain.d4
22    // TODO(mimoo): be consistent with the paper/spec, call it L1 here or call it L0 there
23    #[serde_as(as = "o1_utils::serialization::SerdeAs")]
24    pub constant_1_d4: E<F, D<F>>,
25    /// 0-th Lagrange evaluated over domain.d8
26    #[serde_as(as = "o1_utils::serialization::SerdeAs")]
27    pub constant_1_d8: E<F, D<F>>,
28    /// the polynomial that vanishes on the zero-knowledge rows and the row before
29    #[serde_as(as = "o1_utils::serialization::SerdeAs")]
30    pub vanishes_on_zero_knowledge_and_previous_rows: E<F, D<F>>,
31    /// zero-knowledge polynomial over domain.d8
32    #[serde_as(as = "o1_utils::serialization::SerdeAs")]
33    pub permutation_vanishing_polynomial_l: E<F, D<F>>,
34    #[serde_as(as = "o1_utils::serialization::SerdeAs")]
35    pub permutation_vanishing_polynomial_m: DP<F>,
36}
37
38impl<F: FftField> DomainConstantEvaluations<F> {
39    pub fn create(domain: EvaluationDomains<F>, zk_rows: u64) -> Option<Self> {
40        let poly_x_d1 = DP::from_coefficients_slice(&[F::zero(), F::one()])
41            .evaluate_over_domain_by_ref(domain.d8);
42        let constant_1_d4 =
43            E::<F, D<F>>::from_vec_and_domain(vec![F::one(); domain.d4.size()], domain.d4);
44        let constant_1_d8 =
45            E::<F, D<F>>::from_vec_and_domain(vec![F::one(); domain.d8.size()], domain.d8);
46
47        let vanishes_on_zero_knowledge_and_previous_rows =
48            vanishes_on_last_n_rows(domain.d1, zk_rows + 1).evaluate_over_domain(domain.d8);
49
50        assert!(domain.d1.size > zk_rows);
51
52        // x^3 - x^2(w1+w2+w3) + x(w1w2+w1w3+w2w3) - w1w2w3
53        let permutation_vanishing_polynomial_m =
54            permutation_vanishing_polynomial(domain.d1, zk_rows);
55        let permutation_vanishing_polynomial_l =
56            permutation_vanishing_polynomial_m.evaluate_over_domain_by_ref(domain.d8);
57
58        Some(DomainConstantEvaluations {
59            poly_x_d1,
60            constant_1_d4,
61            constant_1_d8,
62            vanishes_on_zero_knowledge_and_previous_rows,
63            permutation_vanishing_polynomial_l,
64            permutation_vanishing_polynomial_m,
65        })
66    }
67}