1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
use ark_ec::{msm::VariableBaseMSM, AffineCurve, ProjectiveCurve}; use ark_ff::{PrimeField, UniformRand, Zero}; fn naive_var_base_msm<G: AffineCurve>( bases: &[G], scalars: &[<G::ScalarField as PrimeField>::BigInt], ) -> G::Projective { let mut acc = G::Projective::zero(); for (base, scalar) in bases.iter().zip(scalars.iter()) { acc += &base.mul(*scalar); } acc } pub fn test_var_base_msm<G: AffineCurve>() { const SAMPLES: usize = 1 << 10; let mut rng = ark_std::test_rng(); let v = (0..SAMPLES - 1) .map(|_| G::ScalarField::rand(&mut rng).into_repr()) .collect::<Vec<_>>(); let g = (0..SAMPLES) .map(|_| G::Projective::rand(&mut rng)) .collect::<Vec<_>>(); let g = <G::Projective as ProjectiveCurve>::batch_normalization_into_affine(&g); let naive = naive_var_base_msm(g.as_slice(), v.as_slice()); let fast = VariableBaseMSM::multi_scalar_mul(g.as_slice(), v.as_slice()); assert_eq!(naive.into_affine(), fast.into_affine()); }