use crate::{core::global_value::value::FieldValue, utils::field::ScalarField};
pub(crate) const UNIT_LEN: usize = 32;
pub struct VecPoly1(
pub Vec<FieldValue<ScalarField>>,
pub Vec<FieldValue<ScalarField>>,
);
impl VecPoly1 {
pub fn zero(n: usize) -> Self {
VecPoly1(
vec![FieldValue::<ScalarField>::from(0); n],
vec![FieldValue::<ScalarField>::from(0); n],
)
}
pub fn inner_product(&self, rhs: &VecPoly1) -> Option<Poly2> {
let l = self;
let r = rhs;
let t0 = inner_product(&l.0, &r.0)?;
let t2 = inner_product(&l.1, &r.1)?;
let l0_plus_l1 = add_vec(&l.0, &l.1);
let r0_plus_r1 = add_vec(&r.0, &r.1);
let t1 = inner_product(&l0_plus_l1, &r0_plus_r1)? - t0 - t2;
Some(Poly2(t0, t1, t2))
}
pub fn eval(&self, x: FieldValue<ScalarField>) -> Vec<FieldValue<ScalarField>> {
let n = self.0.len();
let mut out = vec![FieldValue::<ScalarField>::from(0); n];
#[allow(clippy::needless_range_loop)]
for i in 0..n {
out[i] = self.0[i] + self.1[i] * x;
}
out
}
}
pub struct Poly2(
pub FieldValue<ScalarField>,
pub FieldValue<ScalarField>,
pub FieldValue<ScalarField>,
);
impl Poly2 {
pub fn eval(&self, x: FieldValue<ScalarField>) -> FieldValue<ScalarField> {
self.0 + x * (self.1 + x * self.2)
}
}
pub struct ScalarExp {
x: FieldValue<ScalarField>,
next_exp_x: FieldValue<ScalarField>,
}
impl Iterator for ScalarExp {
type Item = FieldValue<ScalarField>;
fn next(&mut self) -> Option<FieldValue<ScalarField>> {
let exp_x = self.next_exp_x;
self.next_exp_x *= self.x;
Some(exp_x)
}
}
pub fn exp_iter(x: FieldValue<ScalarField>) -> ScalarExp {
let next_exp_x = FieldValue::<ScalarField>::from(1);
ScalarExp { x, next_exp_x }
}
pub fn add_vec(
a: &[FieldValue<ScalarField>],
b: &[FieldValue<ScalarField>],
) -> Vec<FieldValue<ScalarField>> {
if a.len() != b.len() {
panic!("lengths of vectors don't match for vector addition");
}
let mut out = vec![FieldValue::<ScalarField>::from(0); b.len()];
for i in 0..a.len() {
out[i] = a[i] + b[i];
}
out
}
pub fn inner_product(
a: &[FieldValue<ScalarField>],
b: &[FieldValue<ScalarField>],
) -> Option<FieldValue<ScalarField>> {
let mut out = FieldValue::<ScalarField>::from(0);
if a.len() != b.len() {
return None;
}
for i in 0..a.len() {
out += a[i] * b[i];
}
Some(out)
}