From b965c58ac1e939d41d66e6c3946552b54db7e53e Mon Sep 17 00:00:00 2001 From: Sean Bowe Date: Sun, 9 Jul 2017 21:11:29 -0600 Subject: [PATCH] For performance, don't double/square until we've seen a bit. --- src/bls12_381/ec.rs | 8 +++++++- src/lib.rs | 9 ++++++++- 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/src/bls12_381/ec.rs b/src/bls12_381/ec.rs index 4f0daf9..8195002 100644 --- a/src/bls12_381/ec.rs +++ b/src/bls12_381/ec.rs @@ -475,9 +475,15 @@ macro_rules! curve_impl { fn mul_assign::Repr>>(&mut self, other: S) { let mut res = Self::zero(); + let mut found_one = false; + for i in BitIterator::new(other.into()) { - res.double(); + if found_one { + res.double(); + } else { + found_one = i; + } if i { res.add_assign(self); diff --git a/src/lib.rs b/src/lib.rs index ebdfa73..0affbbf 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -219,8 +219,15 @@ pub trait Field: Sized + { let mut res = Self::one(); + let mut found_one = false; + for i in BitIterator::new(exp) { - res.square(); + if found_one { + res.square(); + } else { + found_one = i; + } + if i { res.mul_assign(self); }