binius_core/transparent/
constant.rs

1// Copyright 2024-2025 Irreducible Inc.
2
3use binius_field::{BinaryField128b, ExtensionField, TowerField};
4use binius_macros::{erased_serialize_bytes, DeserializeBytes, SerializeBytes};
5use binius_utils::{bail, DeserializeBytes};
6
7use crate::polynomial::{Error, MultivariatePoly};
8
9/// A constant polynomial.
10#[derive(Debug, Copy, Clone, SerializeBytes, DeserializeBytes)]
11pub struct Constant<F: TowerField> {
12	n_vars: usize,
13	value: F,
14	tower_level: usize,
15}
16
17inventory::submit! {
18	<dyn MultivariatePoly<BinaryField128b>>::register_deserializer(
19		"Constant",
20		|buf, mode| Ok(Box::new(Constant::<BinaryField128b>::deserialize(&mut *buf, mode)?))
21	)
22}
23
24impl<F: TowerField> Constant<F> {
25	pub fn new<FS: TowerField>(n_vars: usize, value: FS) -> Self
26	where
27		F: ExtensionField<FS>,
28	{
29		Self {
30			value: value.into(),
31			tower_level: FS::TOWER_LEVEL,
32			n_vars,
33		}
34	}
35}
36
37#[erased_serialize_bytes]
38impl<F: TowerField> MultivariatePoly<F> for Constant<F> {
39	fn n_vars(&self) -> usize {
40		self.n_vars
41	}
42
43	fn degree(&self) -> usize {
44		0
45	}
46
47	fn evaluate(&self, query: &[F]) -> Result<F, Error> {
48		if query.len() != self.n_vars {
49			bail!(Error::IncorrectQuerySize {
50				expected: self.n_vars,
51			});
52		}
53		Ok(self.value)
54	}
55
56	fn binary_tower_level(&self) -> usize {
57		self.tower_level
58	}
59}