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