use bls12_381::Scalar;
pub(crate) fn poly_eval(poly_coeffs: &[Scalar], x: &Scalar) -> Scalar {
let mut result: Scalar;
if let Some((&leading_coeff, coeffs)) = poly_coeffs.split_last() {
result = leading_coeff;
for coeff in coeffs.iter().rev() {
result = (result * x) + coeff;
}
} else {
panic!("Tried to evaluate a polynomial with no coefficients.")
}
result
}
pub(crate) fn lambda_coeff(fragment_index: &Scalar, fragment_indices: &[Scalar]) -> Scalar {
let indices = fragment_indices
.iter()
.filter(|&index| index != fragment_index)
.collect::<Vec<_>>();
let mut result: Scalar;
if let Some((&x_0, xs)) = indices.split_first() {
result = x_0 * (x_0 - fragment_index).invert().unwrap();
for &x_m in xs.into_iter() {
result *= x_m * (x_m - fragment_index).invert().unwrap();
}
} else {
return Scalar::one();
}
result
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_polynomial_evaluation() {
let coeffs = vec![
Scalar::one(),
Scalar::one().double(),
Scalar::one().double().double(),
];
let x = Scalar::one().double();
let twenty_one = Scalar::one().double().double().double().double()
+ Scalar::one().double().double()
+ Scalar::one();
let p_x = poly_eval(&coeffs[..], &x);
assert_eq!(p_x, twenty_one);
}
}