halo2/src/plonk/lookup.rs

52 lines
1.6 KiB
Rust
Raw Normal View History

2021-02-10 03:36:25 -08:00
use super::circuit::Expression;
use ff::Field;
2020-11-30 22:53:20 -08:00
2021-01-20 05:47:55 -08:00
pub(crate) mod prover;
pub(crate) mod verifier;
2020-11-30 22:53:20 -08:00
#[derive(Clone, Debug)]
2021-02-10 03:36:25 -08:00
pub(crate) struct Argument<F: Field> {
pub input_expressions: Vec<Expression<F>>,
pub table_expressions: Vec<Expression<F>>,
2020-11-30 22:53:20 -08:00
}
2021-02-10 03:36:25 -08:00
impl<F: Field> Argument<F> {
/// Constructs a new lookup argument.
///
/// `table_map` is a sequence of `(input, table)` tuples.
pub fn new(table_map: Vec<(Expression<F>, Expression<F>)>) -> Self {
let (input_expressions, table_expressions) = table_map.into_iter().unzip();
2020-11-30 22:53:20 -08:00
Argument {
input_expressions,
table_expressions,
2020-11-30 22:53:20 -08:00
}
}
pub(crate) fn required_degree(&self) -> usize {
assert_eq!(self.input_expressions.len(), self.table_expressions.len());
// degree 2:
// l_0(X) * (1 - z'(X)) = 0
//
2021-02-11 17:40:53 -08:00
// degree (1 + input_degree + table_degree):
// z'(X) (a'(X) + \beta) (s'(X) + \gamma)
// - z'(\omega^{-1} X) (\theta^{m-1} a_0(X) + ... + a_{m-1}(X) + \beta) (\theta^{m-1} s_0(X) + ... + s_{m-1}(X) + \gamma)
//
// degree 2:
// l_0(X) * (a'(X) - s'(X)) = 0
//
// degree 2:
// (a(X)s(X))⋅(a(X)a(\omega{-1} X)) = 0
2021-02-11 17:40:53 -08:00
let mut input_degree = 1;
for expr in self.input_expressions.iter() {
2021-02-11 17:40:53 -08:00
input_degree = std::cmp::max(input_degree, expr.degree());
}
let mut table_degree = 1;
for expr in self.table_expressions.iter() {
2021-02-11 17:40:53 -08:00
table_degree = std::cmp::max(table_degree, expr.degree());
}
1 + input_degree + table_degree
}
2020-11-30 22:53:20 -08:00
}