1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
use crate::fft::{Evaluations, Polynomial};
use dusk_bls12_381::Scalar;
#[derive(Debug, Eq, PartialEq)]
pub struct ProverKey {
pub q_m: (Polynomial, Evaluations),
pub q_l: (Polynomial, Evaluations),
pub q_r: (Polynomial, Evaluations),
pub q_o: (Polynomial, Evaluations),
pub q_c: (Polynomial, Evaluations),
pub q_4: (Polynomial, Evaluations),
pub q_arith: (Polynomial, Evaluations),
}
impl ProverKey {
pub(crate) fn compute_quotient_i(
&self,
index: usize,
w_l_i: &Scalar,
w_r_i: &Scalar,
w_o_i: &Scalar,
w_4_i: &Scalar,
) -> Scalar {
let q_m_i = &self.q_m.1[index];
let q_l_i = &self.q_l.1[index];
let q_r_i = &self.q_r.1[index];
let q_o_i = &self.q_o.1[index];
let q_c_i = &self.q_c.1[index];
let q_4_i = &self.q_4.1[index];
let q_arith_i = &self.q_arith.1[index];
let a_1 = w_l_i * w_r_i * q_m_i;
let a_2 = w_l_i * q_l_i;
let a_3 = w_r_i * q_r_i;
let a_4 = w_o_i * q_o_i;
let a_5 = w_4_i * q_4_i;
let a_6 = q_c_i;
(a_1 + a_2 + a_3 + a_4 + a_5 + a_6) * q_arith_i
}
pub(crate) fn compute_linearisation(
&self,
a_eval: &Scalar,
b_eval: &Scalar,
c_eval: &Scalar,
d_eval: &Scalar,
q_arith_eval: &Scalar,
) -> Polynomial {
let q_m_poly = &self.q_m.0;
let q_l_poly = &self.q_l.0;
let q_r_poly = &self.q_r.0;
let q_o_poly = &self.q_o.0;
let q_c_poly = &self.q_c.0;
let q_4_poly = &self.q_4.0;
let ab = a_eval * b_eval;
let a_0 = q_m_poly * &ab;
let a_1 = q_l_poly * a_eval;
let a_2 = q_r_poly * b_eval;
let a_3 = q_o_poly * c_eval;
let a_4 = q_4_poly * d_eval;
let mut a = &a_0 + &a_1;
a = &a + &a_2;
a = &a + &a_3;
a = &a + &a_4;
a = &a + q_c_poly;
a = &a * q_arith_eval;
a
}
}