pub(crate) fn ip_unsafe<F: Field, I, J>(lhs: I, rhs: J) -> F
where
    I: IntoIterator,
    J: IntoIterator,
    I::Item: Borrow<F>,
    J::Item: Borrow<F>,
{
    lhs.into_iter()
        .zip(rhs)
        .map(|(x, y)| *x.borrow() * y.borrow())
        .sum()
}
/// Return the inner product of two iterators `lhs` and `rhs`,
/// assuming that the elements have the same length.
Return the inner product of two iterators `lhs` and `rhs`,
assuming that the elements have the same length.
Return the inner product of two iterators ` lhs ` and ` rhs ` assuming that the elements have the same length .
pub(crate) fn ip_unsafe<F: Field, I, J>(lhs: I, rhs: J) -> F
where
    I: IntoIterator,
    J: IntoIterator,
    I::Item: Borrow<F>,
    J::Item: Borrow<F>,
{
    lhs.into_iter()
        .zip(rhs)
        .map(|(x, y)| *x.borrow() * y.borrow())
        .sum()
}
pub ( crate ) fn ip_unsafe < F : Field , I , J > ( lhs : I , rhs : J ) -> F where I : IntoIterator , J : IntoIterator , I :: Item : Borrow < F > , J :: Item : Borrow < F > , { lhs . into_iter ( ) . zip ( rhs ) . map ( | ( x , y ) | * x . borrow ( ) * y . borrow ( ) ) . sum ( ) }
Return the inner product of two iterators `lhs` and `rhs`,
assuming that the elements have the same length.
Return the inner product of two iterators ` lhs ` and ` rhs ` assuming that the elements have the same length .
lhs
I
rhs
J