binius_core/transparent/
disjoint_product.rs1use binius_field::Field;
4use binius_utils::bail;
5
6use crate::polynomial::{Error, MultivariatePoly};
7
8#[derive(Debug)]
10pub struct DisjointProduct<P0, P1>(pub P0, pub P1);
11
12impl<F: Field, P0, P1> MultivariatePoly<F> for DisjointProduct<P0, P1>
13where
14 P0: MultivariatePoly<F>,
15 P1: MultivariatePoly<F>,
16{
17 fn n_vars(&self) -> usize {
18 self.0.n_vars() + self.1.n_vars()
19 }
20
21 fn degree(&self) -> usize {
22 self.0.degree() + self.1.degree()
23 }
24
25 fn evaluate(&self, query: &[F]) -> Result<F, Error> {
26 let p0_vars = self.0.n_vars();
27 let p1_vars = self.1.n_vars();
28 let n_vars = p0_vars + p1_vars;
29
30 if query.len() != n_vars {
31 bail!(Error::IncorrectQuerySize { expected: n_vars });
32 }
33
34 let eval0 = self.0.evaluate(&query[..p0_vars])?;
35 let eval1 = self.1.evaluate(&query[p0_vars..])?;
36 Ok(eval0 * eval1)
37 }
38
39 fn binary_tower_level(&self) -> usize {
40 self.0.binary_tower_level().max(self.1.binary_tower_level())
41 }
42}