Skip to content

Commit 3871781

Browse files
authored
For reference, add a test for non-zero-affine (#69)
* add a test for non-zero-affine for reference * add some doc
1 parent 2b8e020 commit 3871781

File tree

2 files changed

+83
-1
lines changed

2 files changed

+83
-1
lines changed

Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ num-bigint = {version = "0.4", default-features = false }
3030
num-traits = {version = "0.2", default-features = false }
3131

3232
[dev-dependencies]
33-
ark-test-curves = { version = "^0.3.0", default-features = false, features = ["bls12_381_scalar_field", "mnt4_753_scalar_field"] }
33+
ark-test-curves = { version = "^0.3.0", default-features = false, features = ["bls12_381_scalar_field", "bls12_381_curve", "mnt4_753_scalar_field"] }
3434
ark-poly = { version = "^0.3.0", default-features = false }
3535

3636
[features]

src/groups/curves/short_weierstrass/non_zero_affine.rs

Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
use super::*;
2+
23
/// An affine representation of a prime order curve point that is guaranteed
34
/// to *not* be the point at infinity.
45
#[derive(Derivative)]
@@ -161,3 +162,84 @@ where
161162
Ok(Self::new(x, y))
162163
}
163164
}
165+
166+
#[cfg(test)]
167+
mod test {
168+
use crate::alloc::AllocVar;
169+
use crate::fields::fp::{AllocatedFp, FpVar};
170+
use crate::groups::curves::short_weierstrass::non_zero_affine::NonZeroAffineVar;
171+
use crate::groups::curves::short_weierstrass::ProjectiveVar;
172+
use crate::groups::CurveVar;
173+
use crate::R1CSVar;
174+
use ark_ec::SWModelParameters;
175+
use ark_relations::r1cs::ConstraintSystem;
176+
use ark_std::{vec::Vec, One};
177+
use ark_test_curves::bls12_381::{g1::Parameters as G1Parameters, Fq};
178+
179+
#[test]
180+
fn test_non_zero_affine_cost() {
181+
let cs = ConstraintSystem::<Fq>::new_ref();
182+
183+
let x = FpVar::Var(
184+
AllocatedFp::<Fq>::new_witness(cs.clone(), || {
185+
Ok(G1Parameters::AFFINE_GENERATOR_COEFFS.0)
186+
})
187+
.unwrap(),
188+
);
189+
let y = FpVar::Var(
190+
AllocatedFp::<Fq>::new_witness(cs.clone(), || {
191+
Ok(G1Parameters::AFFINE_GENERATOR_COEFFS.1)
192+
})
193+
.unwrap(),
194+
);
195+
196+
// The following code uses `double` and `add` (`add_unchecked`) to compute
197+
// (1 + 2 + ... + 2^9) G
198+
199+
let sum_a = {
200+
let mut a = ProjectiveVar::<G1Parameters, FpVar<Fq>>::new(
201+
x.clone(),
202+
y.clone(),
203+
FpVar::Constant(Fq::one()),
204+
);
205+
206+
let mut double_sequence = Vec::new();
207+
double_sequence.push(a.clone());
208+
209+
for _ in 1..10 {
210+
a = a.double().unwrap();
211+
double_sequence.push(a.clone());
212+
}
213+
214+
let mut sum = double_sequence[0].clone();
215+
for elem in double_sequence.iter().skip(1) {
216+
sum = sum + elem;
217+
}
218+
219+
let sum = sum.value().unwrap();
220+
(sum.x, sum.y)
221+
};
222+
223+
let sum_b = {
224+
let mut a = NonZeroAffineVar::<G1Parameters, FpVar<Fq>>::new(x, y);
225+
226+
let mut double_sequence = Vec::new();
227+
double_sequence.push(a.clone());
228+
229+
for _ in 1..10 {
230+
a = a.double().unwrap();
231+
double_sequence.push(a.clone());
232+
}
233+
234+
let mut sum = double_sequence[0].clone();
235+
for elem in double_sequence.iter().skip(1) {
236+
sum = sum.add_unchecked(&elem).unwrap();
237+
}
238+
239+
(sum.x.value().unwrap(), sum.y.value().unwrap())
240+
};
241+
242+
assert_eq!(sum_a.0, sum_b.0);
243+
assert_eq!(sum_a.1, sum_b.1);
244+
}
245+
}

0 commit comments

Comments
 (0)