Skip to content

Commit 37d93c8

Browse files
committed
Optimize Edwards to Montgomery conversion
1 parent ccfa042 commit 37d93c8

File tree

1 file changed

+11
-5
lines changed

1 file changed

+11
-5
lines changed

ed448-goldilocks/src/edwards/affine.rs

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -122,13 +122,19 @@ impl AffinePoint {
122122
/// Convert this point to [`MontgomeryPoint`]
123123
// See https://www.rfc-editor.org/rfc/rfc7748#section-4.2 4-isogeny maps
124124
pub fn to_montgomery(&self) -> MontgomeryPoint {
125-
let x_sq = self.x.square();
126-
let y_sq = self.y.square();
127-
128125
// u = y^2/x^2
129-
let u = y_sq * x_sq.invert();
130126
// v = (2 - x^2 - y^2)*y/x^3)
131-
let v = ((FieldElement::TWO - x_sq - y_sq) * self.y) * (x_sq * self.x).invert();
127+
128+
// Optimized to one inversion:
129+
// x_inv = x^-1
130+
// t = y * x_inv
131+
// u = t^2
132+
// v = (2x_inv^2 - 1 - u) * t
133+
let x_inv = self.x.invert();
134+
let t = self.y * x_inv;
135+
136+
let u = t.square();
137+
let v = (x_inv.square().double() - FieldElement::ONE - u) * t;
132138

133139
MontgomeryPoint::conditional_select(
134140
&MontgomeryPoint::new(u, v),

0 commit comments

Comments
 (0)