Skip to main content

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