|
1 | 1 | use super::*; |
| 2 | + |
2 | 3 | /// An affine representation of a prime order curve point that is guaranteed |
3 | 4 | /// to *not* be the point at infinity. |
4 | 5 | #[derive(Derivative)] |
@@ -161,3 +162,84 @@ where |
161 | 162 | Ok(Self::new(x, y)) |
162 | 163 | } |
163 | 164 | } |
| 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