fn multi_scalar_multiplication(
        a_bits_le: &[bool],
        a: Self,
        b_bits_le: &[bool],
        b: Self,
    ) -> Self {
        // The length of the bit vectors must be the same.
        debug_assert!(a_bits_le.len() == b_bits_le.len());

        let mut res: Self = Self::identity();
        let mut temp_a = a.clone();
        let mut temp_b = b.clone();
        for (a_bit, b_bit) in a_bits_le.iter().zip(b_bits_le.iter()) {
            if *a_bit {
                res.complete_add_assign(&temp_a);
            }
            if *b_bit {
                res.complete_add_assign(&temp_b);
            }
            temp_a.double();
            temp_b.double();
        }
        res
    }
Performs multi-scalar multiplication (MSM) on slices of bit vectors and points. Note:
a_bits_le and b_bits_le should be in little endian order.
crates/zkvm/lib/src/utils.rs