binius_core/transparent/
disjoint_product.rs

1// Copyright 2024-2025 Irreducible Inc.
2
3use binius_field::Field;
4use binius_utils::bail;
5
6use crate::polynomial::{Error, MultivariatePoly};
7
8/// Represents a product of two multilinear polynomials over disjoint variables.
9#[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}