Skip to content

Commit d42b7bc

Browse files
authored
Require Neg, Sub, SubAssign ops on AffineRepr (arkworks-rs#756)
* Require `Neg`, `Sub`, `SubAssign` ops on `AffineRepr` * Update CHANGELOG
1 parent 46bfeee commit d42b7bc

File tree

23 files changed

+64
-12
lines changed

23 files changed

+64
-12
lines changed

CHANGELOG.md

+1
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
- Make `windowed_mul` a private method of `BatchMulPreprocessing`.
1717
- Rename `get_mul_window_size` to `compute_window_size` and make it private.
1818
- [\#748](https://github.com/arkworks-rs/algebra/pull/748) (`ark-ff`) Add `FromStr` for `BigInteger`.
19+
- [\#756](https://github.com/arkworks-rs/algebra/pull/756) (`ark-ec`) Require `Neg`, `Sub`, `SubAssign` ops on `AffineRepr`.
1920

2021
### Features
2122

ec/src/lib.rs

+8-6
Original file line numberDiff line numberDiff line change
@@ -14,9 +14,6 @@
1414
)]
1515
#![doc = include_str!("../README.md")]
1616

17-
#[macro_use]
18-
extern crate derivative;
19-
2017
#[macro_use]
2118
extern crate ark_std;
2219

@@ -28,7 +25,7 @@ use ark_serialize::{CanonicalDeserialize, CanonicalSerialize};
2825
use ark_std::{
2926
fmt::{Debug, Display},
3027
hash::Hash,
31-
ops::{Add, AddAssign, Mul, MulAssign},
28+
ops::{Add, AddAssign, Mul, MulAssign, Neg, Sub, SubAssign},
3229
vec::Vec,
3330
};
3431
pub use scalar_mul::{variable_base::VariableBaseMSM, ScalarMul};
@@ -82,8 +79,8 @@ pub trait CurveGroup:
8279
PrimeGroup
8380
+ Add<Self::Affine, Output = Self>
8481
+ AddAssign<Self::Affine>
85-
// + for<'a> Add<&'a Self::Affine, Output = Self>
86-
// + for<'a> AddAssign<&'a Self::Affine>
82+
+ Sub<Self::Affine, Output = Self>
83+
+ SubAssign<Self::Affine>
8784
+ VariableBaseMSM
8885
+ ScalarMul<MulBase = Self::Affine>
8986
+ From<Self::Affine>
@@ -138,12 +135,17 @@ pub trait AffineRepr:
138135
+ Debug
139136
+ Display
140137
+ Zeroize
138+
+ Neg
141139
+ From<<Self as AffineRepr>::Group>
142140
+ Into<<Self as AffineRepr>::Group>
143141
+ Add<Self, Output = Self::Group>
144142
+ for<'a> Add<&'a Self, Output = Self::Group>
145143
+ Add<Self::Group, Output = Self::Group>
146144
+ for<'a> Add<&'a Self::Group, Output = Self::Group>
145+
+ Sub<Self, Output = Self::Group>
146+
+ for<'a> Sub<&'a Self, Output = Self::Group>
147+
+ Sub<Self::Group, Output = Self::Group>
148+
+ for<'a> Sub<&'a Self::Group, Output = Self::Group>
147149
+ Mul<Self::ScalarField, Output = Self::Group>
148150
+ for<'a> Mul<&'a Self::ScalarField, Output = Self::Group>
149151
{

ec/src/models/bls12/g1.rs

+1
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ use crate::{
55
};
66
use ark_serialize::{CanonicalDeserialize, CanonicalSerialize};
77
use ark_std::vec::Vec;
8+
use derivative::Derivative;
89

910
pub type G1Affine<P> = Affine<<P as Bls12Config>::G1Config>;
1011
pub type G1Projective<P> = Projective<<P as Bls12Config>::G1Config>;

ec/src/models/bls12/g2.rs

+1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
use ark_ff::{AdditiveGroup, BitIteratorBE, Field, Fp2};
22
use ark_serialize::{CanonicalDeserialize, CanonicalSerialize};
33
use ark_std::{vec::Vec, One};
4+
use derivative::Derivative;
45

56
use crate::{
67
bls12::{Bls12Config, TwistType},

ec/src/models/bls12/mod.rs

+2-1
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,8 @@ use ark_ff::{
1212
},
1313
BitIteratorBE, CyclotomicMultSubgroup, Field, PrimeField,
1414
};
15-
use ark_std::{marker::PhantomData, vec::Vec};
15+
use ark_std::{cfg_chunks_mut, marker::PhantomData, vec::Vec};
16+
use derivative::Derivative;
1617
use num_traits::{One, Zero};
1718

1819
#[cfg(feature = "parallel")]

ec/src/models/bn/g1.rs

+1
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ use crate::{
55
};
66
use ark_serialize::{CanonicalDeserialize, CanonicalSerialize};
77
use ark_std::vec::Vec;
8+
use derivative::Derivative;
89

910
pub type G1Affine<P> = Affine<<P as BnConfig>::G1Config>;
1011
pub type G1Projective<P> = Projective<<P as BnConfig>::G1Config>;

ec/src/models/bn/g2.rs

+1
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ use ark_ff::{
44
};
55
use ark_serialize::{CanonicalDeserialize, CanonicalSerialize};
66
use ark_std::vec::Vec;
7+
use derivative::Derivative;
78
use num_traits::One;
89

910
use crate::{

ec/src/models/bn/mod.rs

+2-1
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,8 @@ use ark_ff::{
1111
},
1212
CyclotomicMultSubgroup,
1313
};
14-
use ark_std::{marker::PhantomData, vec::Vec};
14+
use ark_std::{cfg_chunks_mut, marker::PhantomData, vec::Vec};
15+
use derivative::Derivative;
1516
use itertools::Itertools;
1617
use num_traits::One;
1718

ec/src/models/bw6/g1.rs

+1
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ use crate::{
55
};
66
use ark_serialize::{CanonicalDeserialize, CanonicalSerialize};
77
use ark_std::vec::Vec;
8+
use derivative::Derivative;
89

910
pub type G1Affine<P> = Affine<<P as BW6Config>::G1Config>;
1011
pub type G1Projective<P> = Projective<<P as BW6Config>::G1Config>;

ec/src/models/bw6/g2.rs

+1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
use ark_ff::{AdditiveGroup, BitIteratorBE, Field};
22
use ark_serialize::{CanonicalDeserialize, CanonicalSerialize};
33
use ark_std::vec::Vec;
4+
use derivative::Derivative;
45
use num_traits::One;
56

67
use crate::{

ec/src/models/bw6/mod.rs

+2
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@ use ark_ff::{
1010
},
1111
BitIteratorBE, CyclotomicMultSubgroup,
1212
};
13+
use ark_std::cfg_chunks_mut;
14+
use derivative::Derivative;
1315
use itertools::Itertools;
1416
use num_traits::One;
1517

ec/src/models/mnt4/g1.rs

+1
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ use crate::{
66
use ark_ff::Fp2;
77
use ark_serialize::{CanonicalDeserialize, CanonicalSerialize};
88
use ark_std::vec::Vec;
9+
use derivative::Derivative;
910

1011
pub type G1Affine<P> = Affine<<P as MNT4Config>::G1Config>;
1112
pub type G1Projective<P> = Projective<<P as MNT4Config>::G1Config>;

ec/src/models/mnt4/g2.rs

+2-1
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,8 @@ use crate::{
88
};
99
use ark_ff::fields::{Field, Fp2};
1010
use ark_serialize::{CanonicalDeserialize, CanonicalSerialize};
11-
use ark_std::vec::Vec;
11+
use ark_std::{vec, vec::Vec};
12+
use derivative::Derivative;
1213
use num_traits::One;
1314

1415
pub type G2Affine<P> = Affine<<P as MNT4Config>::G2Config>;

ec/src/models/mnt4/mod.rs

+2-1
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ use ark_ff::{
77
fp4::{Fp4, Fp4Config},
88
AdditiveGroup, CyclotomicMultSubgroup, Field, PrimeField,
99
};
10+
use derivative::Derivative;
1011
use itertools::Itertools;
1112
use num_traits::{One, Zero};
1213

@@ -52,7 +53,7 @@ pub trait MNT4Config: 'static + Sized {
5253
.zip_eq(b)
5354
.map(|(a, b)| (a.into(), b.into()))
5455
.collect::<Vec<_>>();
55-
let result = cfg_into_iter!(pairs)
56+
let result = ark_std::cfg_into_iter!(pairs)
5657
.map(|(a, b)| MNT4::<Self>::ate_miller_loop(&a, &b))
5758
.product();
5859
MillerLoopOutput(result)

ec/src/models/mnt6/g1.rs

+1
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ use crate::{
66
use ark_ff::Fp3;
77
use ark_serialize::{CanonicalDeserialize, CanonicalSerialize};
88
use ark_std::vec::Vec;
9+
use derivative::Derivative;
910

1011
pub type G1Affine<P> = Affine<<P as MNT6Config>::G1Config>;
1112
pub type G1Projective<P> = Projective<<P as MNT6Config>::G1Config>;

ec/src/models/mnt6/g2.rs

+1
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ use crate::{
77
use ark_ff::fields::{Field, Fp3};
88
use ark_serialize::{CanonicalDeserialize, CanonicalSerialize};
99
use ark_std::{ops::Neg, vec::Vec};
10+
use derivative::Derivative;
1011
use num_traits::One;
1112

1213
pub type G2Affine<P> = Affine<<P as MNT6Config>::G2Config>;

ec/src/models/mnt6/mod.rs

+2-1
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ use ark_ff::{
77
fp6_2over3::{Fp6, Fp6Config},
88
AdditiveGroup, CyclotomicMultSubgroup, Field, PrimeField,
99
};
10+
use derivative::Derivative;
1011
use itertools::Itertools;
1112
use num_traits::{One, Zero};
1213

@@ -53,7 +54,7 @@ pub trait MNT6Config: 'static + Sized {
5354
.zip_eq(b)
5455
.map(|(a, b)| (a.into(), b.into()))
5556
.collect::<Vec<_>>();
56-
let result = cfg_into_iter!(pairs)
57+
let result = ark_std::cfg_into_iter!(pairs)
5758
.map(|(a, b)| MNT6::<Self>::ate_miller_loop(&a, &b))
5859
.product();
5960
MillerLoopOutput(result)

ec/src/models/short_weierstrass/affine.rs

+15
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ use ark_std::{
1616

1717
use ark_ff::{fields::Field, AdditiveGroup, PrimeField, ToConstraintField, UniformRand};
1818

19+
use derivative::Derivative;
1920
use zeroize::Zeroize;
2021

2122
use super::{Projective, SWCurveConfig, SWFlags};
@@ -301,6 +302,20 @@ impl<P: SWCurveConfig, T: Borrow<Self>> Sub<T> for Affine<P> {
301302
}
302303
}
303304

305+
impl<P: SWCurveConfig> Sub<Projective<P>> for Affine<P> {
306+
type Output = Projective<P>;
307+
fn sub(self, other: Projective<P>) -> Projective<P> {
308+
other - self
309+
}
310+
}
311+
312+
impl<'a, P: SWCurveConfig> Sub<&'a Projective<P>> for Affine<P> {
313+
type Output = Projective<P>;
314+
fn sub(self, other: &'a Projective<P>) -> Projective<P> {
315+
*other - self
316+
}
317+
}
318+
304319
impl<P: SWCurveConfig> Default for Affine<P> {
305320
#[inline]
306321
fn default() -> Self {

ec/src/models/short_weierstrass/group.rs

+1
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ use ark_std::{
1717

1818
use ark_ff::{fields::Field, AdditiveGroup, PrimeField, ToConstraintField, UniformRand};
1919

20+
use derivative::Derivative;
2021
use zeroize::Zeroize;
2122

2223
#[cfg(feature = "parallel")]

ec/src/models/twisted_edwards/affine.rs

+15
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ use ark_std::{
1212
},
1313
vec::Vec,
1414
};
15+
use derivative::Derivative;
1516
use num_traits::{One, Zero};
1617
use zeroize::Zeroize;
1718

@@ -251,6 +252,20 @@ impl<P: TECurveConfig, T: Borrow<Self>> Sub<T> for Affine<P> {
251252
}
252253
}
253254

255+
impl<P: TECurveConfig> Sub<Projective<P>> for Affine<P> {
256+
type Output = Projective<P>;
257+
fn sub(self, other: Projective<P>) -> Projective<P> {
258+
other - self
259+
}
260+
}
261+
262+
impl<'a, P: TECurveConfig> Sub<&'a Projective<P>> for Affine<P> {
263+
type Output = Projective<P>;
264+
fn sub(self, other: &'a Projective<P>) -> Projective<P> {
265+
*other - self
266+
}
267+
}
268+
254269
impl<P: TECurveConfig> Default for Affine<P> {
255270
#[inline]
256271
fn default() -> Self {

ec/src/models/twisted_edwards/group.rs

+1
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ use ark_std::{
1717

1818
use ark_ff::{fields::Field, AdditiveGroup, PrimeField, ToConstraintField, UniformRand};
1919

20+
use derivative::Derivative;
2021
use zeroize::Zeroize;
2122

2223
#[cfg(feature = "parallel")]

ec/src/pairing.rs

+1
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ use ark_std::{
1414
vec::Vec,
1515
UniformRand, Zero,
1616
};
17+
use derivative::Derivative;
1718
use zeroize::Zeroize;
1819

1920
use crate::{AffineRepr, CurveGroup, PrimeGroup, VariableBaseMSM};

ec/src/scalar_mul/variable_base/mod.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
use ark_ff::{prelude::*, PrimeField};
2-
use ark_std::{borrow::Borrow, iterable::Iterable, vec::Vec};
2+
use ark_std::{borrow::Borrow, cfg_into_iter, iterable::Iterable, vec::Vec};
33

44
#[cfg(feature = "parallel")]
55
use rayon::prelude::*;

0 commit comments

Comments
 (0)