diff --git a/src/fields/fp.rs b/src/fields/fp.rs index 3264cba..b5f886d 100644 --- a/src/fields/fp.rs +++ b/src/fields/fp.rs @@ -275,8 +275,12 @@ impl Fp { /// Doubles this field element. #[inline] pub const fn double(&self) -> Fp { - // TODO: This can be achieved more efficiently with a bitshift. - self.add(self) + let d0 = self.0[0] << 1; + let d1 = self.0[1] << 1 | self.0[0] >> 63; + let d2 = self.0[2] << 1 | self.0[1] >> 63; + let d3 = self.0[3] << 1 | self.0[2] >> 63; + + (&Fp([d0, d1, d2, d3])).sub(&MODULUS) } fn from_u512(limbs: [u64; 8]) -> Fp { diff --git a/src/fields/fq.rs b/src/fields/fq.rs index 8177fa4..212044a 100644 --- a/src/fields/fq.rs +++ b/src/fields/fq.rs @@ -275,8 +275,12 @@ impl Fq { /// Doubles this field element. #[inline] pub const fn double(&self) -> Fq { - // TODO: This can be achieved more efficiently with a bitshift. - self.add(self) + let d0 = self.0[0] << 1; + let d1 = self.0[1] << 1 | self.0[0] >> 63; + let d2 = self.0[2] << 1 | self.0[1] >> 63; + let d3 = self.0[3] << 1 | self.0[2] >> 63; + + (&Fq([d0, d1, d2, d3])).sub(&MODULUS) } fn from_u512(limbs: [u64; 8]) -> Fq {